noonmaru / psychics

Minecraft psychic plugin for Paper

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

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 파일입니다.
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 문제 말고는 아무런 문제가 발생하지 않았습니다. 아래의 영상은 이 상황에서 제가 좀비를 한 대 치고 좀비가 저를 한 대 치는 영상입니다.
default.mp4

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

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

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