Minecraft에서 Citizens로 플러그인 만들기

Citizens란?





Minecraft Spigot 서버에 NPC를 도입하는 플러그인입니다.

플러그인 단독으로도 사용할 수 있습니다만, 이번은 자작의 플러그인으로부터 Citizens의 기능을 사용하는 방법을 소개합니다.

소개



plugin.yml의 depende에 Citizens 추가

plugin.yml
name: SamplePlugin
version: @version@
api-version: 1.13
main: sample.sampleplugin
depend: [Citizens]

build.gradle에 Citizens 라이브러리 추가

build.gradle
repositories {
    //....

    maven {
        name = 'citizens'
        url = 'http://repo.citizensnpcs.co/'
    }
}

//....

dependencies {
    //....

    compile 'net.citizensnpcs:citizensapi:2.0.25-SNAPSHOT'
    compile('net.citizensnpcs:citizens:2.0.25-SNAPSHOT') {
        exclude group: 'org.bstats', module: 'bstats-bukkit'
    }
}

NPC 만들기



CitizensAPI를 사용하여 NPC 만들기


import net.citizensnpcs.api.CitizensAPI
import net.citizensnpcs.api.npc.NPC
import org.bukkit.Location
import org.bukkit.entity.Entity
import org.bukkit.entity.EntityType

fun spawnNpc(location: Location, npcName: String, skin: String): Entity {
    val npc = CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, "dummy").apply {
        isProtected = false
        data().set(NPC.PLAYER_SKIN_UUID_METADATA, skin)
        data().set(NPC.PLAYER_SKIN_USE_LATEST, false)
        name = npcName
    }
    npc.spawn(location)
    return npc.entity
}
CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, "dummy") 를 사용하여 NPC를 만들 수 있습니다.data().set(NPC.PLAYER_SKIN_UUID_METADATA, skin) 에서 skin 에 플레이어 이름을 지정하면 지정한 플레이어의 스킨이 반영됩니다.name 로 표시되는 NPC의 이름을 지정합니다.

Trait 지정



위에서 만든 NPC는 단지 서 있는 것만으로 아무것도 하지 않습니다. 거기서 플레이어가 가까워지면 플레이어쪽을 향하도록 합니다.
Citizens에서는 Trait이라는 클래스를 추가하여 NPC의 동작을 정의합니다.
import net.citizensnpcs.api.CitizensAPI
import net.citizensnpcs.api.npc.NPC
import net.citizensnpcs.trait.LookClose
import org.bukkit.Location
import org.bukkit.entity.Entity
import org.bukkit.entity.EntityType

fun spawnNpc(location: Location, npcName: String, skin: String): Entity {
    val npc = CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, "dummy").apply {
        isProtected = false
        data().set(NPC.PLAYER_SKIN_UUID_METADATA, skin)
        data().set(NPC.PLAYER_SKIN_USE_LATEST, false)
        addTrait(LookClose::class.java)
        getTrait(LookClose::class.java).lookClose(true)
        name = npcName
    }
    npc.spawn(location)
    return npc.entity
}

Citizens에 표준으로 들어오는 LookClose라는 Trait를 추가했습니다. 이렇게하면 NPC가 플레이어를 보게됩니다.

Trait 만들기



Trait는 독자적으로 만들 수 있습니다.

RandomTrait.kt
import net.citizensnpcs.api.trait.Trait
import org.bukkit.Location
import java.util.*

class RandomTrait : Trait("random") {
    override fun run() {
        val entity = npc.entity ?: return
        val rand = Random().nextInt(100)
        if (rand < 2) {
            if (entity.isOnGround && entity.velocity.length() <= 0.1) {
                val location = randomLocation(entity.location, 5.0, 5.0, 5.0)
                npc.navigator.setTarget(location)
            }
        }
    }

    private fun randomLocation(baseLocation: Location, x: Double, y: Double, z: Double): Location {
        val i = (Random().nextDouble() * 2 - 1) * x
        val j = (Random().nextDouble() * 2 - 1) * y
        val k = (Random().nextDouble() * 2 - 1) * z
        return baseLocation.clone().add(i, j, k)
    }
}

위는 무작위 방향으로 이동하는 Trait입니다.
Citizens는 매 Tick마다 Trait run()를 실행하는 구조로 되어 있습니다.
fun spawnNpc(location: Location, npcName: String, skin: String): Entity {
    val npc = CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, "dummy").apply {
        isProtected = false
        data().set(NPC.PLAYER_SKIN_UUID_METADATA, skin)
        data().set(NPC.PLAYER_SKIN_USE_LATEST, false)
        addTrait(RandomTrait())
        name = npcName
    }
    npc.spawn(location)
    return npc.entity
}

작성한 Trait를 NPC에 추가하여 반영됩니다.

서버에 배포



Spigot 서버의 plugins 디렉토리에 다음을 넣습니다.
  • Citizens 플러그인 본체
  • 만든 플러그인

  • 끝에



    Citizens를 사용하여 쉽게 NPC를 사용자 정의 할 수 있으므로 관심이 있으시면 시도해보십시오.

    좋은 웹페이지 즐겨찾기