능력 사용자가 (어떠한 방식으로든) 공격하는 순간을 어떻게 판단할까요?
bucket1582 opened this issue · comments
개요
플레이어가 능력을 사용하면 그 이후 몇 초 동안 그 플레이어가 하는 모든 공격에 대해 타격받은 상대방이 일정 확률로 불이 붙는 능력을 개발 중에, 한 가지 문제에 부딪혔습니다.
문제
다음은 현재 코드입니다. 현재는 타격하는 순간 공격자가 누구인지 Actionbar로 전달하는 코드로 대체했습니다.
imports
import com.github.noonmaru.psychics.AbilityConcept
import com.github.noonmaru.psychics.AbilityType
import com.github.noonmaru.psychics.ActiveAbility
import com.github.noonmaru.psychics.item.isPsychicbound
import com.github.noonmaru.tap.config.Config
import com.github.noonmaru.tap.config.Name
import net.md_5.bungee.api.ChatColor
import org.bukkit.Material
import org.bukkit.enchantments.Enchantment
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.player.PlayerEvent
import org.bukkit.inventory.ItemStack
Ability Concept
@Name("concept")
class BooleanFunctionConcept : AbilityConcept() {
@Config
var fireTicks : Int = 20
@Config
var fireProbability : Double = 0.2
init {
type = AbilityType.ACTIVE
displayName = "불함수"
levelRequirement = 0
cooldownTicks = 0
cost = 0.0
castingTicks = 0
durationTicks = 40
val boolFunction = ItemStack(Material.FIRE_CORAL, 1)
boolFunction.apply {
val meta = itemMeta
meta.setDisplayName("${ChatColor.GOLD}${ChatColor.BOLD}불함수 방사기")
meta.addEnchant(Enchantment.ARROW_FIRE, 1, false)
meta.lore = listOf(
"불로 공격하는 함수의 공격기"
)
meta.isPsychicbound = true
itemMeta = meta
}
wand = boolFunction
supplyItems = listOf(
boolFunction
)
description = listOf(
"능력 사용 후 ${durationTicks/20.0}초 동안 자신이 공격한 모든 공격은",
"${fireProbability * 100}%의 확률로 상대방을 불 붙일 수 있습니다.",
"상대방에게 불이 붙으면, ${fireTicks/20.0}초 동안 불이 유지됩니다.",
"",
"${ChatColor.ITALIC}불함수가 있으면 물함수도 있나? 캬하하"
)
}
}
Ability
class BooleanFunction : ActiveAbility<BooleanFunctionConcept>(), Listener {
var isAbilityOn : Boolean = false
override fun onEnable() {
psychic.registerEvents(this)
}
override fun onCast(event: PlayerEvent, action: WandAction, target: Any?) {
esper.player.sendActionBar("불함수 TRUE")
isAbilityOn = true
psychic.runTask({
isAbilityOn = false
esper.player.sendActionBar("불함수 False")
}, concept.durationTicks)
}
@EventHandler
fun onAttack(event: EntityDamageByEntityEvent) {
esper.player.sendActionBar(event.damager.toString())
}
}
코드 전문
package proj.science.bucket1572.mathematics.function.booleanfunction
import com.github.noonmaru.psychics.AbilityConcept
import com.github.noonmaru.psychics.AbilityType
import com.github.noonmaru.psychics.ActiveAbility
import com.github.noonmaru.psychics.item.isPsychicbound
import com.github.noonmaru.tap.config.Config
import com.github.noonmaru.tap.config.Name
import net.md_5.bungee.api.ChatColor
import org.bukkit.Material
import org.bukkit.enchantments.Enchantment
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.player.PlayerEvent
import org.bukkit.inventory.ItemStack
@Name("concept")
class BooleanFunctionConcept : AbilityConcept() {
@Config
var fireTicks : Int = 20
@Config
var fireProbability : Double = 0.2
init {
type = AbilityType.ACTIVE
displayName = "불함수"
levelRequirement = 0
cooldownTicks = 0
cost = 0.0
castingTicks = 0
durationTicks = 40
val boolFunction = ItemStack(Material.FIRE_CORAL, 1)
boolFunction.apply {
val meta = itemMeta
meta.setDisplayName("${ChatColor.GOLD}${ChatColor.BOLD}불함수 방사기")
meta.addEnchant(Enchantment.ARROW_FIRE, 1, false)
meta.lore = listOf(
"불로 공격하는 함수의 공격기"
)
meta.isPsychicbound = true
itemMeta = meta
}
wand = boolFunction
supplyItems = listOf(
boolFunction
)
description = listOf(
"능력 사용 후 ${durationTicks/20.0}초 동안 자신이 공격한 모든 공격은",
"${fireProbability * 100}%의 확률로 상대방을 불 붙일 수 있습니다.",
"상대방에게 불이 붙으면, ${fireTicks/20.0}초 동안 불이 유지됩니다.",
"",
"${ChatColor.ITALIC}불함수가 있으면 물함수도 있나? 캬하하"
)
}
}
class BooleanFunction : ActiveAbility<BooleanFunctionConcept>(), Listener {
var isAbilityOn : Boolean = false
override fun onEnable() {
psychic.registerEvents(this)
}
override fun onCast(event: PlayerEvent, action: WandAction, target: Any?) {
esper.player.sendActionBar("불함수 TRUE")
isAbilityOn = true
psychic.runTask({
isAbilityOn = false
esper.player.sendActionBar("불함수 False")
}, concept.durationTicks)
}
@EventHandler
fun onAttack(event: EntityDamageByEntityEvent) {
esper.player.sendActionBar(event.damager.toString())
}
}
yml
abilities:
exp-function:
ability: proj.science.bucket1572.exponentialfunction
common:
display-name: 지수함수
type: ACTIVE
interruptible: false
range: 40.0
wand:
v: 2580
type: NETHER_STAR
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §4§l지수함수 런쳐
lore:
- 멀어질수록 강해지는 함수의 공격기
- §c§lPsychicbound
enchants:
DAMAGE_UNDEAD: 1
supply-items:
- ==: org.bukkit.inventory.ItemStack
v: 2580
type: NETHER_STAR
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §4§l지수함수 런쳐
lore:
- 멀어질수록 강해지는 함수의 공격기
- §c§lPsychicbound
enchants:
DAMAGE_UNDEAD: 1
description:
- 자신이 바라보는 방향으로 발사체를 발사합니다.
- 발사체의 궤적은 y=2.0^x의 그래프의 일부와 같습니다.
- 피격 대상은 발사체의 평면 상 이동거리를 30.0으로 나눈 x에 대하여,
- 2.0^x의 피해를 입습니다.
- ''
- §o아-- 원리합계 계산 문제 싫다~.
concept:
base: 2.0
max-ticks: 200
knockback: 1.0
projectile-speed: 1.0
scale: 10.0
damage-scale: 1.0
bool-function:
ability: proj.science.bucket1572.booleanfunction
common:
display-name: 불함수
type: ACTIVE
interruptible: false
duration-ticks: 40
wand:
v: 2580
type: FIRE_CORAL
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §6§l불함수 방사기
lore:
- 불로 공격하는 함수의 공격기
- §c§lPsychicbound
enchants:
ARROW_FIRE: 1
supply-items:
- ==: org.bukkit.inventory.ItemStack
v: 2580
type: FIRE_CORAL
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §6§l불함수 방사기
lore:
- 불로 공격하는 함수의 공격기
- §c§lPsychicbound
enchants:
ARROW_FIRE: 1
description:
- 능력 사용 후 2.0초 동안 자신이 공격한 모든 공격은
- 20.0%의 확률로 상대방을 불 붙일 수 있습니다.
- 상대방에게 불이 붙으면, 1.0초 동안 불이 유지됩니다.
- ''
- §o불함수가 있으면 물함수도 있나? 캬하하
concept:
fire-ticks: 20
fire-probability: 0.2
inv-function:
ability: proj.science.bucket1572.inversefunction
common:
display-name: 역함수
type: PASSIVE
interruptible: false
wand:
v: 2580
type: BARRIER
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §a§l역함수 카운터
lore:
- 받은 만큼 되갚아주는 함수의 카운터
- §c§lPsychicbound
enchants:
DAMAGE_UNDEAD: 1
supply-items:
- ==: org.bukkit.inventory.ItemStack
v: 2580
type: BARRIER
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §a§l역함수 카운터
lore:
- 받은 만큼 되갚아주는 함수의 카운터
- §c§lPsychicbound
enchants:
DAMAGE_UNDEAD: 1
description:
- 자신이 다른 사람의 §l§c원거리 초능력 공격§f에 의해
- 피해를 입을 경우, 즉시 초능력을 사용한 대상에게
- (받은 피해) × (1.0)만큼의 피해를 입힙니다.
- ''
- §o어떤 함수가 가역함수일 필요충분조건은
- §o그 함수가 일대일대응인 것이다.
concept:
coefficient: 1.0
const-function:
ability: proj.science.bucket1572.constantfunction
common:
display-name: 상수함수
type: ACTIVE
interruptible: false
wand:
v: 2580
type: CLOCK
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §6§l상수함수 초시계
lore:
- 잠시동안 무적이 되는 함수의 특수기
- §c§lPsychicbound
enchants:
DAMAGE_UNDEAD: 1
supply-items:
- ==: org.bukkit.inventory.ItemStack
v: 2580
type: CLOCK
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §6§l상수함수 초시계
lore:
- 잠시동안 무적이 되는 함수의 특수기
- §c§lPsychicbound
enchants:
DAMAGE_UNDEAD: 1
description:
- 능력 사용시, 1.5초 동안 발광 디버프를 받고, 움직일 수 없습니다.
- 대신, 능력 사용 시간동안 자신이 입는 모든 피해를 무시할 수 있습니다.
- ''
- §o함수 f가 미분가능하고 모든 실수 x에 대하여 f'(x) = 0이면,
- §o함수 f는 실수 전체의 집합에서 상수함수이다.
concept:
immovable-ticks: 30
display-name: Function
health-bonus: 0.0
health-regen-per-tick: 2.0
mana: 100.0
mana-regen-per-tick: 2.0
mana-color: BLUE
description:
- 함수
default.mp4
제가 한 대 때릴 때에는 아무런 표시도 생기지 않고, 좀비가 때릴 때에만 표시가 생깁니다. 하지만, 저는 EntityDamageByEntityEvent 말고는 다른 방법이 생각나지 않습니다. 플레이어가 어떤 능력을 가지고 있을 때, 어떠한 방식으로 타격하든 타격에 대한 정보를 받아오는 방법이 없을까요? 물론, issue 탭이 이런 용도가 아니라고 생각하기는 합니다만...