개인 자료란 (JE)

  서버 커뮤니티

한국 마인크래프트 포럼

마인크래프트 자료 및 커뮤니티 플랫폼

전체 회원수 122,091명 ( +6명 )

※ 장기간 미활동 회원 제외

Profile 냥냐챠 디벨로퍼 인증 개발자

BARMCO d5524fc4eb3a4bdc95d86cfab6afb308

Profile

커뮤니티new 개발자란new 개발자 강좌 일반 프로그래밍

모딩 세계를 여행하는 냥냥이들을 위한 난해한 안내서 (한글패치 가이드라인, Fabric)

2020.08.06 조회 수 235 추천 수 1

하이냥 '^'/

저번에 루아 스크립트 기반 폭사 스크립트를 여기다가 올린 적이 있었지냥

이번에는 다른 분야로 급선회 해서 모드 관련 이야기를 좀 해볼까 한다냥.


아마 크레오냥이라는 착한 개발자가 1.14 버전까지 지원되는 포지 로더용 모드를 만든 것으로 기억한다냥

무언가를 기여한다라는 것은 언제나 가슴 벅찬 일이지냥


근데냥 시간은 흐른다냥. 시간이 흐르고 흘러 1.15 ~ 1.16 까지 나왔다냥 시간 참 빨리간다냥 내 의식의 흐름도 주체못하고

이리저리 움직이고 있고냥 이해 부탁냥 그냥 생각 없이 글 쓰고 있는 중이라서 그런다냥 '3'


포지, 좋지냥 근데 포지의 선천적인 구조 그 자체가 마인크래프트의 개발 주기를 따라잡지 못하고 있으니

그저 안타까울 따름이다냥


이 글은 포지로 한글 패치를 만드는 것에 대해서 설명해주고자 하는건 아니다냥 난 포지를 존중하지만

개발 프레임워크로써는 별로라고 생각하거든냥


1.13 버전부터인가냥? 모르겠는데 패브릭 로더라는 기똥찬게 하나 나왔었지냥

그 로더의 철학과 간결함이 나는 좋아서 그 생태계에서 모드를 만드는 것을 좋아한다냥

패브릭은 마인크래프트 개발 주기에 맞춰서 바로바로 대응할 수 있는 참신한 구조를 가지고 있거든냥 그래서 더 좋아한다냥.


패브릭 위에서 모드를 어떻게 만드는지는 생략할께냥 모딩의 처음과 끝을 가르쳐 주려는 것이 아니라

한글 패치를 어떻게 만들 것인가에 대해서 설명하려고 쓰는 글이니깐냥 양해 부탁냥 난 그런걸 다 포함해서 쓸 손가락 힘이

없다냥 '3'


패브릭을 통해서 모딩을 해본 냥이들이라면 알겠지만 패브릭에는 Sponge 프레임워크에서 만든 획기적인

모딩 도구가 내장되어 있다냥.


믹스인이라는 시스템인데냥 런타임에 마인크래프트의 바이트 코드를 수정하는 시스템 이다냥

너네들도 이미 알겠지만냥 마인크래프트 클라이언트 코드는 난독화 되어있어서 매핑이라는 과정 없이는

프로그래머가 해당 코드가 무엇을 처리하는 코드인지 추측하기가 힘들다냥

물론 시간이 흐르고 난독화된 코드를 매핑해서 어느정도 볼 수 있을만한 코드로 만들어 주는 Deobfuscator

는 여럿 나왔다냥


하지만 보기만 해서는 그렇지냥 이왕 볼 수 있게 되었으니 코드도 수정하고 싶지 않겠냥

그런 배경에서 나온 것이 믹스인이라는 것이다냥 마인크래프트가 자바가 아니였으면 나오지 못했을

참신한 아이디어라고 생각냥


아무튼 이 글의 대단원은 

믹스인 시스템의 소개랑

한글 패치를 하기 위해서는 마인크래프트의 어떤 부분을 패치해야 하는가


두가지로 크게 나눌 수 있다냥

이제부터 시작냥


난 이미 만들어서 내 서버에서 배포하고 있기 때문에 실제 작동하는 코드를 기준으로 설명한다냥 참고냥

기준 버전은 1.15 이다냥 이것도 참고냥


믹스인 시스템에 대한 개괄적인 설명은 위에서 했으니깐 관심있는 냥이들은 이 링크를 참조냥


믹스인 시스템은 실시간으로 바이트 코드를 변조하고 대치하는 시스템으로 요약할 수 있다냥

어느 클래스의 어느 부분을 만지고 싶은가에 대한 정확한 정보와 주입시킬 코드를 전달하는 것으로 동작하는 시스템이다냥


