001package com.ericlam.mc.minigames.core.manager;
002
003import com.ericlam.mc.minigames.core.character.GamePlayer;
004import org.bukkit.Location;
005import org.bukkit.entity.Player;
006
007import java.util.Collection;
008import java.util.List;
009import java.util.function.Consumer;
010
011/**
012 * 遊戲內工具類
013 */
014public interface GameUtils {
015
016    /**
017     * 根據秒數獲取 時間顯示文字: x 時 x 分 x秒
018     *
019     * @param sec 秒
020     * @return 時間顯示文字
021     */
022    String getTimeWithUnit(long sec);
023
024    /**
025     * 根據秒數獲取 時間顯示格式: 00:00
026     *
027     * @param sec 秒
028     * @return 時間顯示格式: 00:00
029     */
030    String getTimer(long sec);
031
032    /**
033     * 播放聲效
034     * <ul>
035     *     <li>[0] 為聲效(可自定義)</li>
036     *     <li>[1] 為 pitch</li>
037     *     <li>[2] 為 volume</li>
038     * </ul>
039     *
040     * @param player      玩家
041     * @param soundString 聲音文字,格式如上
042     */
043    void playSound(Player player, String[] soundString);
044
045    /**
046     * 逐步循環操作
047     *
048     * @param collection 集合物件
049     * @param task       對每個物件的迭代處理
050     * @param period     每次處理間隔
051     * @param <T>        物件形態
052     */
053    <T> void unLagIterate(Collection<T> collection, Consumer<T> task, long period);
054
055    /**
056     * 逐步循環傳送
057     *
058     * @param gamePlayers 遊戲玩家列表
059     * @param locations   傳送位置列表
060     * @param period      每次傳送間隔
061     */
062    void noLagTeleport(List<GamePlayer> gamePlayers, List<Location> locations, long period);
063
064    /**
065     * 逐步循環傳送
066     *
067     * @param gamePlayers 遊戲玩家列表
068     * @param period      傳送位置列表
069     * @param locations   每次傳送間隔
070     */
071    void noLagTeleport(List<GamePlayer> gamePlayers, long period, Location... locations);
072}