Fantasia と現世のインベントリ/ゲームモードを安全にスワップするサービス。

13Fields
1Constructors
32Methods
670Lines
Package
com.example.rankingplugin.fantasy
Source
fantasy/FantasyReturnService.java
Kind
class
Roles
イベント駆動非同期 / スケジューラサービス層
このクラスにも章立て解説を追加しています。 自動抽出の一覧だけでなく、下の『重点クラスの詳細解説』で読む順番・内部サブシステム・変更時の注意点まで追えます。 全クラス章立てガイドを見る

クラス説明

Fantasia と現世のインベントリ/ゲームモードを安全にスワップするサービス。

重要な修正点:
- Fantasia滞在中の「現世側インベントリ(outside)」を必ずディスクへ永続化し、再起動後も /fantasy back で復元できる
- ログアウト時に outside を削除しない(Fantasia滞在中に再起動しても戻れる)
- outside が無い場合は絶対に外へ出さない(戻った瞬間に空になったように見える事故を防ぐ)

責務と見どころ

重点クラスの詳細解説

Fantasia と現世のインベントリ/ゲームモードを安全にスワップするサービス。fantasy パッケージの中でも 670 行規模の中核クラスで、運用中の主ループ・スケジューラが一か所に集まっています。中規模クラス群の中では変更影響が広く、章立てで読む価値が高いため重点解説へ追加しています。

最初に追う読む順番

  1. FantasyReturnService
    依存オブジェクトと初期状態を束ね、このクラスが担当するランタイムの前提を固めます。
  2. loadInsideSnapshot
    実体や対象状態を作る段階で、後続フローがどのデータを前提に動くかを掴めます。
  3. loadOutsideData
    実体や対象状態を作る段階で、後続フローがどのデータを前提に動くかを掴めます。
  4. onWorldChange
    運用中の中心ループです。イベント受理から状態更新までの主経路を追えます。
  5. onStep
    運用中の中心ループです。イベント受理から状態更新までの主経路を追えます。
  6. onQuit
    運用中の中心ループです。イベント受理から状態更新までの主経路を追えます。
  7. applySnapshotOrClear
    結果を反映・永続化する境界です。表示だけ直って保存が壊れる系の切り分けに向きます。
  8. applyTeleportSafety
    結果を反映・永続化する境界です。表示だけ直って保存が壊れる系の切り分けに向きます。
  9. applyOutsideDataNow
    結果を反映・永続化する境界です。表示だけ直って保存が壊れる系の切り分けに向きます。

内部サブシステムの地図

運用中の主ループ

イベント受理、定期監視、判定、進行更新など、実際に挙動を生む中心ロジックです。

主なメソッド
主なフィールド

代表フロー詳解

変更時の注意点

フィールド

VisibilityTypeName役割
publicStringMETA_SWAPMETA_SWAP の状態を保持します。
privatePluginpluginプラグイン本体参照です。
privateLocationreturnPadreturnPad の状態を保持します。
privateStringFANTASIAFANTASIA の状態を保持します。
privateStringARENAARENA の状態を保持します。
privateMap<UUID, InvSnapshot>outsideCacheキャッシュまたは直近計算結果を保持します。
privateMap<UUID, GameMode>outsideModeoutsideMode の状態を保持します。
privateMap<UUID, Location>returnPointreturnPoint の状態を保持します。
privateFileinvDirinvDir の状態を保持します。
privateFileoutsideDiroutsideDir の状態を保持します。
privateFileoutsideRecoveryDiroutsideRecoveryDir の状態を保持します。
privateNamespacedKeyKEY_FANTASIA_ONLYKEY_FANTASIA_ONLY の状態を保持します。
privateMap<UUID, Long>worldChangeDebounceMsworldChangeDebounceMs の状態を保持します。

コンストラクタ / 初期化

Signature説明主要呼び出し
public FantasyReturnService(Plugin plugin, Location returnPad)依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。getDataFolder → exists → mkdirs → getPluginManager → registerEvents

メソッド索引

