-
Notifications
You must be signed in to change notification settings - Fork 36
/
Menu.scala
49 lines (42 loc) · 1.5 KB
/
Menu.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.github.unchama.menuinventory
import cats.data
import cats.effect.IO
import com.github.unchama.minecraft.actions.OnMinecraftServerThread
import com.github.unchama.targetedeffect.TargetedEffect
import org.bukkit.entity.Player
/**
* 「メニュー」のtrait.
*
* このtraitを実装するオブジェクトは, インベントリ上で展開される意味づけされたUIの情報を持っている. これらのUIをメニューインベントリ, または単にメニューと呼ぶこととする.
*/
trait Menu {
/**
* メニューを開く操作に必要な環境情報の型。 例えば、メニューが利用するAPIなどをここを通して渡すことができる。
*/
type Environment
/**
* メニューのサイズとタイトルに関する情報
*/
val frame: MenuFrame
/**
* @return
* `player`からメニューの[[MenuSlotLayout]]を計算する[[IO]]
*/
def computeMenuLayout(player: Player)(implicit environment: Environment): IO[MenuSlotLayout]
/**
* メニューを[Player]に開かせる[TargetedEffect].
*/
def open(
implicit environment: Environment,
ctx: LayoutPreparationContext,
onMainThread: OnMinecraftServerThread[IO]
): TargetedEffect[Player] = data.Kleisli { player =>
for {
session <- MenuSession.createNewSessionWith[IO](frame)
_ <- session.openInventory.run(player)
_ <- IO.shift(ctx)
layout <- computeMenuLayout(player)
_ <- session.overwriteViewWith(layout)
} yield ()
}
}