수정 전.

수정 후.



@SideOnly는 클래스고 메소드고 뭣이고 상관없이 붙어있는 내용물을 뒤틀린 황천으로 같이 끌고 간다는 걸 알려 드린 적이 있습니다. 바로 이전 글이죠. 그리고 이 @SideOnly 처리도 Transformer를 이용하는 것 같습니다. 저번에 화로 만졌던 그거 있죠? 그런 걸 쓴다는 겁니다.


그런데.. FMLLoadingPlugin 클래스에 붙이는 @TransformerExclusions가 제 발목을 잡았습니다. 이 어노테이션은 세상에나 세상에나 Transformer의 수정을 방어하는 기가 막힌 능력을 가졌습니다. 해당 어노테이션으로 전달한 문자열로 시작하는 package를 가진 클래스는 로드될 때 Transformer#transform(...)가 호출되지 않습니다.


그런데 제가 그만 착각을 해 버렸습니다. 위 설명대로 전달한 문자열로 시작하는 package를 가진 클래스를 보호하는 옵션을 전달한 문자열과 동일한 package를 가진 클래스를 보호하는 것으로 착각해 버린 것. 


덕분에 두 개만이 적용되어야 했던(틱팀이 그렇게 착각했던..) Transformer Exclusions의 범위는 TTMP Core의 패키지 전체로 확대되어 버렸고, 따라서 바이트코드를 날려버리는 @SideOnly도 TTMP Core에서는 작동하지 않았습니다.



다음 상황은 불 보듯 뻔합니다. @SideOnly가 붙은 클래스를 사용하는 메소드는 해당 클래스 자체도 없어지기에 @SideOnly로 없애 주어야 "이 클래스 무슨 클래스냐"에러가 발생하지 않습니다. 그런데 @SideOnly의 효과가 TTMP Core에서는 없었으니 메소드도 안 사라졌고... DefaultStateMapper(로그에서는 IStateMapper)도 찾을 수 없었습니다.


..이상 틱팀의 디버깅 일지였습니다. 계속 TTMP Core에서 똥을 싸대면서 이거 왜 안돼냐 빼애액거리고 있다가 멘탈이 거세게 나가서 아무 클래스나 열어보면서 지푸라기라도 잡아 헤매고 있다가 IFMLLoadingPlugin의 저 어노테이션을 보는 순간 뇌에 벼락을 맞은 기분이었습니다.

뭔가 프로그래밍을 하다 보면 수상한 부분을 잘 찾아내게 되는 기분입니다(...). 실수하는 양은 변함이 없지만서도 말입니다. 깔!깔! 이게..아닌데...



여러분 TTMP는 안전합니다. 빨리 슈퍼너프의 세계로 오십시오.




공지 목록


[TTMP에 관심이 있으신 분들께 드리는 말씀]


[코노조에 어서오세요]


Posted by Tictim indie.

앙녕하새오. 틱티밈니다.

할마리업슴미다. 앙넝히게세오.



틱팀. 모딩근황.



ASM. 성공. 틱팀. 진화.


1.10.2 환경에 발을 들인 이후로 틱팀의 잉여력은 하늘을 찌르고 모드도 날이 갈수록 더 병신같아지고 있읍니다. 이번엔 대놓고 너프폭격을 가하는 모드를 만들었으니 그 이름은....


TTMP SUPERNERF


..대놓고 이름이 슈퍼너프인 모드 되겠습니다.

TTMP SUPERNERF는 TTMP에 있으면 재밌을 것 같은 너프를 모아서 만든 모드입니다. 그 내용물은

플레이어의 무적 시간 제거 (<<켜고 끄기 가능)

용암 버킷 연료에서 제거 (<<켜고 끄기 가능)

플레이어/몹 영구 투명화 (<<켜고 끄기 가능)

플레이어 영구 실명 (<<켜고 끄기 가능)

어두운 곳에 있을 시 '공포'에 의해 피해를 입음 (<<켜고 끄기 가능)

젖었을 시에 '추위'에 의해 피해를 입음 (<<켜짐, 추운 바이옴에 있을 때 한정, 꺼짐으로 조절 가능)

코블스톤 설치 불가 (<<켜고 끄기 가능)

나무 판자 설치 불가 (<<켜고 끄기 가능)

횃불 설치 불가 (<<켜고 끄기 가능)

모든 토끼를 킬러 버니(타입 99, 플레이어를 확2타로 보내버리는 무시무시한 선공몹입니다)로 변신시킴 (<<켜고 끄기 가능)

클라이언트 감마 강제 조정


이 있습니다. 이거 다 적어놓고 보니 뭔가 TTMP에서 몇 개나 켤수 있을지도 의문이 드는....음...크흠... 아무튼.

