Projectile - noonmaru/psychics GitHub Wiki

개요

지정한 속도로 이동하는 투사체를 발사할 수 있습니다.

Tap의 FakeProjectile을 기반으로 합니다.

예제

지정한 방향으로 투사체를 발사하고 부딪힌 적에게 피해를 입히는 코드입니다.

class MyAbility : ActiveAbility<AbilityConcept>() {
    override fun onCast(target: Any?) {
        val eyeLocation = esper.player.eyeLocation
        val projectile = MyProjectile()
        psychic.launchProjectile(eyeLocation, projectile) // 투사체 발사
        projectile.velocity = eyeLocation.direction // 보는 방향으로 1.0의 속도 적용
    }

    // 투사체 클래스
    private inner class MyProjectile : PsychicProjectile(200, concept.range) {
        override fun onMove(movement: Movement) {
            //실제 발사체의 이동

            // 틱마다 y를 조금씩 올라가게 수정
            movement.to.y += 0.1
        }

        override fun onTrail(trail: Trail) {
            // trail.velocity는 월드간 이동하거나 움직이지 않을때 null이 할당됩니다.
            trail.velocity?.let { velocity ->
                val from = trail.from

                val length = velocity.normalizeAndLength() // normalize and return length

                // 직선 경로 관통 계산 
                from.world.rayTrace(
                        from,
                        velocity, // normalized
                        length,
                        FluidCollisionMode.NEVER,
                        true,
                        1.0, // 발사체 크기
                        TargetFilter(esper.player) // Psychics 기본 적(hostile) 필터
                )?.let { rayTraceResult ->  // 관통 계산 결과 
                    val hitEntity = rayTraceResult.hitEntity

                    if (hitEntity is LivingEntity) { // auto check null
                        concept.damage?.let { damage -> // concept에 정의된 damage 사용
                            hitEntity.psychicDamage(damage)
                        }
                    }

                    remove() // 발사체 제거
                }

                val to = trail.to
                to.world.spawnParticle(Particle.FIREWORKS_SPARK, to, 1) //파티클 소환
            }
        }
    }
}

onMoveonTrail 함수의 차이

  • onMove 함수는 투사체가 이동시 이동경로를 직접 변경할 수 있으며 서버 내 실제 발사체의 위치를 표시합니다.

  • onTrail 함수는 발사체의 이동이 일어난 후 2 tick 뒤의 움직임으로 호출됩니다. (trail)

    • 서버와 클라이언트의 Entity 움직임 차이는 Entity의 자연스러운 움직임을 위해 클라이언트에서 프레임 보간이 일어나 2 tick정도의 차이가 나게됩니다. 그래서 실제 판정은 클라이언트에 유리하게 하기 위해 2 tick 뒤에 호출되는 onTrail 함수 내에서 계산하는걸 추천립니다.