Сборки серверов

СливПлатные

Сейчас онлайн

  • timverhovniy
  • TheSashaDev
  • Arisu
  • f0ster333
  • 1XXGGHD1
  • Encourage
  • Тимур
  • Leniumtv
  • Liberton
  • limitedf1x
  • rrrw
  • kekstm989
  • Nameless58
  • sepersi
  • costy925
  • Stas12345
  • Bradyaha
  • bobrilo
  • savenx
  • azharifarid
  • CheesySpigot
  • PuzyroC
  • wugwidhwd
  • hopeWEx1255
  • rauharu
  • Avey
  • Lizard
  • 1050TI_top
  • 1mb1r4ck
  • DozzAA
  • andzen4ik
  • Artemmdfas
  • Danila
  • e2rwrwre
  • kiyye
  • Norsek
  • xiaozhi2048
  • GGFantomKiller
  • Tqreas
  • hasashito
  • Alex101010
  • VitalyPlay
  • KirillLegend
  • MARATIQW
  • OstadSmp
  • t0rpedv
  • dedcoder123
  • toshan
  • ItsZadiac
  • Charli
  • sudocj
  • stanosten
  • maxim123
  • Flezit
  • lexa232
  • ghieldbeef
  • rfedgweyh
  • Valys
  • mizzie71
  • rudefacekid
  • NewWayStudio
  • Bernievn001
  • MrKreenze
  • MilfXanter
  • akapluggg
  • l0calh0s1
  • 432432
  • tokeno
  • KITARU
  • maks1ch_v_bane
  • oatminecraft
  • Howertt
  • denisrad4
  • Kasiak
  • Dejvidos
  • Tarekizor
  • RazWars
  • rotelyfars
  • k1nzar0
  • derevnya987
  • Sosiskaa
  • skylone
  • sicuncat
  • blackflame_st
  • weolet
  • Sima
  • klezmixzz
  • Vvdmkk
  • vv1ntis
  • San4ez_YT123
  • 123123asd
  • fpsAron
  • Nhder
  • ruslantuzz
...и ещё 3.

Создание расширения PlaceholderAPI на вывод времени мира и значение времени суток

Радмир
Народ, кто компилит, может ли кто создать данное расширение PlaceholderAPI, используя код, который будет написан ниже?

После создания и установки появятся следующие плейсхолдеры:

• %mytime_time% - Выведет время в формате "HH:mm".
• %mytime_daytime% - Выведет текст: "Утро", "День", "Вечер" или "Ночь", в зависимости от времени суток. (Названия и диапазоны времени в config.yml можно настроить под предпочтения.)

Код, который был сгенерирован по ТЗ

Код:
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;

import java.time.LocalTime;

public class MyTimeExpansion extends PlaceholderExpansion {

    @Override
    public String getIdentifier() {
        return "mytime";
    }

    @Override
    public String getAuthor() {
        return "Your Name";
    }

    @Override
    public String getVersion() {
        return "1.0.0";
    }

    @Override
    public String onRequest(OfflinePlayer player, String params) {
        if (player == null || !player.isOnline()) {
            return null;
        }

        Player onlinePlayer = player.getPlayer();
        World world = onlinePlayer.getWorld();
        long worldTime = world.getTime();
        LocalTime localTime = LocalTime.ofSecondOfDay(worldTime);

         if (params.equalsIgnoreCase("time")) {
            return String.format("%02d:%02d", localTime.getHour(), localTime.getMinute());
        } else if (params.equalsIgnoreCase("daytime")) {
              return getDayTimeText(worldTime);
        }

        return null;
    }


    private String getDayTimeText(long worldTime) {
      
        FileConfiguration config = getPlaceholderAPI().getConfig();

        long morningStart = config.getLong("time_ranges.morning.start", 0);
        long morningEnd = config.getLong("time_ranges.morning.end", 6000);
        long dayStart = config.getLong("time_ranges.day.start", 6000);
        long dayEnd = config.getLong("time_ranges.day.end", 12000);
        long eveningStart = config.getLong("time_ranges.evening.start", 12000);
        long eveningEnd = config.getLong("time_ranges.evening.end", 18000);
        
         // Нормализация worldTime, чтобы учесть циклы в 24000 тиков.
         long normalizedTime = worldTime % 24000;

        if (normalizedTime >= morningStart && normalizedTime < morningEnd) {
            return config.getString("time_names.morning", "Утро");
        } else if (normalizedTime >= dayStart && normalizedTime < dayEnd) {
            return config.getString("time_names.day", "День");
        } else if (normalizedTime >= eveningStart && normalizedTime < eveningEnd) {
            return config.getString("time_names.evening", "Вечер");
        } else {
            return config.getString("time_names.night", "Ночь");
        }
    }
}

Объяснение кода:

• getIdentifier(), getAuthor(), getVersion(): Стандартные методы для расширения PlaceholderAPI.
• onRequest(OfflinePlayer player, String params): Основной метод, который обрабатывает плейсхолдеры.
• Получает мир игрока (onlinePlayer.getWorld()).
• Получает время мира (world.getTime()).
• Конвертирует время мира в LocalTime для удобного форматирования.
• Если параметр params равен "time", возвращает время в формате "HH:mm".
• Если параметр params равен "daytime", вызывает метод getDayTimeText() для получения текстового описания времени суток.
• getDayTimeText(long worldTime): Этот метод выполняет основную логику:
• Получает доступ к конфигурации PlaceholderAPI (getPlaceholderAPI().getConfig()).
• Читает значения диапазонов времени и соответствующие им названия из config.yml. Эти пути и значения должны быть добавлены в ваш config.yml. (см. пример ниже)
• Определяет, к какому периоду суток относится текущее время мира.
• Возвращает соответствующее название времени суток.

Пример config.yml (для PlaceholderAPI):

Добавьте следующие настройки в файл plugins/PlaceholderAPI/config.yml (или создайте, если его нет), внутри секции config:

Код:
config:
  # ... другие настройки ...
  time_ranges:
    morning:
      start: 0
      end: 6000
    day:
      start: 6000
      end: 12000
    evening:
      start: 12000
      end: 18000
  time_names:
    morning: "Утро"
    day: "День"
    evening: "Вечер"
    night: "Ночь"
 
oleg142
Клац
Кидаешь в /plugins/PlaceholderAPI/expansions, в config.yml в конце дописываешь
Код:
time_ranges:
  morning:
    start: 0
    end: 6000
  day:
    start: 6000
    end: 12000
  evening:
    start: 12000
    end: 18000
time_names:
  morning: "Утро"
  day: "День"
  evening: "Вечер"
  night: "Ночь"
 
Радмир
@oleg142, благодарю.
Протестировал.. время суток криво определяет, хотя, казалось бы, чего тут сложного, косяк в коде (ожидать от IA можно)
а вот с временем суток вполне даже.
Единственное, я настройки поменял так, по мне это более правильно (сдвинуть на 3 часа)

Код:
  time_ranges:
    morning:
      start: 3000
      end: 9000
    day:
      start: 9000
      end: 15000
    evening:
      start: 15000
      end: 21000
 
Радмир
@oleg142, напрасно я вообще время мира включил, есть же такой %world_time_{world} - он корректно работает.

а времена суток надо было как в майнкрафт принято, с промежуточными типами, как в команде /time set %

и тогда код бы был

Код:
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import net.md_5.bungee.api.ChatColor;

public class MyTimeExpansion extends PlaceholderExpansion {

    @Override
    public String getIdentifier() {
        return "mytime";
    }

    @Override
    public String getAuthor() {
        return "Your Name";
    }

    @Override
    public String getVersion() {
        return "1.0.0";
    }

    @Override
    public String onRequest(OfflinePlayer player, String params) {
        if (player == null || !player.isOnline()) {
            return null;
        }

        Player onlinePlayer = player.getPlayer();
        World world = onlinePlayer.getWorld();
        long worldTime = world.getTime();

       if (params.equalsIgnoreCase("daytime")) {
            return getDayTimeText(worldTime);
        }
        return null;
    }

    private String getDayTimeText(long worldTime) {
        FileConfiguration config = getPlaceholderAPI().getConfig();

        long dawnStart = config.getLong("time_ranges.dawn.start", 0);
        long dawnEnd = config.getLong("time_ranges.dawn.end", 2000);
        long morningStart = config.getLong("time_ranges.morning.start", 2000);
        long morningEnd = config.getLong("time_ranges.morning.end", 6000);
         long noonStart = config.getLong("time_ranges.noon.start", 6000);
        long noonEnd = config.getLong("time_ranges.noon.end", 10000);
        long afternoonStart = config.getLong("time_ranges.afternoon.start", 10000);
        long afternoonEnd = config.getLong("time_ranges.afternoon.end", 14000);
        long sunsetStart = config.getLong("time_ranges.sunset.start", 14000);
        long sunsetEnd = config.getLong("time_ranges.sunset.end", 18000);
        long nightStart = config.getLong("time_ranges.night.start", 18000);
         long nightEnd = config.getLong("time_ranges.night.end", 22000);
         long midnightStart = config.getLong("time_ranges.midnight.start", 22000);
         long midnightEnd = config.getLong("time_ranges.midnight.end", 24000);

        // Нормализация worldTime
        long normalizedTime = worldTime % 24000;

       if (normalizedTime >= dawnStart && normalizedTime < dawnEnd) {
          return translateColorCodes(config.getString("time_names.dawn", "Рассвет"));
        } else if (normalizedTime >= morningStart && normalizedTime < morningEnd) {
            return translateColorCodes(config.getString("time_names.morning", "Утро"));
        } else if (normalizedTime >= noonStart && normalizedTime < noonEnd) {
           return translateColorCodes(config.getString("time_names.noon", "Полдень"));
        } else if (normalizedTime >= afternoonStart && normalizedTime < afternoonEnd) {
           return translateColorCodes(config.getString("time_names.afternoon", "После полудня"));
         } else if (normalizedTime >= sunsetStart && normalizedTime < sunsetEnd) {
            return translateColorCodes(config.getString("time_names.sunset", "Закат"));
        } else if (normalizedTime >= nightStart && normalizedTime < nightEnd) {
            return translateColorCodes(config.getString("time_names.night", "Ночь"));
         }else if(normalizedTime >= midnightStart && normalizedTime < midnightEnd){
             return translateColorCodes(config.getString("time_names.midnight", "Полночь"));
        } else {
            return ChatColor.GRAY + "Неизвестно";
        }
    }

    private String translateColorCodes(String text) {
      return ChatColor.translateAlternateColorCodes('&', text);
    }
}

и в настройках уже было бы
Код:
config:
  time_ranges:
    dawn:
      start: 0
      end: 2000
    morning:
      start: 2000
      end: 6000
     noon:
      start: 6000
      end: 10000
    afternoon:
      start: 10000
      end: 14000
    sunset:
      start: 14000
      end: 18000
    night:
      start: 18000
      end: 22000
    midnight:
      start: 22000
      end: 24000
  time_names:
    dawn: "<color:#FF9999>Рассвет"
    morning: "<color:#FFCCFF>Утро"
    noon: "<color:#FF3366>Полдень"
    afternoon: "<color:#CC3333>После полудня"
    sunset: "<color:#CC6633>Закат"
    night: "<color:#6600FF>Ночь"
    midnight: "<color:#666666>Полночь"
 
Радмир
@oleg142, если не сложно. Я пока еще сам не пробовал плагины кампилить. Вот сейчас хотел было скачать - а minecraft development не скачивается (ограничили же).
Потом можно тут выложить на BM за твоим авторством.
 
Радмир
@oleg142, да, пучком, только настройки поменял на

Код:
  time_ranges:
    dawn:
      start: 3000
      end: 5000
    morning:
      start: 5000
      end: 10000
     noon:
      start: 10000
      end: 14000
    afternoon:
      start: 14000
      end: 19000
    sunset:
      start: 19000
      end: 23000
    night:   
      start: 1000
      end: 3000
    midnight:
      start: 23000
      end: 1000
  time_names:
    dawn: "Рассвет"
    morning: "Утро"
    noon: "День"
    afternoon: "После полудня"
    sunset: "Закат"
    night: "Ночь"
    midnight: "Полночь"

2024 12 30 142321
 
ВерхНиз