NameVisibilityKind説明
FantasyReturnServicepublicコンストラクタ依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
getReturnPadpublicメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
isFantasiaGroupprivateメソッド条件判定を行い、後続処理の分岐に使える真偽値を返します。
markSwapprivateメソッドmarkSwap の主要処理を担当します。
unlockSwapLaterprivateメソッドunlockSwapLater の主要処理を担当します。
fileprivateメソッドfile の主要処理を担当します。
outsideFileprivateメソッドoutsideFile の主要処理を担当します。
outsideRecoveryFileprivateメソッドoutsideRecoveryFile の主要処理を担当します。
castListprivateメソッドcastList の主要処理を担当します。
applySnapshotOrClearprivateメソッドapplySnapshotOrClear の主要処理を担当します。
saveInsideSnapshotprivateメソッド状態を永続化または更新し、最新状態へ反映します。
loadInsideSnapshotprivateメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
saveOutsideSnapshotprivateメソッド状態を永続化または更新し、最新状態へ反映します。
saveOutsideSnapshotToprivateメソッド状態を永続化または更新し、最新状態へ反映します。
loadOutsideDataprivateメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
deleteOutsideFileprivateメソッド対象データや登録状態を削除・解除します。
scheduleDeleteOutsideFileprivateメソッドscheduleDeleteOutsideFile の主要処理を担当します。
safeOutsideFallbackprivateメソッドsafeOutsideFallback の主要処理を担当します。
applyTeleportSafetyprivateメソッドapplyTeleportSafety の主要処理を担当します。
updateOutsideSnapshotFromCurrentprivateメソッド状態を永続化または更新し、最新状態へ反映します。
applyOutsideDataNowprivateメソッドapplyOutsideDataNow の主要処理を担当します。
scheduleOutsideReapplyprivateメソッドscheduleOutsideReapply の主要処理を担当します。
enterFantasiaNoTppublicメソッドすでにワールドが Fantasia に変わった後に呼ばれる想定(InventoryGuardから呼ばれる) - outside を保存 - inside をロードして適用
leaveFantasiaNoTppublicメソッドすでにワールドが Fantasia 外に変わった後に呼ばれる想定(InventoryGuardから呼ばれる) - inside を保存 - outside を復元
teleportToFantasiapublicメソッド/fantasy 等から Fantasiaへ安全に入る(戻り地点を必ず保存する)
teleportBackpublicメソッドFantasiaから現世へ戻す(outsideが無い場合は絶対に外へ出さない)
onWorldChangepublicイベント処理イベント発生時の分岐と後続処理を担当します。
onSteppublicイベント処理returnPad を踏んだら帰還(存在する構造に依存するので「同一ブロックにいるか」だけ判定)
onQuitpublicイベント処理Fantasia滞在中にログアウトしても outside を消さない。
isFantasiaOnlyprivateメソッド条件判定を行い、後続処理の分岐に使える真偽値を返します。
markFantasiaOnlyprivateメソッドmarkFantasiaOnly の主要処理を担当します。
purgeFantasiaItemsprivateメソッドpurgeFantasiaItems の主要処理を担当します。

メソッド詳細

FantasyReturnService

コンストラクタpublic
public FantasyReturnService(Plugin plugin, Location returnPad)

依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。

引数

throws

なし

主要な呼び出し順

getDataFolderexistsmkdirsgetPluginManagerregisterEvents

getReturnPad

メソッドpublic
public Location getReturnPad()

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

目立つ内部呼び出しは抽出されませんでした。

isFantasiaGroup

メソッドprivate
private boolean isFantasiaGroup(World w)

条件判定を行い、後続処理の分岐に使える真偽値を返します。

引数

throws

なし

主要な呼び出し順

getNameequals

markSwap

メソッドprivate
private void markSwap(Player p, boolean on)

markSwap の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

setMetadataremoveMetadata

unlockSwapLater

メソッドprivate
private void unlockSwapLater(Player p, long delayTicks)

unlockSwapLater の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

getSchedulerrunTaskLatermarkSwapmax