믹스인 기능을 사용하려면 자바 프로젝트의 리소스로 분류되는 경로에  fabric.mod.json 이라는 패브릭이 읽는

모드 정보 데이터에 정보를 제공해야 한다냥 아래처럼 말이다냥.


abc598bc412459289f251f4155df0ee1.png


모드 정보 데이터 또한 JSON 으로 되어있고 fabric.mod.json 에는 믹스인에 대한 정보를 담고있는 또다른 JSON 파일의 명칭을

적어주는 것 만으로 끝난다냥. 이들은 같은 경로에 위치해야 한다냥.


다음은 실제 믹스인 정보가 들어있는 root.mixins.json 의 내용이다냥

사실 이런 내용은 패브릭 팀에서 제공하는 예제 모드에 다 나와있다냥

간략하게 설명만 하고 넘어갈께냥


17245ef787026abbfd7b8cfd71e113b9.png


자세히 보면 Mixin 으로 시작하는 여러개의 문자열의 나열을 볼 수가 있는데

그것이 너네들이 주목해야될 부분이다냥.


실제로 저 문자열들은 클래스명을 가리키는 문자열이다냥

package 키에 정의된 패키지 경로에서 client 키에 매핑된 문자열 배열에 나타난 클래스명을

믹스인 시스템에서는 원한다냥.


즉, co.barm.minecraft.ul.mixin.Mixin... 이라는 클래스가 있어야한다는 말이다냥.


한글 패치를 위한 믹스인 클래스의 내용이다냥.

한글 패치에 관련된 믹스인 클래스는

MixinTextFieldWidget, MixinSignEditScreen 이다냥 이름은 뭘로 하던 딱히 상관없다냥.

그냥 그 클래스 이름이 json 에 제대로 적혀있으면 어떻게 적던 믹스인 시스템은 상관 안한다냥.


MixinTextFieldWidget 의 클래스 정의다냥

2b73530d67875bbf95f4ddb46ae0fc5a.png


믹스인 시스템을 사용하려면 어노테이션을 활용한 메타데이터를 시스템에 넘겨줘야 한다냥

그부분이 잘한 부분이라고 생각냥 하나부터 열까지 JSON 으로 적어야 했다면 짜증났을 거다냥


Mixin 어노테이션은 믹스인 시스템이 어떤 코드를 런타임에 편집해야 하는지 클래스 정보를 알려주는 역할을 한다냥

마인크래프트의 t 버튼을 누르면 나오는 채팅창은 내부적으로 TextFieldWidget 이라는 맴버를

가지고 실제 입력에 대한 처리를 진행한다냥.


836b927c05dad61c259952dfb70afc5f.png


@Inject 어노테이션이 진정한 믹스인의 주역이라고 볼 수 있지냥.

이 어노테이션은 위에서 지정했던 Mixin 어노테이션과 함께 그 클래스에서 어느 부분을 편집(주입)해야 하는지

지시하는 역할을 한다냥.


우리가 수정해야 할 메소드는 TextFieldWidget 의 keyPressed 메소드다냥

이 메소드가 플레이어로부터 들어오는 입력을 직접적으로 통제하는 메소드중 하나거든냥.


@Inject 어노테이션이 부착된 메소드의 내용물을 이제 믹스인이 읽어서 런타임 때 내용을 실제

마인크래프트 코드에 주입시킬꺼다냥


인자는 항상 수정하려는 원본 메소드의 인자 뒤에 CallbackInfo(혹은 CallbackInfoReturnable) 이라는 인자를 붙여줘야된다냥

이러한 세세한 사항은 전부 위에 내가 찍어둔 링크의 위키를 보면 다 나와있다냥.


본문이다냥


373096e25464f3606c9206a86fbad60e.png


keycode 는 어떤 키가 눌렸는지 알 수 있는 정수형의 데이터인데냥 262~265 까지는 방향키고냥

259 는 백스페이스 341 은 왼쪽 알트다냥 나는 알트를 한영 전환키로 했었지냥.


참고로 ime 변수는 들어온 영문 입력을 한글로 치환시켜주는 클래스의 인스턴스다냥

이거까지는 여기에 다 올려주지 않는다냥 나는 개괄적으로 마인크래프트의 어느 부분을 수정해야

한글 패치를 달성할 수 있는지 거기까지만 설명해줄꺼다냥.


다음 수정대상은 charTyped 라는 메소드다냥

@Inject 에 들어간 메타데이터는 다음과 같다냥.


a4bca93444301de0ab7f2319168cdeee.png


charTyped 메소드는 위에서 나온 키 입력 처리와는 틀리게 실제 문자 입력이 되는 것을 처리하는 메소드다냥