이 모드는 너프만 하는 모드는 아닙니다. 몇 가지 유틸리티 기능을 추가하죠. 유틸리티 기능이란

NEI F7(밝기 오버레이)

주울 수 없는 멈춰 있는 화살 제거

되겠습니다.


...예. F7 기능은 뜯어왔습니다. 으하하하!!! 그야 NEI는 너무 무거우니까요. 좆까 NEI 너의 정체성은 이미 사라졌어


먼저, 화살 제거는 서버의 틱 관리를 위해서 추가했습니다. TTMP는 이게 없으면 서버가 굉장히 몸살앓이를 할 것 같은(...) 환경이거든요.

공개하지 않았지만 지난 달의 테섭에서는 엄청나게 짧은 연사속도와 미친듯한 어그로 범위로 인해 TTMP의 에임핵 한조(..)들은 화살 렌더링으로 TTMP 클라이언트의 프레임 드랍을 책임지는 필수요소가 되었습니다. 그래서 플레이어 배려 차원(...)에서 화살을 제거하게 되었습니다.


또 NEI의 F7(밝기 오버레이)가 뭔지 모르시는 분들을 위해 설명드리자면, 주변 블럭의 밝기를 측정하여 몹이 스폰되는 곳에 노란색/빨간색 X표를 쳐 줍니다. 지상 같이 밤낮에 따라서 몹 스폰 여부가 갈리는 곳은 노란색, 동굴 같이 항상 어두운 곳은 빨간색.

이런 식이죠.

그런데 이걸 가지고 있는 모드가 NEI다 보니, 클라이언트가 상당히 무거워질 수밖에 없었습니다. 그래서 틔틘의 인생철학 "좋으니까 베낀다"를 따라서 뜯어왔습니다. 베끼는 것도 꽤나 힘들었던 건 안비밀. 진짜입니다. ㅅㅂ 왜 NEI는 JEI도 깔고 앉고 코드치킨코어도 깔고 앉는데 코드치킨코어는 지가 깔고 앉는 코드치킨 라이브러리 탑재는 안 해주는지. 진짜 비대해질대로 비대해진 돼지뚱땡이입니다. 님들 다 NEI 쓰지마셈. 좆구림.


또한 이 모드에 데스카운터를 넣을 생각입니다. 그러니까 지금까지 HQM에서 갖다 쓰고 있던 사망 페이지를 이 모드에 병합해버리겠다 이겁니다. 뭔가 TTMP 전용 모드가 되어가고 있는 듯 하지만 반은 사실이니 부정하지 않습니다.

..사실 저도 그런 거창한 거 만들긴 어렵고 계속 HQM을 쓸 생각이었습니다만,.....

HQM의 제작자가 단 한 번도 UUID를 써 본적이 없는 듯이 초보적인 오류를 뿜어버리는 바람에 정이 떨어져서 갈아타게 되었습니다.


JAVA알못들을 위한 설명충 등판

UUID는 JAVA에서 기본으로 제공하는 클래스 중 하나이자 식별자 표준입니다. 이 UUID는 엔티티가 가지고 있으며 월드에 똑같은 UUID를 가지고 있는 엔티티는 생성되지 않습니다. 따라서 UUID로 이 엔티티가 지금 월드에 있는지, 어디에서 뭘 하고 있는지 등등을 알 수 있습니다. 플레이어가 로그인할 때 뜨는 "UUID of player ~~~ is 9167c025-21ab-4c72-8cc3-b20ec2bf4277" 하는 식의 문자열의 뒷부분이 바로 UUID입니다.

그런데...이 UUID는 엔티티가 가지고 있는 겁니다. UUID라는 클래스 자체는 마인크래프트에 대해서 아무것도 모릅니다. "Tictim"이라는 단어를 주고 UUID를 받으려 해 봤자 받는 건 9167c025-21ab-4c72-8cc3-b20ec2bf4277같은 UUID "표기법"을 지키지 못해서 일어나는 크래시 뿐입니다. 왜 저런 초보적인 실수를 했는지 모르겠지만.. 암튼 이런 모드를 TTMP에는 넣을 수 없었습니다(....). 반성하세요 HQM


...이상 잘난척이었습니다.


그리고 용암 버킷 연료 삭제는...꽤 힘들었습니다. 아니 엄청 힘들었습니다. 지금도 힘듭니다.


화로의 타일엔티티는 기본적으로 static method에서 burn time을 얻도록 되어 있습니다. 그런데 이 static method가 아무런 이벤트 비슷한 처리도 없이 바닐라 아이템을 만져버리니 아예 바닐라 아이템을 수정할 수 없었던 것.

1.10.2 하지 마라


덕분에 TTMP Core는 진정한 코어모드의 길로 들어서게 되었습니다...바로 ASM이죠.