file

メソッドprivate
private File file(UUID id)

file の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

toString

outsideFile

メソッドprivate
private File outsideFile(UUID id)

outsideFile の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

toString

outsideRecoveryFile

メソッドprivate
private File outsideRecoveryFile(UUID id)

outsideRecoveryFile の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

toString

castList

メソッドprivatestatic
private static List<ItemStack> castList(List<?> raw)

castList の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

emptyList

applySnapshotOrClear

メソッドprivatestatic
private static void applySnapshotOrClear(PlayerInventory inv, InvSnapshot snap)

applySnapshotOrClear の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

clearsetArmorContentssetExtraContentsapplyTo

saveInsideSnapshot

メソッドprivate
private void saveInsideSnapshot(UUID id, InvSnapshot snap)

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

asListsavefilegetLoggerlog

loadInsideSnapshot

メソッドprivate
private InvSnapshot loadInsideSnapshot(UUID id)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

fileexistsloadConfigurationcastListgetListfromListsgetLoggerlog

saveOutsideSnapshot

メソッドprivate
private void saveOutsideSnapshot(UUID id, InvSnapshot snap, GameMode mode, Location ret)

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

saveOutsideSnapshotTooutsideFileoutsideRecoveryFile

saveOutsideSnapshotTo

メソッドprivate
private void saveOutsideSnapshotTo(UUID id, File target, InvSnapshot snap, GameMode mode, Location ret, String label)

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

asListnamegetWorldgetNamegetXgetYgetZgetYaw

loadOutsideData

メソッドprivate
private OutsideData loadOutsideData(UUID id)

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

outsideFileoutsideRecoveryFileexistsloadConfigurationcastListgetListfromListsgetString

deleteOutsideFile

メソッドprivate
private void deleteOutsideFile(UUID id)

対象データや登録状態を削除・解除します。

引数

throws

なし

主要な呼び出し順

outsideFileexistsdelete

scheduleDeleteOutsideFile

メソッドprivate
private void scheduleDeleteOutsideFile(UUID id, long delayTicks)

scheduleDeleteOutsideFile の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

getSchedulerrunTaskLaterdeleteOutsideFilemax

safeOutsideFallback

メソッドprivate
private Location safeOutsideFallback(Player p)

safeOutsideFallback の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

getBedSpawnLocationgetWorldisFantasiaGroupgetSpawnLocationgetWorldsgetEnvironmentequalsgetName

applyTeleportSafety

メソッドprivate
private void applyTeleportSafety(Player p)

applyTeleportSafety の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

setFallDistanceaddPotionEffect

updateOutsideSnapshotFromCurrent

メソッドprivate
private void updateOutsideSnapshotFromCurrent(Player p, Location rpOverride)

状態を永続化または更新し、最新状態へ反映します。

引数

throws

なし

主要な呼び出し順

getUniqueIdgetInventorygetGameModegetWorldisFantasiaGroupsafeOutsideFallbacksaveOutsideSnapshot

applyOutsideDataNow

メソッドprivate
private void applyOutsideDataNow(Player p, OutsideData od)

applyOutsideDataNow の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

applySnapshotOrCleargetInventorysetGameMode

scheduleOutsideReapply

メソッドprivate
private void scheduleOutsideReapply(Player p, OutsideData od, long delayTicks)

scheduleOutsideReapply の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

getSchedulerrunTaskLaterisOnlineisFantasiaGroupgetWorldapplyOutsideDataNowmax

enterFantasiaNoTp

メソッドpublic
public void enterFantasiaNoTp(Player p)

すでにワールドが Fantasia に変わった後に呼ばれる想定(InventoryGuardから呼ばれる) - outside を保存 - inside をロードして適用

引数

throws

なし

主要な呼び出し順

getUniqueIdgetWorldisFantasiaGroupsafeOutsideFallbackupdateOutsideSnapshotFromCurrentmarkSwaploadInsideSnapshotapplySnapshotOrClear

leaveFantasiaNoTp

メソッドpublic
public void leaveFantasiaNoTp(Player p)