그리고 어노테이션에 at 이라는 옵션하고 이상한 문자열이 나와있지냥. 이건 좀 설명해줄께냥


아래는 원래 charTyped 의 코드다냥

84b8a65177c6550080c0630eccedb93a.png


우리가 목적을 달성하려면  if(this.editable) 절 다음 아래 나오는 write 라는 메소드를 호출하기 전에

간섭할 필요가 있다냥. chr 이라는 변수에 담긴 문자 하나가 채팅창 입력란의 끝 부분에 추가되기 전의 코드거든냥


b1c28e550188e9be1a91537ecae3a4eb.png


다시 살펴보자냥,

value 부분에는 INVOKE 가 있으니깐 몬가 호출에 대한 부분일 것 같고

target 부분의 알 수 없는 문자열의 나열은 어디선가 본적 있지 않냥?


value 의 INVOKE 는 target 에 지정된 원본 코드 내의 메소드가 호출 되기 전의 시점에 아래의 코드를

주입하라는 내용으로 요약할 수 있다냥


write 는 TextFieldWidget 자기 자신의 메소드다냥 인자로는 String 하나를 받고 아무것도 리턴하지 않지냥

target 은 메소드 서명을 가리킨다냥 문자열의 구조는 대강 다음과 같다냥.


L[해당 메소드가 정의된 클래스의 패키지 경로를 포함한 슬래시 구분 식별자];[참조할 메소드명](...);[메소드의 반환 형식]

이 메소드 서명에 대한 자세한 사항은 이쪽에 더욱더 상세하게 설명되어 있으니깐 참조해라냥.


004fa920e2f1dd863996a5968179dee5.png


ime 의 getMode 는 alt 입력으로 토글링 되는 한/영 상태를 확인할 수 있는 메소드다냥

저기에서 만약 거짓을 주면 플레이어가 영문 입력 상태를 원하는 것이니깐 무시하란 얘기다냥.


ranged 는 현재 플레이어가 범위 선택(shift 따위로 여러 문자를 선택하는걸 말하는건다냥) 모드에 들어가 있는지

검사하는 변수다냥.


내가 만든 한글 영문 조합 구현은 범위 선택 모드에 있으면 지금까지 조합된 변경사항을 없애는 구현이다냥.

영문을 한글 자모로 변환하고 조합하는 루틴은 여백이 짧으니깐 말 못한다냥 그걸 다 쓸 자신도 없고냥 '3'


위 메소드의 골자는


1. 한글 입력 상태를 원하냥, 원하지 않으면 그냥 바로 종료냥

2. 범위 선택 모드면 지금까지 조합하려고 모아놨던 모든 자모들을 없애고 초기 상태로 되돌리고

3. 지금까지 입력된 문자열이 아직 완성상태에 이르지 못했으면 현재 입력된 문자열에서 마지막 하나를 지우고

새로 갱신된 문자열을 붙이고 아니면 지우지 말고 그냥 붙이고


이런식으로 되어있다냥.


여기까지 적으니깐 힘들어졌다냥 '3'

역시 생각의 흐름대로 적는건 어렵다냥


저렇게 만든 메소드를 돌려보면

짜잔! 마법같이 영문이 한글로 변경되서 부드럽게 입력이 된다냥.


`^`


미안냥 믹스인 시스템하고 한글 패치를 한번에 다 설명하려는

원대한 계획이 무너졌다냥 다 설명하려고 하니깐 힘드네냥


한글 패치 만들어진거 써라냥 '3' 그게 너네들 정신 건강에 이로울것 같다냥

이런건 강좌로 내보낼 수준이 아니였는데 그 생각을 마지막에서야 하네냥


이 글이 모딩 세계를 여행하려는 너네들한테 티끌만큼의 도움이 되었다면 다행냥

안됐어도 괜찮다냥 이건 그냥 생각의 흐름대로 쓴 아무말 대잔치 글이니깐냥


난 자러간다냥 바바냥



1개의 댓글

sasak2
2021.03.10

만들어진게 없어요 ㅠ

컨텐츠
https://www.koreaminecraft.net/files/thumbnails/850/878/002/262x150.crop.jpg?20211018191640
(포션 시리즈) 3편 - 비 2

GlassesFilm

2021-10-18

3

https://www.koreaminecraft.net/files/thumbnails/337/871/002/262x150.crop.jpg?20211014221722

플러그인

달고나 뽑기 in Minecraft 8

BlueRing1017

2021-10-14

6

https://www.koreaminecraft.net/files/thumbnails/848/870/002/262x150.crop.jpg?20211014131239

답안지

한마탐 4주차 / 정오표 + 해설 1

베개냥이

2021-10-14

1