ASM이란... 이 프로그램의 구성 요소를 뿌리부터 지우고 다시 쓰는 기술입니다. 유용하지만 위험하고 호환성을 해치며 별로 추천되지는 않는 기능이죠. 마인크래프트에서는 해당 기능을 코어모드의 형태로 지원합니다. Loading Plugin이라고 해야 하나요? 잘 모르겠습니다. 허허.

아무튼... 화로의 메소드를 뜯어버리기 위해서 해당 기능을 넣게 되었습니다. 이걸 만들기 위해서 갈려나간 과거의 틱팀의 멘탈에 X키를 눌러 Joy를 표하십시오. XXXXXXXXXXXXXXX.


..농담이 아니고 진짜 힘들었습니다. 하 ㅅㅂ 왜 그렇게 복잡한 건지... 그리고 왜 모든 것은 만들어 놓고 보면 그렇게 간단해 보일 수가 없는 건지.................하.............................

 이 Transformer는 변신하는 고철덩어리...가 아니라! ASM을 구사하는 마법의 클래스입니다.


그렇게 맨 위 짤이 탄생하게 되었습니다. 죽어라 마인크래프트....죽어라...모장....

슈퍼재탕


허나! 안일해진 틱팀의 눈앞을 가로막는 거대한 장벽이 하나 더 있었으니....

바로 SideOnly 에러 되겠습니다.


SideOnly란, 마인크래프트가 서버와 클라이언트를 나누는 기준?입니다. SideOnly(CLIENT)클라이언트에서만 존재하고, SideOnly(SERVER)Dedicated 서버, 즉 jar파일로 배포되는 서버 파일에서만 존재합니다. 그런데 SideOnly의 작동 방식이 웃긴 게, @SideOnly라고 표시된 것들이 있으면 밑도 끝도 없이 그냥 날려버립니다. 지워버린다는 얘기죠. 따라서 @SideOnly가 붙은 것들에 접근하게 되면 서버(혹은 클라이언트)가 즉시 터져버리게 됩니다.

여기서는 Dedicated 서버를 실행했을 때 존재하지 않는 클래스인 IStateMapper를 발견했고, 이 클래스를 로딩하는 중에 오류가 발생해 버린 것.

평범한 SideOnly 실수라면 쉽게 고칠 수 있었겠지만 이건 그렇게 쉽지가 않았습니다. IStateMapper는 분명 로드되지 않는 위치에 있었고, 이 위치에서 계속 크래시가 일어나니 틱팀의 멘탈은 이미 가루가 되어 하늘을 날아다니는 중.


이 오류는 아직도 고쳐지질 않고 있습니다. 먼저 가장 의심되는 TTMP Core에서 Block으로 여러 실험을 해 볼 생각. 그게 안 되면....음....글쎄요. TTMP가 해체될 수도 있습니다(극단적)


넝담입니다. 반드시 고쳐서 어썸한 근황 싸지르도록 하겠습니다. 이상 틱팀이었습니다. 똥글 다 읽어 주셔서 감사드립니다. 사랑과 관심 환영합니다. 지적과 훈수도 환영합니다.


그리고 존잘님..........Block 문제 맞는 거 같아여...........도와주세여.........................


불에 닿은 지 1초....목숨을 잃었다....

▲ 어썸한 차회예고. 어썸한 틔퍼널의 어썸한 근황을 보시라



++ 알아도 안 좋은 사실들

해당 모드는 틱팀의 모드 중에서 가장 가벼운 모드입니다. 2위는 워터싱크입니다. 하지만 코어모드가 무거우므로 무거운 모드입니다.

TTMP SuperNerf의 아이콘은 이상한 꿈틀꿈틀 머시기입니다....꿈틀꿈틀 머시기가 상징하는 의미는 하찮은 5마리 플라나리아의 정월대보름 축제합일입니다. 하나가 되자!

저 SideOnly 오류는 이제 릴리즈겠지?라고 생각한 안일한 틱팀이 모든 모드를 버전업시키고 빌드한 다음 배포하기 직전에 테스트하던 찰나에 발견되었습니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ큐ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ




공지 목록


[TTMP에 관심이 있으신 분들께 드리는 말씀]


[코노조에 어서오세요]


Posted by Tictim indie.

인퍼널 몹 한정으로 디스폰 옵션을 꺼 봤더니 개판이 나 버림


그러나 이 좀비가 다시 떨어지는 일은 없었다. 스폰 0.1초만에 하늘로 솟구친 그는 거짓말 같이 디스폰되어 영영 볼 수 없게 되었따.


본격 /kill @e(플레이어, 아이템을 포함한 모든 엔티티를 죽임) 내성 골드 E 레퀴엠 틔퍼널 좀비.




... ... ...



아 아닙니닷! 이거 알파입ㅂ니닸!





P.s. 저 슬픕니다.

마크야 아프지마

Posted by Tictim indie.