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) //파티클 소환
}
}
}
}
onMove
와 onTrail
함수의 차이
-
onMove
함수는 투사체가 이동시 이동경로를 직접 변경할 수 있으며 서버 내 실제 발사체의 위치를 표시합니다. -
onTrail
함수는 발사체의 이동이 일어난 후 2 tick 뒤의 움직임으로 호출됩니다. (trail)- 서버와 클라이언트의 Entity 움직임 차이는 Entity의 자연스러운 움직임을 위해 클라이언트에서 프레임 보간이 일어나 2 tick정도의 차이가 나게됩니다. 그래서 실제 판정은 클라이언트에 유리하게 하기 위해 2 tick 뒤에 호출되는
onTrail
함수 내에서 계산하는걸 추천립니다.
- 서버와 클라이언트의 Entity 움직임 차이는 Entity의 자연스러운 움직임을 위해 클라이언트에서 프레임 보간이 일어나 2 tick정도의 차이가 나게됩니다. 그래서 실제 판정은 클라이언트에 유리하게 하기 위해 2 tick 뒤에 호출되는