noonmaru / psychics

Minecraft psychic plugin for Paper
GNU General Public License v3.0
74 stars 20 forks source link

능력 사용자가 (어떠한 방식으로든) 공격하는 순간을 어떻게 판단할까요? #110

Closed bucket1582 closed 3 years ago

bucket1582 commented 3 years ago

개요

플레이어가 능력을 사용하면 그 이후 몇 초 동안 그 플레이어가 하는 모든 공격에 대해 타격받은 상대방이 일정 확률로 불이 붙는 능력을 개발 중에, 한 가지 문제에 부딪혔습니다.

문제

다음은 현재 코드입니다. 현재는 타격하는 순간 공격자가 누구인지 Actionbar로 전달하는 코드로 대체했습니다.

imports ```kotlin 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 ```kotlin @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 ```kotlin class BooleanFunction : ActiveAbility(), 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()) } } ```
코드 전문 ```kotlin 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(), 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 파일입니다.

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: - 함수 ```

아까 전에 올린 다른 issue #109 가 있는 상태로 서버를 구동하였고, 서버 상에는 issue #109 문제 말고는 아무런 문제가 발생하지 않았습니다. 아래의 영상은 이 상황에서 제가 좀비를 한 대 치고 좀비가 저를 한 대 치는 영상입니다.

https://user-images.githubusercontent.com/36808515/103415011-b4441a00-4bc3-11eb-98dc-bada5e7e31c7.mp4

제가 한 대 때릴 때에는 아무런 표시도 생기지 않고, 좀비가 때릴 때에만 표시가 생깁니다. 하지만, 저는 EntityDamageByEntityEvent 말고는 다른 방법이 생각나지 않습니다. 플레이어가 어떤 능력을 가지고 있을 때, 어떠한 방식으로 타격하든 타격에 대한 정보를 받아오는 방법이 없을까요? ~물론, issue 탭이 이런 용도가 아니라고 생각하기는 합니다만...~

Alex4386 commented 3 years ago

현재 getEntity가 Entity가 아닌 Player를 반환 하고 있기에, 반환 하고 있는 정보가 Entity 가 아닌 Player로 캐스트된 Entity 를 제공하고 있습니다.
현재 #109 에서 발생한 이슈로 인해 Player로만 반환 되고 있어, Player가 아닌 Entity 대상으로는 가져오기 어려운 상황인지라, #109 가 먼저 해결되어야 될 문제 같습니다.

bucket1582 commented 3 years ago

작성하신 것을 토대로 생각해 보니 #109 문제가 해결 되면 자연스럽게 해결 될 것으로 보이기 때문에 이 issue는 닫도록 하겠습니다.