Войти или зарегистрироваться

.

Статус
Закрыто для дальнейших ответов.
И еще, как правильно выяснить время суток?
Правилен такой код, или же не совсем точен?
JavaScript:
public static TimeOfDay getTimeOfDay(World world) {
        Long time = world.getTime();
        if (time >= 2000 && time <= 10000) return TimeOfDay.DAY;
        if (time >= 10000 && time <= 13000) return TimeOfDay.EVENING;
        if (time >= 13000 && time <= 22000) return TimeOfDay.NIGHT;
        if (time >= 22000 && time <= 2000) return TimeOfDay.MORNING;
        return null;
    }
 
Можно сделать костыльно - брать блок под игроком и проверять его свет. Правда, упираться будет в блоки, которые сами являются источником света.
 
Ээ... Как-т слишком костыльн...
Насколько я знаю, существует некий диапазон света от 0 до 14. Только солнечный свет может дать 14. Свет других блоков даёт от 13 и меньше. Остаётся брать блок игрока (я бы не стал брать блок на котором стоит игрок, я бы делал так - player.getLocation().getBlock().add(0, 2, 0); что вернёт нам блок на уровне головы игрока.) Дальше можно просто брать освещённость этого блока и если = 14 - поджигать игрока. Опять же, с освещением работал всего один раз, могу ошибаться.
 
И он бывает только от 6000 до 12000 суточных тиков.
Так и думал что вы меня поправите. Хм... и каким тогда образом можно определить - от солнца этот свет, или от факела / лампы / любого другого светящегося предмета?
 
Так и думал что вы меня поправите. Хм... и каким тогда образом можно определить - от солнца этот свет, или от факела / лампы / любого другого светящегося предмета?
Да хрен его знает.
 
Хм, поправьте меня если я не правильно вас обоих понял,
получается самый яркий солнечный свет (14) бывает только с 6000 до 12000 суточных тиков,
тогда, я могу считать именно этот промежуток "днем" и только в этот промежуток времени проверять, надо ли игроку гореть, и если освещенность блока = 14 то сжигать игрока.. А собственно как получить освещение блока?
Например тут:
player.getLocation().getBlock().add(0, 2, 0);
Это должно вернуть блок воздуха (ведь это блок на уровне головы, т.е. кроме воздуха там ничего быть не может), и как мне получить освещенность(и можно ли это вообще сделать для блока воздуха(и можно ли вообще блок воздуха считать блоком? XD))?
 
Хм, поправьте меня если я не правильно вас обоих понял,
получается самый яркий солнечный свет (14) бывает только с 6000 до 12000 суточных тиков,
тогда, я могу считать именно этот промежуток "днем" и только в этот промежуток времени проверять, надо ли игроку гореть, и если освещенность блока = 14 то сжигать игрока.. А собственно как получить освещение блока?
Например тут:

Это должно вернуть блок воздуха (ведь это блок на уровне головы, т.е. кроме воздуха там ничего быть не может), и как мне получить освещенность(и можно ли это вообще сделать для блока воздуха(и можно ли вообще блок воздуха считать блоком? XD))?
Готов вас удивить - блок воздуха является блоком и даже может иметь метадату. Получить свет от блока воздуха не так уж и сложно:
Java:
   Block block = player.getWorld().getLocation().getBlock().add(0, 2, 0);
   BlockFace block_face = block.getBlockFace(BlockFace.UP);
   int level = block_face.getLightLevel();
Как всегда без IDE, поэтому могут быть ошибки. Скорее всего у метода blockFace нельзя взять lightLevel.
Также могут быть грамматические ошибки в названии методов / ошибки синтаксиса.
 
Последнее редактирование:
Готов вас удивить, но блок воздуха является блоком и даже может иметь метадату. Получить свет от блока воздуха не так уж и сложно:
Java:
   Block block = player.getWorld().getLocation().getBlock().add(0, 2, 0).getFace(BlockFace.UP);
    int level = block.getLightLevel();
Как всегда без IDE, поэтому могут быть ошибки.
Я удивлен :D
Почему-то всегда думал что блока воздуха как такового не существует - просто пустое место..
Буду знать, благодарю))
Пока-что буду тестировать, отпишусь как проверю все)
В общем, проверка на солнце работает как надо, но теперь я пытаюсь выяснить как правильно получить время суток...
Итак, сутки в майне = 20 минут = 20*60(секунд)*20(тиков) = 24000 тиков.
День = 10 минут = 10*60(секунд)*20(тиков) = 12000 тиков.
Вечер = 1,5 минут = 1.5*60(секунд)*20(тиков) = 1800 тиков.
Ночь = 7 минут = 7*60(секунд)*20(тиков) = 8400 тиков.
Утро = 1,5 минут = 1.5*60(секунд)*20(тиков) = 1800.
День начинается с 0 тиков, т.е. сразу с 0, значит сначало идет день 0-12000, потом идет вечер 12000-13800, потом идет ночь 13800-22200, потом идет утро 22200-24000...

Я все правильно сказал, или где-то я не прав?
Стоп... Я понял свою ошибку... Я просто пытался этим же методом выяснить светит ли на игрока солнце утром и вечером XD
Думаю это почти невозможно, поэтому оставлю горение только днем)
И он бывает только от 6000 до 12000 суточных тиков.
Вот возникает вопрос только тут...
Разве я ошибся в расчета выше? Разве не от 0 до 12000 суточных тиков? Или я не правильно понял систему отсчета тиков в майне?
 
