-
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
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,9 @@ | ||
USE seichiassist; | ||
|
||
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) | ||
); | ||
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -7,16 +7,20 @@ import com.github.unchama.minecraft.actions.OnMinecraftServerThread | |||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.ManagedWorld._ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.MaterialSets.{BlockBreakableBySkill, BreakTool} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.concurrent.PluginExecutionContexts | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.data.{AxisAlignedCuboid} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.data.syntax._ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.seichiskill.ActiveSkillRange.MultiArea | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.seichiskill.SeichiSkillUsageMode.Disabled | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.seichiskill.{BlockSearching, BreakArea} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.breakcount.domain.level.SeichiExpAmount | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.breakskilltriggerconfig.domain.BreakSkillTriggerConfigKey | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.mana.ManaApi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.mana.domain.ManaAmount | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.subsystems.minestack.MineStackAPI | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.util.BreakUtil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.{MaterialSets, SeichiAssist} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.targetedeffect.player.FocusedSoundEffect | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.targetedeffect.player.ActionBarMessageEffect | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.util.bukkit.ItemStackUtil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.util.effect.BukkitResources | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.util.external.WorldGuardWrapper | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -101,20 +105,70 @@ class PlayerBlockBreakListener( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 追加マナ獲得 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
manaApi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
.manaAmount(player) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
.restoreAbsolute(ManaAmount(BreakUtil.calcManaDrop(player))) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
.unsafeRunSync() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 選択したスキル | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
val selectedSkill = skillState | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
.activeSkill | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
.getOrElse( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!selectedSkill.range.isInstanceOf[MultiArea] || skillState.usageMode == Disabled) return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// プレイヤーの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() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+116
to
+171
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. ここの差分は、実際のワールドの探索などのコードを含んでいることと、レガシーコードなこともあり正確な読み取りが難しい(大きな変更をするとバグが出る可能性が高い)ので、(まとめで定義したい気持ちはとても良くわかりますが)似たようなコードが複製されていてもいいので、この PR の目的の差分以外が出ない状態にしていただけると大変助かります🙇♂️🙇♂️ |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 破壊不可能ブロックの時処理を終了 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!BreakUtil.canBreakWithSkill(player, block)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
event.setCancelled(true) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -123,21 +177,8 @@ class PlayerBlockBreakListener( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
event.setCancelled(true) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// ブロック破壊時に行う処理 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// プレイヤーの足の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 multiBreakList = new ArrayBuffer[Set[BlockBreakableBySkill]] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// 壊される溶岩の全てのリストデータ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -154,22 +195,7 @@ class PlayerBlockBreakListener( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
val b = new Breaks | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
b.breakable { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
breakAreaList.foreach { breakArea => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
import com.github.unchama.seichiassist.data.syntax._ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
val (breakBlocks, waterBlocks, lavaBlocks) = blockSearchResult(breakArea) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// このチャンクで消費されるマナ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
val manaToConsumeOnThisChunk = ManaAmount { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
(gravity + 1) * selectedSkill.manaCost * (breakBlocks.size + 1).toDouble / totalBreakRangeVolume | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -373,4 +399,24 @@ class PlayerBlockBreakListener( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
event.setCancelled(true) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
player.sendMessage(s"${RED}Y-59以下に敷かれたハーフブロックは破壊不可能です。") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* ブロック破壊時、「マナ切れブロック破壊停止設定」を取得する。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* マナ切れブロック破壊設定が `true` になっている場合、プレイヤーに破壊抑制メッセージを送信する。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param player マナ切れブロック破壊停止設定を取得するプレイヤー | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+408
to
+421
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
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package com.github.unchama.seichiassist.subsystems.breakskilltriggerconfig | ||
|
||
import cats.data.Kleisli | ||
import com.github.unchama.seichiassist.subsystems.breakskilltriggerconfig.domain.BreakSkillTriggerConfigKey | ||
|
||
trait BreakSkillTriggerConfigAPI[F[_], Player] { | ||
|
||
/** | ||
* @return 破壊トリガをトグルする作用 | ||
*/ | ||
def toggleBreakSkillTriggerConfig( | ||
configKey: BreakSkillTriggerConfigKey | ||
): Kleisli[F, Player, Unit] | ||
|
||
/** | ||
* @return 現在の破壊トリガを取得する作用 | ||
*/ | ||
def breakSkillTriggerConfig(player: Player, configKey: BreakSkillTriggerConfigKey): F[Boolean] | ||
|
||
} | ||
|
||
object BreakSkillTriggerConfigAPI { | ||
|
||
def apply[F[_], Player]( | ||
implicit ev: BreakSkillTriggerConfigAPI[F, Player] | ||
): BreakSkillTriggerConfigAPI[F, Player] = ev | ||
|
||
} |
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値のみを扱うので)なので、以下のようなテーブルにすると良いと思います。