Minecraft에서 Citizens로 플러그인 만들기
Citizens란?
Minecraft Spigot 서버에 NPC를 도입하는 플러그인입니다.
플러그인 단독으로도 사용할 수 있습니다만, 이번은 자작의 플러그인으로부터 Citizens의 기능을 사용하는 방법을 소개합니다.
소개
plugin.yml의 depende에 Citizens 추가
plugin.ymlname: SamplePlugin
version: @version@
api-version: 1.13
main: sample.sampleplugin
depend: [Citizens]
build.gradle에 Citizens 라이브러리 추가
build.gradlerepositories {
//....
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.ktimport 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 디렉토리에 다음을 넣습니다.
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.ktimport 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 디렉토리에 다음을 넣습니다.
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
}
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
}
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)
}
}
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
}
Spigot 서버의 plugins 디렉토리에 다음을 넣습니다.
끝에
Citizens를 사용하여 쉽게 NPC를 사용자 정의 할 수 있으므로 관심이 있으시면 시도해보십시오.
Reference
이 문제에 관하여(Minecraft에서 Citizens로 플러그인 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ReyADayer/items/2c380ace44ca5dab1595
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Minecraft에서 Citizens로 플러그인 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ReyADayer/items/2c380ace44ca5dab1595텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)