すでにワールドが Fantasia 外に変わった後に呼ばれる想定(InventoryGuardから呼ばれる) - inside を保存 - outside を復元

引数

throws

なし

主要な呼び出し順

getUniqueIdsaveInsideSnapshotgetInventoryloadOutsideDatagetLoggerwarninggetNamemarkSwap

teleportToFantasia

メソッドpublic
public void teleportToFantasia(Player p, Location to)

/fantasy 等から Fantasiaへ安全に入る(戻り地点を必ず保存する)

引数

throws

なし

主要な呼び出し順

getUniqueIdgetLocationgetWorldisFantasiaGroupmarkSwapteleportgetSchedulerrunTaskLater

teleportBack

メソッドpublic
public boolean teleportBack(Player p)

Fantasiaから現世へ戻す(outsideが無い場合は絶対に外へ出さない)

引数

throws

なし

主要な呼び出し順

isFantasiaGroupgetWorldgetUniqueIdloadOutsideDatagetLoggerwarninggetNamesendMessage

onWorldChange

イベント処理public
public void onWorldChange(PlayerChangedWorldEvent e)

イベント発生時の分岐と後続処理を担当します。

引数

throws

なし

主要な呼び出し順

getPlayerhasMetadatagetUniqueIdcurrentTimeMillisgetFromgetWorldisFantasiaGroupenterFantasiaNoTp

onStep

イベント処理public
public void onStep(PlayerInteractEvent e)

returnPad を踏んだら帰還(存在する構造に依存するので「同一ブロックにいるか」だけ判定)

引数

throws

なし

主要な呼び出し順

getPlayerisFantasiaGroupgetWorldhasMetadatagetNameequalsgetLocationgetBlockX

onQuit

イベント処理public
public void onQuit(PlayerQuitEvent e)

Fantasia滞在中にログアウトしても outside を消さない。

引数

throws

なし

主要な呼び出し順

getPlayergetUniqueIdisFantasiaGroupgetWorldsaveInsideSnapshotgetInventorysaveOutsideSnapshotremove

isFantasiaOnly

メソッドprivate
private boolean isFantasiaOnly(ItemStack it)

条件判定を行い、後続処理の分岐に使える真偽値を返します。

引数

throws

なし

主要な呼び出し順

hasItemMetagetItemMetagetPersistentDataContainer

markFantasiaOnly

メソッドprivate
private void markFantasiaOnly(ItemStack it)

markFantasiaOnly の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

hasItemMetagetItemMetagetPersistentDataContainersetItemMeta

purgeFantasiaItems

メソッドprivate
private void purgeFantasiaItems(PlayerInventory inv)

purgeFantasiaItems の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

getContentsisFantasiaOnlysetContentsgetArmorContentssetArmorContents

代表的な処理フロー

  1. 初期化フロー
    FantasyReturnService → getDataFolder → exists → mkdirs → getPluginManager → registerEvents
    依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
  2. onQuit フロー
    onQuit → getPlayer → getUniqueId → isFantasiaGroup → getWorld → saveInsideSnapshot
    Fantasia滞在中にログアウトしても outside を消さない。
  3. onStep フロー
    onStep → getPlayer → isFantasiaGroup → getWorld → hasMetadata → getName
    returnPad を踏んだら帰還(存在する構造に依存するので「同一ブロックにいるか」だけ判定)
  4. onWorldChange フロー
    onWorldChange → getPlayer → hasMetadata → getUniqueId → currentTimeMillis → getFrom
    イベント発生時の分岐と後続処理を担当します。
  5. loadInsideSnapshot フロー
    loadInsideSnapshot → file → exists → loadConfiguration → castList → getList
    必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
  6. loadOutsideData フロー
    loadOutsideData → outsideFile → outsideRecoveryFile → exists → loadConfiguration → castList
    必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

外部との接点

Web ルート

このクラス内に目立つ Web ルート定義は見つかりませんでした。

SQL / テーブル

テーブル名の抽出はありませんでした。

関連クラス

補足