마인크래프트 1.20.1 버전 기준으로 진행되고 있습니다.
이전 화
[코틀린으로 마크 플러그인 개발하기] 개요 (tistory.com)
개요에서 설명했다시피 유저에게 직업을 부여하고 그에 맞는 각종 기능을 추가할 예정입니다.
그러기 위해선 플레이어의 데이터를 저장할 필요가 있습니다.
이는 이후 진행할 강좌들의 기본 틀이기 때문에
"플레이어 데이터 저장하기" 시리즈를 통해 집중적으로 다룰 예정입니다.
1. 메인 클래스 이름 변경 및 싱글톤 패턴 구현
메인 클래스 이름 변경
이제부터 파일이 엄청 늘어나기 때문에
메인 클래스의 가독성을 뚜렷하게 하기 위해 이름을 변경해 줍니다.
기존엔 KotlinPluginTest 였습니다.
우클릭하여 Refactor -> Rename을 눌러줍니다.
Main으로 이름을 바꿔주고 Refactor를 눌러줍니다.
(전 이미 바꾼 상태라 위와 같이 화면이 나옵니다)
그러면 클래스의 이름이 바뀝니다.
하지만 여기서 끝난 것이 아닙니다.
plugin.yml과 build.gradle 파일에서 Main 클래스를 참조하고 있기 때문에 이 또한 바꿔줘야 합니다.
plugin.yml
build.gradle
shadowJar{
archivesBaseName = 'testplugin'
destinationDirectory = file("C:\\Users\\Yoon\\Desktop\\game\\minecraft\\1.20.1 plugin develop server\\plugins")
manifest {
attributes 'Main-Class': 'org.zepelown.kotlintestplugin.Main'
}
}
변경하셨다면 끝났습니다.
메인 클래스 싱글톤 패턴 구현
객체의 인스턴스를 하나로 하는 것을 싱글톤 패턴이라고 합니다.
메인 클래스를 싱글톤 하는 이유는 여러 가지 상속받아 사용할 것들이 있기 때문입니다.
예를 들어, 어떤 명령어를 만들었는데 작동 확인을 위해 서버 콘솔에 로그를 남기고 싶다고 해보겠습니다.
그러기 위해선 메인 클래스의 인스턴스를 가져와야 합니다.
따라서 메인 클래스를 싱글톤 패턴으로 구현할 필요성이 있는 겁니다.
어렵지 않으니 따라서 코드 작성해 주시면 됩니다.
class Main : JavaPlugin() {
companion object{
var instance : Main? = null
}
override fun onEnable() {
instance = this
}
override fun onDisable() {
}
}
끝입니다.
다른 클래스에서 서버(메인 클래스)의 인스턴스가 필요하다면
Main.instance.... 이렇게 사용하시면 됩니다.
2. 패키지 구조화
패키지는 디렉터리라고 생각하시면 됩니다.
이 패키지를 어떤 구조로 해놓은지에 따라 작업의 효율이 달라집니다.
보통 event면 event 패키지에, command라면 command 패키지에 넣습니다.
하지만 전 기능 단위로 패키지를 구조화하였습니다.
즉, 플레이어의 데이터를 관리하는데 필요한 event, command 등을 하나의 패키지에 넣는 방식입니다.
이해가 안 되시면 위 이미지대로 패키지를 그냥 따라 만드시면 됩니다.
패키지 만드는 방법
org.zepelown.kotlintestplugin 우클릭하여 package를 만드시면 됩니다.
위와 같이 입력하시면 됩니다.
(전 이미 있기 때문에 빨간색으로 표시됩니다)
3. 플레이어 데이터를 저장 및 관리할 클래스 구현
OnlinePlayer, PlayerManager 클래스를 만듭니다.
OnlinePlayer.kt
import java.util.UUID
data class OnlinePlayer(
val uuid : UUID,
var displayName:String,
var job:String,
var rank:String,
var prefix:String,
var money: ULong
)
플레이어에게 저장할 데이터는 다음과 같습니다.
1. uuid
플레이어의 식별자라고 생각하시면 됩니다.
2. displayName
플레이어의 닉네임인데 차후 닉변 기능을 고려하여 넣었습니다.
3. job
플레이어의 직업입니다.
4. rank
플레이어의 등급입니다.
5. prefix
플레이어의 칭호입니다.
6. moeny
경제 기능도 넣을 생각이라 플레이어에게 부여해 봤습니다.
다만, 이 부분은 차후 수정이 들어갈 예정입니다.
PlayerManager.kt
import org.bukkit.entity.Player
import org.zepelown.kotlintestplugin.Main
class PlayerManager {
companion object{
private var onlinePlayerData = HashMap<Player, OnlinePlayer>()
}
fun addPlayer(player: Player){
val newOnlinePlayer = OnlinePlayer(player.uniqueId, player.displayName, "jobless","unranked","[뉴비]", 1000u)
onlinePlayerData[player] = newOnlinePlayer
Main.instance!!.logger.info("플레이어 데이터를 추가하였습니다.")
}
fun deletePlayer(player: Player){
onlinePlayerData.remove(player)
Main.instance!!.logger.info("플레이어 데이터를 삭제하였습니다.")
}
fun getPlayerData(player: Player) : OnlinePlayer?{
return onlinePlayerData[player]
}
}
PlayerManager는 플레이어의 데이터를 저장 및 관리하는 클래스입니다.
저장 및 관리하기 위해
companion object를 통해 hashmap을 static으로 남기고
키를 player entity 객체로, 값을 위에서 만들었던 데이터 클래스 OnlinePlayer로 하였습니다.
player entity를 hashmap에 던지면 OnlinePlayer가 튀어나올 수 있게 한 겁니다.
임시로 데이터가 추가 및 삭제가 될 때 로그를 남기도록 하였습니다.
PlayerManager 또한 싱글톤 패턴으로 구현해 줍니다.
Main.kt
class Main : JavaPlugin() {
companion object{
var playerManager : PlayerManager? = null
var instance : Main? = null
}
override fun onEnable() {
instance = this
playerManager = PlayerManager()
}
override fun onDisable() {
}
}
다음 글에서 위에서 만들었던 클래스들을 사용해 보도록 하겠습니다.
'마인크래프트 > 플러그인 제작 강좌(코틀린)' 카테고리의 다른 글
[코틀린으로 마크 플러그인 개발하기] 명령어 만들기(플레이어 데이터 저장하기 3편) (2) | 2023.07.11 |
---|---|
[코틀린으로 마크 플러그인 개발하기] 이벤트 처리하기(플레이어 데이터 저장하기 2편) (2) | 2023.07.08 |
[코틀린으로 마크 플러그인 개발하기] 개요 (2) | 2023.07.01 |
[코틀린으로 마크 플러그인 개발하기] 기본 세팅 (5) | 2023.06.30 |
댓글