-
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?
feat: マナが無くなったら掘れなくするパッシブスキルを追加 #2370
Conversation
14a859f
to
571abd3
Compare
@rito528 |
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.
develop
ブランチの変更を取り込んでしまっているようなので、 git rebase --rebase-merges 1_18
などを実行して develop
ブランチの変更をコミット履歴から消していただけると助かります🙇♂️🙇♂️
了解です。 |
bb09299
to
509644b
Compare
509644b
to
e7c7cd3
Compare
@rito528 |
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.
一旦2つ変更をお願いします
src/main/scala/com/github/unchama/seichiassist/listener/PlayerBlockBreakListener.scala
Outdated
Show resolved
Hide resolved
src/main/scala/com/github/unchama/seichiassist/util/BreakUtil.scala
Outdated
Show resolved
Hide resolved
@rito528 |
...ssist/subsystems/breakskilltriggerconfig/application/actions/BreakSkillTriggerSettings.scala
Outdated
Show resolved
Hide resolved
...ssist/subsystems/breakskilltriggerconfig/application/actions/BreakSkillTriggerSettings.scala
Outdated
Show resolved
Hide resolved
src/main/scala/com/github/unchama/seichiassist/subsystems/mana/domain/ManaManipulation.scala
Outdated
Show resolved
Hide resolved
src/main/scala/com/github/unchama/seichiassist/listener/PlayerBlockBreakListener.scala
Outdated
Show resolved
Hide resolved
src/main/scala/com/github/unchama/seichiassist/listener/PlayerBlockBreakListener.scala
Outdated
Show resolved
Hide resolved
@rito528 |
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.
テーブル構成が変わることで今と実装がかなり変わりそうなので、一度以下の内容の変更をお願いします!
@@ -28,6 +28,11 @@ trait ManaManipulation[F[_]] { | |||
*/ | |||
def tryAcquire(amount: ManaAmount): F[Option[ManaAmount]] | |||
|
|||
/** | |||
* `amount` だけマナを消費することができれば `true`、消費できなければ `false` を返す作用 |
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.
「消費することができれば」と書いてしまうと「マナを消費することが可能ならばマナ消費する関数」であると捉えられる可能性があるので、「消費することが可能ならば」と書いたほうが齟齬が生じない表現になると思います
* `amount` だけマナを消費することができれば `true`、消費できなければ `false` を返す作用 | |
* `amount` だけマナを消費することが可能ならば `true`、そうでないなら `false` を返す作用 |
// プレイヤーのY座標 | ||
val playerLocY = player.getLocation.getBlockY - 1 | ||
// スキル破壊範囲 | ||
val skillArea = BreakArea(selectedSkill, skillState.usageMode) | ||
// 破壊エリアリスト | ||
val breakAreaList = skillArea.makeBreakArea(player).unsafeRunSync() | ||
// 複数種類ブロック同時破壊設定 | ||
val isMultiTypeBreakingSkillEnabled = | ||
BreakUtil.performsMultipleIDBlockBreakWhenUsingSkills(player).unsafeRunSync() | ||
// 破壊範囲のブロック計算 | ||
val totalBreakRangeVolume = { | ||
val breakLength = skillArea.breakLength | ||
breakLength.x * breakLength.y * breakLength.z * skillArea.breakNum | ||
} | ||
// ブロック探索結果 | ||
val blockSearchResult | ||
: AxisAlignedCuboid => (List[BlockBreakableBySkill], List[Block], List[Block]) = { | ||
breakArea: AxisAlignedCuboid => | ||
val BlockSearching.Result(breakBlocks, waterBlocks, lavaBlocks) = | ||
BlockSearching | ||
.searchForBlocksBreakableWithSkill(player, breakArea.gridPoints(), block) | ||
.unsafeRunSync() | ||
.filterSolids(targetBlock => | ||
isMultiTypeBreakingSkillEnabled || BlockSearching | ||
.multiTypeBreakingFilterPredicate(block)(targetBlock) | ||
) | ||
.filterAll(targetBlock => | ||
player.isSneaking || targetBlock | ||
.getLocation | ||
.getBlockY > playerLocY || targetBlock == block | ||
) | ||
(breakBlocks, waterBlocks, lavaBlocks) | ||
} | ||
|
||
// 消費マナが不足しているか判定 | ||
breakAreaList.foreach { breakArea => | ||
val (breakBlocks, _, _) = blockSearchResult(breakArea) | ||
// 破壊範囲で消費されるマナ計算 | ||
val manaToConsumeOnBreakArea = ManaAmount { | ||
(gravity + 1) * selectedSkill.manaCost * (breakBlocks.size + 1).toDouble / totalBreakRangeVolume | ||
} | ||
// 消費マナが不足している場合は処理を終了 | ||
manaApi.manaAmount(player).canAcquire(manaToConsumeOnBreakArea).unsafeRunSync() match { | ||
case false if isBreakBlockManaFullyConsumed(player) => | ||
event.setCancelled(true) | ||
return | ||
case _ => | ||
} | ||
} | ||
|
||
// 追加マナ獲得 | ||
manaApi | ||
.manaAmount(player) | ||
.restoreAbsolute(ManaAmount(BreakUtil.calcManaDrop(player))) | ||
.unsafeRunSync() | ||
|
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.
ここの差分は、実際のワールドの探索などのコードを含んでいることと、レガシーコードなこともあり正確な読み取りが難しい(大きな変更をするとバグが出る可能性が高い)ので、(まとめで定義したい気持ちはとても良くわかりますが)似たようなコードが複製されていてもいいので、この PR の目的の差分以外が出ない状態にしていただけると大変助かります🙇♂️🙇♂️
def isBreakBlockManaFullyConsumed(player: Player): Boolean = { | ||
|
||
val isBreakBlockManaFullyConsumed = SeichiAssist | ||
.instance | ||
.breakSkillTriggerConfigSystem | ||
.api | ||
.breakSkillTriggerConfig(player, BreakSkillTriggerConfigKey.ManaFullyConsumed) | ||
.unsafeRunSync() | ||
|
||
if (isBreakBlockManaFullyConsumed) { | ||
ActionBarMessageEffect(s"${RED}マナ切れでブロック破壊を止めるスキルは有効化されています").run(player).unsafeRunSync() | ||
} | ||
isBreakBlockManaFullyConsumed | ||
} |
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.
def isBreakBlockManaFullyConsumed(player: Player): Boolean = { | |
val isBreakBlockManaFullyConsumed = SeichiAssist | |
.instance | |
.breakSkillTriggerConfigSystem | |
.api | |
.breakSkillTriggerConfig(player, BreakSkillTriggerConfigKey.ManaFullyConsumed) | |
.unsafeRunSync() | |
if (isBreakBlockManaFullyConsumed) { | |
ActionBarMessageEffect(s"${RED}マナ切れでブロック破壊を止めるスキルは有効化されています").run(player).unsafeRunSync() | |
} | |
isBreakBlockManaFullyConsumed | |
} | |
def isBreakBlockManaFullyConsumed(player: Player): IO[Boolean] = { | |
for { | |
isBreakBlockManaFullyConsumed <- SeichiAssist | |
.instance | |
.breakSkillTriggerConfigSystem | |
.api | |
.breakSkillTriggerConfig(player, BreakSkillTriggerConfigKey.ManaFullyConsumed) | |
_ <- ActionBarMessageEffect(s"${RED}マナ切れでブロック破壊を止めるスキルは有効化されています") | |
.run(player) | |
.whenA(isBreakBlockManaFullyConsumed) | |
} yield isBreakBlockManaFullyConsumed | |
} |
CREATE TABLE player_break_trigger_preference( | ||
uuid CHAR(36) NOT NULL, | ||
trigger_category ENUM('ManaFullyConsumed') NOT NULL, | ||
do_not_break BOOL NOT NULL DEFAULT FALSE, | ||
PRIMARY KEY(uuid, trigger_category), | ||
INDEX index_player_break_trigger_preference_on_uuid (uuid) | ||
); |
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.
このテーブルで扱うデータは「マナがないときにスキルの発動を抑制するかどうか」ということだけなので、trigger_category
カラムが ENUM
で複数の値を持つことができる必要がないと思います(あくまで設定が有効か無効かの2値のみを扱うので)
なので、以下のようなテーブルにすると良いと思います。
CREATE TABLE player_break_trigger_preference( | |
uuid CHAR(36) NOT NULL, | |
trigger_category ENUM('ManaFullyConsumed') NOT NULL, | |
do_not_break BOOL NOT NULL DEFAULT FALSE, | |
PRIMARY KEY(uuid, trigger_category), | |
INDEX index_player_break_trigger_preference_on_uuid (uuid) | |
); | |
CREATE TABLE player_break_suppression_preference( | |
uuid CHAR(36) NOT NULL, | |
do_break_suppression_due_to_mana BOOL NOT NULL DEFAULT FALSE, | |
FOREIGN KEY fk_player_break_suppression_preference_uuid REFERENCES playerdata(uuid) | |
); |
close #1964
このPRの変更点と理由:
主な変更点
補足情報: