Skip to content

Fake entity

Noonmaru edited this page Oct 8, 2020 · 2 revisions

개요

더욱 풍부한 Ability의 능력을 표현하기 위해 Tap의 FakeEntity 기능을 사용합니다.

FakeEntity는 서버 내 실제 Entity를 생성하지 않고 클라이언트에만 보이는 Entity 를 제공합니다.

예제

class MyAbility : Ability<AbilityConcept>() {
    var fakeEntity: FakeEntity? = null

    override fun onEnable() {
        // FakeEntity 생성
        fakeEntity = psychic.spawnFakeEntity(getFakeEntityLocation(), ArmorStand::class.java).apply {
            updateMetadata<ArmorStand> { // ArmorStand로 캐스팅하여 속성 업데이트
                isVisible = false
            }
            updateEquipment { // 장비 업데이트
                helmet = ItemStack(Material.STONE)
            }
        }
        
        psychic.runTaskTimer({
            // 1 tick 마다 16칸 눈앞으로 이동
            fakeEntity?.moveTo(getFakeEntityLocation())
        }, 0L, 1L)
    }

    override fun onDisable() {
        // 제거
        fakeEntity?.let { fakeEntity -> 
            fakeEntity.remove()
            this.fakeEntity = null
        }
    }

    // 보는 방향 16칸 앞
    private fun getFakeEntityLocation(): Location {
        return esper.player.eyeLocation.apply {
            add(direction.multiply(16.0))
        }
    }
}

PsychicProjectile과 함께 사용하면 자연스러운 투사체를 표현할 수 있습니다.

TIP

psychic.spawnFakeEntity를 통해 FakeEntity를 생성하게 되면 Psychic 인스턴스 내부의 WeakReference로 관리됩니다.

능력 제거시 자동으로 FakeEntity로 제거되며 모든 레퍼런스가 초기화됩니다.

Clone this wiki locally