Я удивлен :D
Почему-то всегда думал что блока воздуха как такового не существует - просто пустое место..
Буду знать, благодарю))
Пока-что буду тестировать, отпишусь как проверю все)
В общем, проверка на солнце работает как надо, но теперь я пытаюсь выяснить как правильно получить время суток...
Итак, сутки в майне = 20 минут = 20*60(секунд)*20(тиков) = 24000 тиков.
День = 10 минут = 10*60(секунд)*20(тиков) = 12000 тиков.
Вечер = 1,5 минут = 1.5*60(секунд)*20(тиков) = 1800 тиков.
Ночь = 7 минут = 7*60(секунд)*20(тиков) = 8400 тиков.
Утро = 1,5 минут = 1.5*60(секунд)*20(тиков) = 1800.
День начинается с 0 тиков, т.е. сразу с 0, значит сначало идет день 0-12000, потом идет вечер 12000-13800, потом идет ночь 13800-22200, потом идет утро 22200-24000...

Я все правильно сказал, или где-то я не прав?
Стоп... Я понял свою ошибку... Я просто пытался этим же методом выяснить светит ли на игрока солнце утром и вечером XD
Думаю это почти невозможно, поэтому оставлю горение только днем)

Вот возникает вопрос только тут...
Разве я ошибся в расчета выше? Разве не от 0 до 12000 суточных тиков? Или я не правильно понял систему отсчета тиков в майне?
Дело в том, что в твоём методе (смотришь день сейчас или нет и если день вызывать горение) игрок будет гореть даже в зданиях и под землёй. Тогда нужно смотреть освещение блоков и если <10 тушить игрока. Также если игрок <120 (ну или со скольки там море начинается) блоков по y -> тушить игрока. Но опять же - это теория. На практике нужно проводить огромное количество тестов.
 
Дело в том, что в твоём методе (смотришь день сейчас или нет и если день вызывать горение) игрок будет гореть даже в зданиях и под землёй. Тогда нужно смотреть освещение блоков и если <10 тушить игрока. Также если игрок <120 (ну или со скольки там море начинается) блоков по y -> тушить игрока. Но опять же - это теория. На практике нужно проводить огромное количество тестов.
Я решил не запариваться, сделал вот так, вроде все работает как надо)
Код:
public static boolean needDayBurn(Player player) {
        if (player.getInventory().getHelmet() != null) return false;
        if (player.getGameMode() == GameMode.CREATIVE) return false;
        Block block1 = player.getLocation().add(0, 1, 0).getBlock();
        if (block1.getType() == Material.WATER || block1.getType() == Material.STATIONARY_WATER) return false;
        Block block = player.getLocation().getBlock();
        if (block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER) return false;
        return block1.getLightLevel() >= 14;
    }
Код:
public void addEffects() {
        for (Player p : Bukkit.getOnlinePlayers()) {
            try {
                if (!GoodAPI.isOnAuth(p)) {
                    ServerFile playerFile = ServerFile.getInstance(p.getUniqueId().toString(), ServerFile.ServerFileType.PLAYER);
                    if (playerFile.isSet("RACE")) {
                        Biome biome = p.getLocation().getWorld().getBiome((int) p.getLocation().getX(), (int) p.getLocation().getZ());
                        Race race = Race.valueOf(playerFile.getString("RACE"));
                        if (race.getBiome().toString().equals(biome.toString()))
                            for (PotionEffect effect : race.getEffects()) p.addPotionEffect(effect);
                        if (race.burnAtDay() && GoodAPI.needDayBurn(p)) {
                            p.setFireTicks(23);
                            p.removePotionEffect(PotionEffectType.WEAKNESS);
                            p.removePotionEffect(PotionEffectType.SLOW);
                            p.removePotionEffect(PotionEffectType.BLINDNESS);
                            p.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 63, 1), true);
                            p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 63, 2), true);
                            p.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 63, 3), true);
                        }

                    }
                }
            } catch (Exception e) {
                Main.standardCatchException(e, p);
            }
        }
    }
Код:
public void activate() {
        Bukkit.getScheduler().runTaskTimer(Main.JP, this::addEffects, 20L, 20L);
    }

То-есть я решил вообще не проверять время суток, а проверять освещение, ведь освещение 14 может быть только от солнца :D
 
Так есть же по-моему block.getSunLightLevel() (я не помню точное название, но **я буду - видел где-то, инфа сотка)

А можно сравнить высоту игрока с наивысшим блоком (тоже ищи функцию). Если блок ВЫШЕ игрока и не прозрачный - не поджигаем игрока
 
Есть какой то метод, который говорит, видит ли этот блок небо или нет. Вот его и можно юзать.
Так есть же по-моему block.getSunLightLevel() (я не помню точное название, но **я буду - видел где-то, инфа сотка)

А можно сравнить высоту игрока с наивысшим блоком (тоже ищи функцию). Если блок ВЫШЕ игрока и не прозрачный - не поджигаем игрока
Да мне в принципе вполне подходит вариант поджигать игрока чекая освещение блока на уровне его головы...
Если 14 - поджигать, если нет - значит он не под солнцем!
 
Да мне в принципе вполне подходит вариант поджигать игрока чекая освещение блока на уровне его головы...
Если 14 - поджигать, если нет - значит он не под солнцем!
Тебе посоветовали более точные методы :)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх