ボード生成とモード切り替え
プレイヤーごとにどのスコアボードを持たせるかを決め、必要に応じて作り直します。サイドバーが消える系の不具合はここから見ます。
Score Manager に関する管理・集約処理を担当します。
com.example.rankingpluginScoreManager.javaclassクラス直前の Javadoc は見つかりませんでした。ソースとメソッド構成から責務を補完しています。
ランキングサイドバーの集約器で、通常ランキング、ギルド、シーズン、ビンゴ、スロット、防御値など複数表示モードの切り替えと更新周期を一手に担っています。
ScoreManagerstartsetupBoardsetupGuildBoardsetupSeasonBoardgetDesiredSidebarModeensureSidebarModebuildRankingSnapshotupdateRankingSectionupdateBottomSectiondoMonthlyRolloverプレイヤーごとにどのスコアボードを持たせるかを決め、必要に応じて作り直します。サイドバーが消える系の不具合はここから見ます。
DB/サービスから取り出した順位情報を scoreboard の行数制限に収まる形へ整えます。表示ラベル縮約もここで行います。
自己順位だけでなく、防御値、シールド、スロット、ビンゴ木進捗など、ランキング外の補助情報をまとめて更新します。
ワールド移動、リスポーン、装備変更など表示の再構築が必要なイベントに追随します。見た目崩れの再現条件はここを通ることが多いです。
月替わりボーナスや lastMonth 保存など、継続運用に必要な暦処理をここが持っています。
onPlayerJoinensureSidebarModepostRebuildRefresh参加直後はまず表示モードに応じたボードを用意し、その後に補助行を順次埋めます。初回だけ欠ける表示はこの流れで見つかります。
重い集計を毎プレイヤーで繰り返さないよう、まず閲覧者を絞り、スナップショットを組み立ててから配布します。負荷最適化の要点です。
scheduleEquipResyncrecomputeReducePercentIntupdateDefLine装備変更イベントは瞬間的にインベントリ状態が安定しないため、少し遅らせて再計算する前提になっています。即時計算へ戻すと数値ずれが出やすいです。
サーバ再起動をまたいでも lastMonth を見て追いつく構成です。月次報酬や表示リセットを触るときはこの一連をセットで見ます。
このクラス内で直接見つかる主な Web ルート/項目名です。
SQL 文字列から抽出できた主要テーブルです。スキーマ変更時の確認用です。
| Signature | 説明 | 主要呼び出し |
|---|---|---|
public ScoreManager(JavaPlugin plugin, ScoreService service, AdvancementTracker tracker, RewardService rewardService, OnlineStatusService onlineStatusService, BingoDataService bingoDataService, SlotManager slotManager, CurrencyService currencyService, ShieldManager shieldManager, AnimaTreeEngine animaTree, SeasonService seasonService, GuildService guildService, LevelingService levelingService, SidebarPrefs sidebarPrefs) | 依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。 | loadLastMonthOrNow → forName → getServer → getServicesManager → getRegistration → getProvider |
| Name | Visibility | Kind | 説明 |
|---|---|---|---|
| isFantasiaWorld | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| forceRebuildSidebar | private | メソッド | Force rebuild & resend sidebar scoreboard (dimension-change/respawn safe). |
| postRebuildRefresh | private | メソッド | After rebuild, refresh all lines (rank/self/def/bingo/slot) without relying on long-interval tasks. |
| forceUpdateSlotLine | private | メソッド | Force update SLOT line for one player (used right after rebuild). |
| ensurePlayerHasCachedBoard | private | メソッド | Ensure the player is actually using our cached board (if sidebar is enabled). |
| trim64 | private | メソッド | trim64 の主要処理を担当します。 |
| treeGap | private | メソッド | treeGap の主要処理を担当します。 |
| safeIntForScoreboard | private | メソッド | safeIntForScoreboard の主要処理を担当します。 |
| filterMcid | private | メソッド | filterMcid の主要処理を担当します。 |
| filterMcidEntries | private | メソッド | filterMcidEntries の主要処理を担当します。 |
| buildRankingSnapshot | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| ScoreManager | public | コンストラクタ | 依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。 |
| updateDefLine | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| recomputeReducePercentInt | private | メソッド | recomputeReducePercentInt の主要処理を担当します。 |
| scheduleEquipResync | private | メソッド | scheduleEquipResync の主要処理を担当します。 |
| onShieldChange | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| isArmorPiece | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| onInvClick | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onInvDrag | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onInteract | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| initShieldCache | private | メソッド | 初期化と各種登録を行い、機能を有効化します。 |
| onJoinShieldInit | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onRespawnShieldInit | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onItemBreak | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| isSidebarEnabled | public | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| setSidebarEnabled | public | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| inEventWorld | private | メソッド | inEventWorld の主要処理を担当します。 |
| onWorldChange | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onRespawnSidebar | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| isSidebarVisible | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| applySidebarVisibility | public | メソッド | 実際に可視状態を適用する(ON なら構築→更新 / OFF ならクリア) |
| isSeasonSidebarActive | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| getDesiredSidebarMode | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| ensureSidebarMode | private | メソッド | 開催状態とプレイヤー設定を見て、必要ならサイドバーのレイアウトだけ切替(中身は別メソッドで更新) |
| updateSelfLine | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| onPlayerJoin | public | イベント処理 | プレイヤー参加時に1度だけボードを組み立て+初回更新 |
| getBingoManager | public | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| setupGuildBoard | private | メソッド | 初期化と各種登録を行い、機能を有効化します。 |
| bar | private | メソッド | bar の主要処理を担当します。 |
| updateGuildBoard | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| ensureGuildBoardLines | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| setupBoard | public | メソッド | 初回組み立て:Objective+Team+初期 Score を設定 |
| scheduleMonthlyRollover | private | メソッド | scheduleMonthlyRollover の主要処理を担当します。 |
| loadLastMonthOrNow | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| saveLastMonth | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| getRankingTopForBonus | public | メソッド | 毎日0:00の集計など、負荷を抑えて外部から「現在のランキングTOP」を取得したい用途向け。 |
| start | public | メソッド | 初期化と各種登録を行い、機能を有効化します。 |
| doMonthlyRollover | private | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| handleStartupMonthBoundary | private | メソッド | 入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。 |
| updateLevelLine | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| onPlayerQuit | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| updateAll | public | メソッド | 上段+下段をまとめて更新(ランキング用のときだけ) |
| currentTopDisplayPhase | private | メソッド | currentTopDisplayPhase の主要処理を担当します。 |
| isServerIdWindow | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| pickDisplayServerId | private | メソッド | pickDisplayServerId の主要処理を担当します。 |
| abbreviateSidebarLabel | private | メソッド | abbreviateSidebarLabel の主要処理を担当します。 |
| buildRankingDisplayLabel | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| updateRankingSection | private | メソッド | 上段:ランキングのみ差分更新 |
| updateRankingAsBingo5x5 | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| refreshTopOnly | public | メソッド | refreshTopOnly の主要処理を担当します。 |
| updateBottomSection | private | メソッド | 下段:BINGO+SLOTのみ差分更新(ランキングボードのときだけ) |
| invalidateTreeCache | public | メソッド | invalidateTreeCache の主要処理を担当します。 |
| refreshBingoAndTreeNow | public | メソッド | refreshBingoAndTreeNow の主要処理を担当します。 |
| refreshBingoAndTreeNowSync | private | メソッド | refreshBingoAndTreeNowSync の主要処理を担当します。 |
| updateBottomAccurate | public | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| tryOneShotBackfill | private | メソッド | tryOneShotBackfill の主要処理を担当します。 |
| reset5x5ForNextEvent | public | メソッド | reset5x5ForNextEvent の主要処理を担当します。 |
| refreshSidebarNow | public | メソッド | コマンド等から即時切替を要求する |
| setupSeasonBoard | private | メソッド | Season Journey 用のObjective/Teamを構築(行数はconfigに合わせて可変) |
| updateSeasonBoard | private | メソッド | Season Journey サイドバー更新(configのtitle/linesを置換して反映) |
| renderLine | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| stop | public | メソッド | 動作中の処理やリソースを安全に停止・解放します。 |
private static boolean isFantasiaWorld(Player p)条件判定を行い、後続処理の分岐に使える真偽値を返します。
Player pなし
private void forceRebuildSidebar(Player p)Force rebuild & resend sidebar scoreboard (dimension-change/respawn safe).
Player pなし
private void postRebuildRefresh(Player p)After rebuild, refresh all lines (rank/self/def/bingo/slot) without relying on long-interval tasks.
Player pなし
private void forceUpdateSlotLine(Player p)Force update SLOT line for one player (used right after rebuild).
Player pなし
private void ensurePlayerHasCachedBoard(Player p)Ensure the player is actually using our cached board (if sidebar is enabled).
Player pなし
private static String trim64(String s)trim64 の主要処理を担当します。
String sなし
private static String treeGap()treeGap の主要処理を担当します。
なし
private static int safeIntForScoreboard(long v)safeIntForScoreboard の主要処理を担当します。
long vなし
private Map<String, Long> filterMcid(Map<String, Long> src)filterMcid の主要処理を担当します。
Map<String, Long> srcなし
private List<Map.Entry<String, Long>> filterMcidEntries(List<Map.Entry<String, Long>> src)filterMcidEntries の主要処理を担当します。
List<Map.Entry<String, Long>> srcなし
private RankingSnapshot buildRankingSnapshot(int topLimit)表示用または出力用のデータを組み立てます。
int topLimitなし
public ScoreManager(JavaPlugin plugin, ScoreService service, AdvancementTracker tracker, RewardService rewardService, OnlineStatusService onlineStatusService, BingoDataService bingoDataService, SlotManager slotManager, CurrencyService currencyService, ShieldManager shieldManager, AnimaTreeEngine animaTree, SeasonService seasonService, GuildService guildService, LevelingService levelingService, SidebarPrefs sidebarPrefs)依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
JavaPlugin pluginScoreService serviceAdvancementTracker trackerRewardService rewardServiceOnlineStatusService onlineStatusServiceBingoDataService bingoDataServiceSlotManager slotManagerCurrencyService currencyServiceShieldManager shieldManagerAnimaTreeEngine animaTreeSeasonService seasonServiceGuildService guildServiceLevelingService levelingServiceSidebarPrefs sidebarPrefsなし
private void updateDefLine(Player p)状態を永続化または更新し、最新状態へ反映します。
Player pなし
private int recomputeReducePercentInt(Player p)recomputeReducePercentInt の主要処理を担当します。
Player pなし
private void scheduleEquipResync(Player p)scheduleEquipResync の主要処理を担当します。
Player pなし
public void onShieldChange(com.example.rankingplugin.combat.ShieldChangeEvent e)イベント発生時の分岐と後続処理を担当します。
com.example.rankingplugin.combat.ShieldChangeEvent eなし
private boolean isArmorPiece(org.bukkit.inventory.ItemStack it)条件判定を行い、後続処理の分岐に使える真偽値を返します。
org.bukkit.inventory.ItemStack itなし
public void onInvClick(org.bukkit.event.inventory.InventoryClickEvent e)イベント発生時の分岐と後続処理を担当します。
org.bukkit.event.inventory.InventoryClickEvent eなし
public void onInvDrag(org.bukkit.event.inventory.InventoryDragEvent e)イベント発生時の分岐と後続処理を担当します。
org.bukkit.event.inventory.InventoryDragEvent eなし
public void onInteract(org.bukkit.event.player.PlayerInteractEvent e)イベント発生時の分岐と後続処理を担当します。
org.bukkit.event.player.PlayerInteractEvent eなし
private void initShieldCache(Player p)初期化と各種登録を行い、機能を有効化します。
Player pなし
public void onJoinShieldInit(org.bukkit.event.player.PlayerJoinEvent e)イベント発生時の分岐と後続処理を担当します。
org.bukkit.event.player.PlayerJoinEvent eなし
public void onRespawnShieldInit(org.bukkit.event.player.PlayerRespawnEvent e)イベント発生時の分岐と後続処理を担当します。
org.bukkit.event.player.PlayerRespawnEvent eなし
public void onItemBreak(org.bukkit.event.player.PlayerItemBreakEvent e)イベント発生時の分岐と後続処理を担当します。
org.bukkit.event.player.PlayerItemBreakEvent eなし
public boolean isSidebarEnabled(UUID id)条件判定を行い、後続処理の分岐に使える真偽値を返します。
UUID idなし
public void setSidebarEnabled(Player p, boolean enabled)DB への問い合わせまたは更新処理を担当します。
Player pboolean enabledなし
private static boolean inEventWorld(Player p)inEventWorld の主要処理を担当します。
Player pなし
public void onWorldChange(PlayerChangedWorldEvent e)イベント発生時の分岐と後続処理を担当します。
PlayerChangedWorldEvent eなし
public void onRespawnSidebar(org.bukkit.event.player.PlayerRespawnEvent e)イベント発生時の分岐と後続処理を担当します。
org.bukkit.event.player.PlayerRespawnEvent eなし
private boolean isSidebarVisible(Player p)条件判定を行い、後続処理の分岐に使える真偽値を返します。
Player pなし
public void applySidebarVisibility(Player p, boolean visible)実際に可視状態を適用する(ON なら構築→更新 / OFF ならクリア)
Player pboolean visibleなし
private boolean isSeasonSidebarActive(Player p)条件判定を行い、後続処理の分岐に使える真偽値を返します。
Player pなし
private SidebarMode getDesiredSidebarMode(Player p)必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
Player pなし
private void ensureSidebarMode(Player p)開催状態とプレイヤー設定を見て、必要ならサイドバーのレイアウトだけ切替(中身は別メソッドで更新)
Player pなし
private void updateSelfLine(Player p)状態を永続化または更新し、最新状態へ反映します。
Player pなし
public void onPlayerJoin(PlayerJoinEvent e)プレイヤー参加時に1度だけボードを組み立て+初回更新
PlayerJoinEvent eなし
public BingoManager getBingoManager(UUID playerId)必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
UUID playerIdなし
private void setupGuildBoard(Player p)初期化と各種登録を行い、機能を有効化します。
Player pなし
private String bar(long cur, long max, int w)bar の主要処理を担当します。
long curlong maxint wなし
private void updateGuildBoard(Player p)状態を永続化または更新し、最新状態へ反映します。
Player pなし
private void ensureGuildBoardLines(Player p, int lines)必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
Player pint linesなし
public void setupBoard(Player p)初回組み立て:Objective+Team+初期 Score を設定
Player pなし
private void scheduleMonthlyRollover()scheduleMonthlyRollover の主要処理を担当します。
なし
private YearMonth loadLastMonthOrNow()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private void saveLastMonth()状態を永続化または更新し、最新状態へ反映します。
なし
public List<Map.Entry<String, Long>> getRankingTopForBonus(int limit)毎日0:00の集計など、負荷を抑えて外部から「現在のランキングTOP」を取得したい用途向け。
int limitなし
public void start()初期化と各種登録を行い、機能を有効化します。
なし
private void doMonthlyRollover(YearMonth newMonth)DB への問い合わせまたは更新処理を担当します。
YearMonth newMonthなし
private void handleStartupMonthBoundary(YearMonth nowJst)入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。
YearMonth nowJstなし
private void updateLevelLine(Player p)状態を永続化または更新し、最新状態へ反映します。
Player pなし
public void onPlayerQuit(PlayerQuitEvent e)イベント発生時の分岐と後続処理を担当します。
PlayerQuitEvent eなし
public void updateAll(Player p)上段+下段をまとめて更新(ランキング用のときだけ)
Player pなし
private long currentTopDisplayPhase()currentTopDisplayPhase の主要処理を担当します。
なし
private boolean isServerIdWindow()条件判定を行い、後続処理の分岐に使える真偽値を返します。
なし
private String pickDisplayServerId(String playerName)pickDisplayServerId の主要処理を担当します。
String playerNameなし
private String abbreviateSidebarLabel(String text, int maxLen)abbreviateSidebarLabel の主要処理を担当します。
String textint maxLenなし
private String buildRankingDisplayLabel(int rankIndex, String playerName, ChatColor col, boolean isSelf)表示用または出力用のデータを組み立てます。
int rankIndexString playerNameChatColor colboolean isSelfなし
private void updateRankingSection(Player p, List<Map.Entry<String,Long>> topList)上段:ランキングのみ差分更新
Player pList<Map.Entry<String,Long>> topListなし
private void updateRankingAsBingo5x5(Player p)状態を永続化または更新し、最新状態へ反映します。
Player pなし
public void refreshTopOnly(Player p)refreshTopOnly の主要処理を担当します。
Player pなし
private void updateBottomSection(Player p, int rank, long score)下段:BINGO+SLOTのみ差分更新(ランキングボードのときだけ)
Player pint ranklong scoreなし
public void invalidateTreeCache(Player p)invalidateTreeCache の主要処理を担当します。
Player pなし
public void refreshBingoAndTreeNow(Player p)refreshBingoAndTreeNow の主要処理を担当します。
Player pなし
private void refreshBingoAndTreeNowSync(Player p)refreshBingoAndTreeNowSync の主要処理を担当します。
Player pなし
public void updateBottomAccurate(Player p)状態を永続化または更新し、最新状態へ反映します。
Player pなし
private void tryOneShotBackfill()tryOneShotBackfill の主要処理を担当します。
なし
public void reset5x5ForNextEvent()reset5x5ForNextEvent の主要処理を担当します。
なし
public void refreshSidebarNow(Player p)コマンド等から即時切替を要求する
Player pなし
private void setupSeasonBoard(Player p)Season Journey 用のObjective/Teamを構築(行数はconfigに合わせて可変)
Player pなし
private void updateSeasonBoard(Player p)Season Journey サイドバー更新(configのtitle/linesを置換して反映)
Player pなし
private static String renderLine(String template, Map<String,String> ph)表示用または出力用のデータを組み立てます。
String templateMap<String,String> phなし
public void stop()動作中の処理やリソースを安全に停止・解放します。
なし
ScoreManager → loadLastMonthOrNow → forName → getServer → getServicesManager → getRegistrationonPlayerJoin → getPlayer → inEventWorld → setScoreboard → getScoreboardManager → getNewScoreboardonRespawnSidebar → getPlayer → getScheduler → runTaskLater → isOnline → inEventWorldonWorldChange → getPlayer → getScheduler → runTaskLater → isOnline → inEventWorldonInvClick → getWhoClicked → getSlotType → getClick → isShiftClick → isArmorPieceonShieldChange → getPlayerId → getCur → getMax → getPlayer → isOnline