-
Notifications
You must be signed in to change notification settings - Fork 36
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: マナが無くなったら掘れなくするパッシブスキルを追加 #2370
base: 1_18
Are you sure you want to change the base?
Changes from all commits
1fc70ab
09a17d6
924113e
9f45f42
e7c7cd3
6725736
c043e8d
f1e0599
66d94e1
acb3cf8
9753a7a
05c80c1
d79bad1
ad5b883
02c9368
ae8d4c2
914bf47
eaec16e
df86061
5d5bcd0
a4451d0
38c29da
7b3c3c7
a10401e
1680ffe
95d772f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
USE seichiassist; | ||
|
||
CREATE TABLE player_break_suppression_preference( | ||
uuid CHAR(36) NOT NULL, | ||
do_break_suppression_due_to_mana BOOL NOT NULL DEFAULT FALSE, | ||
PRIMARY KEY (uuid), | ||
CONSTRAINT fk_player_break_suppression_preference_uuid FOREIGN KEY (uuid) REFERENCES playerdata(uuid) | ||
); |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -13,6 +13,8 @@ import com.github.unchama.seichiassist.menus.stickmenu.FirstPage | |||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.breakcount.BreakCountAPI | ||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.breakskilltargetconfig.BreakSkillTargetConfigAPI | ||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.breakskilltargetconfig.domain.BreakSkillTargetConfigKey | ||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.breaksuppressionpreference.BreakSuppressionPreferenceAPI | ||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.breaksuppressionpreference.domain.BreakSuppressionPreference | ||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.playerheadskin.PlayerHeadSkinAPI | ||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.targetedeffect._ | ||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.targetedeffect.commandsender.MessageEffect | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -34,6 +36,7 @@ object PassiveSkillMenu extends Menu { | |||||||||||||||||||||||||||||||||||||||||||||
class Environment( | ||||||||||||||||||||||||||||||||||||||||||||||
implicit val breakCountApi: BreakCountAPI[IO, SyncIO, Player], | ||||||||||||||||||||||||||||||||||||||||||||||
implicit val breakSkillTargetConfigAPI: BreakSkillTargetConfigAPI[IO, Player], | ||||||||||||||||||||||||||||||||||||||||||||||
implicit val breakSuppressionPreferenceAPI: BreakSuppressionPreferenceAPI[IO, Player], | ||||||||||||||||||||||||||||||||||||||||||||||
val ioCanOpenFirstPage: IO CanOpen FirstPage.type, | ||||||||||||||||||||||||||||||||||||||||||||||
implicit val playerHeadSkinAPI: PlayerHeadSkinAPI[IO, Player] | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -62,6 +65,7 @@ object PassiveSkillMenu extends Menu { | |||||||||||||||||||||||||||||||||||||||||||||
val dynamicPartComputation = List( | ||||||||||||||||||||||||||||||||||||||||||||||
ChestSlotRef(0, 0) -> computeToggleMultipleBlockTypeDestructionButton, | ||||||||||||||||||||||||||||||||||||||||||||||
ChestSlotRef(0, 1) -> computeToggleChestBreakButton, | ||||||||||||||||||||||||||||||||||||||||||||||
ChestSlotRef(0, 2) -> computeToggleManaFullyConsumedBreakStopButton, | ||||||||||||||||||||||||||||||||||||||||||||||
ChestSlotRef(1, 0) -> computeGiganticBerserkButton, | ||||||||||||||||||||||||||||||||||||||||||||||
ChestSlotRef(1, 1) -> computeToggleNetherQuartzBlockButton | ||||||||||||||||||||||||||||||||||||||||||||||
).traverse(_.sequence) | ||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -231,6 +235,47 @@ object PassiveSkillMenu extends Menu { | |||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
val computeToggleManaFullyConsumedBreakStopButton: IO[Button] = RecomputedButton(for { | ||||||||||||||||||||||||||||||||||||||||||||||
originalBreakStopConfig <- breakSuppressionPreferenceAPI.isBreakSuppressionEnabled(player) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+239
to
+240
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
} yield { | ||||||||||||||||||||||||||||||||||||||||||||||
val baseLore = List(s"${YELLOW}マナ切れでブロック破壊を止めるスキル") | ||||||||||||||||||||||||||||||||||||||||||||||
val statusLore = if (originalBreakStopConfig) { | ||||||||||||||||||||||||||||||||||||||||||||||
List(s"${GREEN}ON (マナが切れるとブロック破壊を止めます。)", s"${DARK_RED}クリックでOFF") | ||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||
List(s"${RED}OFF (マナが切れてもブロック破壊を続けます。)", s"${DARK_GREEN}クリックでON") | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
Button( | ||||||||||||||||||||||||||||||||||||||||||||||
new IconItemStackBuilder(Material.LAPIS_LAZULI) | ||||||||||||||||||||||||||||||||||||||||||||||
.tap { builder => | ||||||||||||||||||||||||||||||||||||||||||||||
if (originalBreakStopConfig) | ||||||||||||||||||||||||||||||||||||||||||||||
builder.enchanted() | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
.title(s"$WHITE$UNDERLINE${BOLD}マナ切れでブロック破壊を止めるスキル切り替え") | ||||||||||||||||||||||||||||||||||||||||||||||
.lore(baseLore ++ statusLore) | ||||||||||||||||||||||||||||||||||||||||||||||
.build(), | ||||||||||||||||||||||||||||||||||||||||||||||
LeftClickButtonEffect { | ||||||||||||||||||||||||||||||||||||||||||||||
SequentialEffect( | ||||||||||||||||||||||||||||||||||||||||||||||
breakSuppressionPreferenceAPI.toggleBreakSuppression, | ||||||||||||||||||||||||||||||||||||||||||||||
DeferredEffect(IO { | ||||||||||||||||||||||||||||||||||||||||||||||
if (!originalBreakStopConfig) { | ||||||||||||||||||||||||||||||||||||||||||||||
SequentialEffect( | ||||||||||||||||||||||||||||||||||||||||||||||
MessageEffect(s"${GREEN}マナが切れたらブロック破壊を止めるスキルを有効化しました。"), | ||||||||||||||||||||||||||||||||||||||||||||||
FocusedSoundEffect(Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1f, 1f) | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||
SequentialEffect( | ||||||||||||||||||||||||||||||||||||||||||||||
MessageEffect(s"${RED}マナが切れたらブロック破壊を止めるスキルを無効化しました。"), | ||||||||||||||||||||||||||||||||||||||||||||||
FocusedSoundEffect(Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1f, 0.5f) | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+262
to
+272
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 以下のように書いたほうが、より読みやすくなると思います
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||
val computeGiganticBerserkButton: IO[Button] = RecomputedButton { | ||||||||||||||||||||||||||||||||||||||||||||||
environment | ||||||||||||||||||||||||||||||||||||||||||||||
.breakCountApi | ||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package com.github.unchama.seichiassist.subsystems.breaksuppressionpreference | ||
|
||
import cats.data.Kleisli | ||
|
||
trait BreakSuppressionPreferenceAPI[F[_], Player] { | ||
|
||
/** | ||
* @return 破壊抑制の設定をトグルする作用 | ||
*/ | ||
def toggleBreakSuppression: Kleisli[F, Player, Unit] | ||
|
||
/** | ||
* @return 現在の破壊抑制の設定を取得する作用 | ||
*/ | ||
def isBreakSuppressionEnabled(player: Player): F[Boolean] | ||
|
||
} | ||
|
||
object BreakSkillTriggerConfigAPI { | ||
|
||
def apply[F[_], Player]( | ||
implicit ev: BreakSuppressionPreferenceAPI[F, Player] | ||
): BreakSuppressionPreferenceAPI[F, Player] = ev | ||
|
||
} |
Original file line number | Diff line number | Diff line change | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,62 @@ | ||||||||||||
package com.github.unchama.seichiassist.subsystems.breaksuppressionpreference | ||||||||||||
|
||||||||||||
import cats.data.Kleisli | ||||||||||||
import cats.effect.SyncEffect | ||||||||||||
import com.github.unchama.datarepository.bukkit.player.BukkitRepositoryControls | ||||||||||||
import com.github.unchama.generic.ContextCoercion | ||||||||||||
import com.github.unchama.seichiassist.meta.subsystem.Subsystem | ||||||||||||
import com.github.unchama.seichiassist.subsystems.breaksuppressionpreference.application.repository.BreakSuppressionPreferenceRepositoryDefinition | ||||||||||||
import com.github.unchama.seichiassist.subsystems.breaksuppressionpreference.domain.{ | ||||||||||||
BreakSuppressionPreference, | ||||||||||||
BreakSuppressionPreferencePersistence | ||||||||||||
} | ||||||||||||
import com.github.unchama.seichiassist.subsystems.breaksuppressionpreference.persistence.JdbcBreakSuppressionPreferencePersistence | ||||||||||||
import org.bukkit.entity.Player | ||||||||||||
|
||||||||||||
trait System[F[_], Player] extends Subsystem[F] { | ||||||||||||
val api: BreakSuppressionPreferenceAPI[F, Player] | ||||||||||||
} | ||||||||||||
|
||||||||||||
object System { | ||||||||||||
|
||||||||||||
import cats.implicits._ | ||||||||||||
|
||||||||||||
def wired[F[_], G[_]: SyncEffect: ContextCoercion[*[_], F]]: G[System[F, Player]] = { | ||||||||||||
implicit val breakSuppressionPreferencePersistence | ||||||||||||
: BreakSuppressionPreferencePersistence[G] = | ||||||||||||
new JdbcBreakSuppressionPreferencePersistence[G] | ||||||||||||
|
||||||||||||
for { | ||||||||||||
breakSuppressionPreferenceRepositoryControls <- BukkitRepositoryControls.createHandles( | ||||||||||||
BreakSuppressionPreferenceRepositoryDefinition.withContext[G, Player] | ||||||||||||
) | ||||||||||||
} yield { | ||||||||||||
val breakSuppressionPreferenceRepository = | ||||||||||||
breakSuppressionPreferenceRepositoryControls.repository | ||||||||||||
|
||||||||||||
new System[F, Player] { | ||||||||||||
override val api: BreakSuppressionPreferenceAPI[F, Player] = | ||||||||||||
new BreakSuppressionPreferenceAPI[F, Player] { | ||||||||||||
override def toggleBreakSuppression: Kleisli[F, Player, Unit] = | ||||||||||||
Kleisli { player => | ||||||||||||
ContextCoercion( | ||||||||||||
breakSuppressionPreferenceRepository(player).update(pref => | ||||||||||||
pref.copy(doBreakSuppression = !pref.doBreakSuppression) | ||||||||||||
) | ||||||||||||
Comment on lines
+43
to
+45
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||
) | ||||||||||||
} | ||||||||||||
|
||||||||||||
override def isBreakSuppressionEnabled(player: Player): F[Boolean] = | ||||||||||||
ContextCoercion( | ||||||||||||
breakSuppressionPreferenceRepository(player).get.map(_.doBreakSuppression) | ||||||||||||
) | ||||||||||||
} | ||||||||||||
|
||||||||||||
override val managedRepositoryControls: Seq[BukkitRepositoryControls[F, _]] = Seq( | ||||||||||||
breakSuppressionPreferenceRepositoryControls.coerceFinalizationContextTo[F] | ||||||||||||
) | ||||||||||||
} | ||||||||||||
} | ||||||||||||
} | ||||||||||||
|
||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,23 @@ | ||||||
package com.github.unchama.seichiassist.subsystems.breaksuppressionpreference.application.repository | ||||||
|
||||||
import cats.effect.Sync | ||||||
import cats.effect.concurrent.Ref | ||||||
import com.github.unchama.datarepository.definitions.RefDictBackedRepositoryDefinition | ||||||
import com.github.unchama.datarepository.template.RepositoryDefinition | ||||||
import com.github.unchama.seichiassist.subsystems.breaksuppressionpreference.domain.{ | ||||||
BreakSuppressionPreference, | ||||||
BreakSuppressionPreferencePersistence | ||||||
} | ||||||
|
||||||
object BreakSuppressionPreferenceRepositoryDefinition { | ||||||
|
||||||
def withContext[F[_]: Sync, Player]( | ||||||
implicit persistence: BreakSuppressionPreferencePersistence[F] | ||||||
): RepositoryDefinition[F, Player, Ref[F, BreakSuppressionPreference]] = | ||||||
RefDictBackedRepositoryDefinition | ||||||
.usingUuidRefDict[F, Player, BreakSuppressionPreference](persistence)( | ||||||
BreakSuppressionPreference(doBreakSuppression = false) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ここは Repository に保存する場合の初期値を示していますが、
Suggested change
|
||||||
) | ||||||
.toRefRepository | ||||||
|
||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
見た限り
PlayerBlockBreakListener
内の定義でしか使われていないようなのでprivate
にして良いと思います!(私の見落としだったらそのままで大丈夫です!)