모드 개발 근황 - 2017년 2월 14일
안녕하세요, 세메이아입니다. 회 맛있죠 저도 좋아합니다. 아니 이게 아니라.
최근 모드를 만들고 있습니다.
분명 처음 목표는 스프 시즌 7을 위한 한 줄기 희망이었는데 만들고 보니 한 줄기 어둠이 될 것 같습니다. 가성비 좋은 초반 아이템들을 만들겠다는 장대한 목표는 어디론가 사라지고 너프에 유용한 망치, 커터, 줄, 용접기가 탄생했습니다(...)
SemeiasUtils.class입니다. 엔티머님 모드의 ModMain.class에 해당하죠. 보통 (제작자).(모드이름).(모드이름).class로 하는데 특이하게도 티머님은 entimer.customarmor.ModMain.class를 쓰시더라고요. 뭐 하여튼 전 평범하게 semeia.semeiasutils.SemeiasUtils.class입니다. Semeias입니다, Semeia가 아닙니다! Semeia는 단수 주격이고 Semeias는 단수 속격입니다.
SemeiasUtilsItems.class입니다. 별로 없죠. 스프루슘(...) 주괴, 판, 막대, 칼날과 엄청난 내구도(...)의 도구가 있습니다. 그 외에 망치, 커터, 줄칼, 용접기가 보이고요.
보시다시피 망치, 커터, 줄칼, 용접기도 성능은 영 아니지만 도구로 취급됩니다. 전적으로 제 무능력 때문으로, 내구도 있는 아이템을 만들 능력이 없다 보니 도구 취급하는 꼼수를 사용했습니다. 그 때문에 망치는 돌과 석탄을 캘 수 있고 용접기는 철검 수준의 공격력을 자랑합니다. 속도는 처참하지만.
일반 아이템 추가 클래스. 이거 만드느라 1시간 넘게 삽질했습니다. 그래도 하고 나니 쉬워져서 다행. 저거 만들기 전엔 일일이 하나하나 클래스 만들어서(...) 추가하는 병신같은 방법을 썼습니다.
...였지만 말이죠.
그러면 아이템이 늘어날수록 읽어야 하는 클래스 숫자도 계속 늘어나게 됩니다. 결과는 물론 발적화. 따라서 여러분은 클래스 양산을 멀리하고 단일클래스 우려먹기를 가까이하는 것이 좋습니다.
결과물입니다.
Sprucium Ingot(...)
lang파일은 나중에 만들기로.
그런데...
도구를 만들어야 하는데 도저히 안 되더군요(...) (허락 받고) 티머님 모드를 디컴파일했지만 그래도 잘 안 되고.
그래서 전문가를 불렀습니다.
오오 갓티머님
끄응...
결국 성공했습니다.
이유는 어이없게도 private final String name;을 뒤에 한 번 더 적었기 때문입니다(...) 이미 최종적으로 재정의한 것을 다시 재정의하려니 될 리가 없죠.
(...)
참고로 아침에는 크래시가 나길래 몇 번을 살펴봤는데도 문제를 모르겠길래 스프 챗에 올렸는데 카핏이 바로 지적하기를...
IngotSprucium = new SemeiasItems("IngotSprucium");
GameRegistry.registerItem(IngotSprucium, "ingotSprucium");
PlateSprucium = new SemeiasItems("PlateSprucium");
GameRegistry.registerItem(PlateSprucium, "plateSprucium");
PlateSprucium = new SemeiasItems("RodSprucium");
GameRegistry.registerItem(RodSprucium, "rodSprucium");
PlateSprucium = new SemeiasItems("BladeSprucium");
GameRegistry.registerItem(BladeSprucium, "bladeSprucium");
(...)
* 모르는 분들을 위한 설명: 앞에 보면 public static Item IngotSprucium;이라는 부분이 있죠. 이건 IngotSprucium이라는 아이템을 추가하는 부분입니다. 그러면 이 IngotSprucium이 뭔지를 설정해야 하는데, 그 역할은 IngotSprucium = new SemeiasItems("IngotSprucium");가 수행합니다. 그렇게 되면 앞에서 만든 IngotSprucium에다가 아이템 "IngotSprucium"이 삽입되죠. 그리고 마지막으로는 GameRegistry.registerItem(IngotSprucium, "ingotSprucium");이 이 IngotSprucium을 게임에 "ingotSprucium"라는 이름으로 등록합니다.
그런데 보시면 PlateSprucium에 아이템을 3번 삽입하고 있습니다. 그러니까 아이템이 분명 있을 건 다 있으니 이클립스에서는 아무런 문제가 없다고 뜨는데, 실제로 쓰려고 하면 PlateSprucium 하나에 3개의 아이템을 넣으려고 하니 작업을 수행하지 못하고 크래시를 뿜어내는 겁니다(...)
무엇보다 가장 병신같은 건 제가 5번이나 코드를 검토하고서도 이 문제를 발견하지 못했다는 겁니다. 고마워요 카핏.
여러분 저는 병신입니다!
결국 추가에 성공했습니다.
배경이 흰색인 건 단순히 들떠가지고 배경 투명화를 스킵하고 바로 켜본 거니까 신경쓰지 마시기 바랍니다(...)
나머지 도구들도 추가중... 어라??????????????
엥, 공격력이 똑같네? 게다가 크리에선 블럭이 안 캐지네? 다 검이잖아??? 다검이잖아 여담으로 일본어로는 진짜 다이아 검이라고 쓰더라고요
네, 여기서 제가 병신같은 실수를 또 다시 저질렀습니다. 역시 세메이아다워 기대를 저버리는 법이 없어
public static Item.ToolMaterial sprucium = EnumHelper.addToolMaterial("Sprucium", 6, 20150110, 15.0F, 20150110.0F, 50);
public static Item.ToolMaterial forge = EnumHelper.addToolMaterial("Forge", 0, 50, 1.0F, 2.0F, 1);
(중략)
public static Item SwordSprucium;
public static Item AxeSprucium;
public static Item PickSprucium;
public static Item SpadeSprucium;
public static Item HoeSprucium;
(중략)
public static void registerItems()
{
(중략)
SwordSprucium = new SemeiasSwords("SwordSprucium", sprucium);
GameRegistry.registerItem(SwordSprucium, "swordSprucium");
AxeSprucium = new SemeiasSwords("AxeSprucium", sprucium);
GameRegistry.registerItem(AxeSprucium, "axeSprucium");
PickSprucium = new SemeiasSwords("PickSprucium", sprucium);
GameRegistry.registerItem(PickSprucium, "pickSprucium");
SpadeSprucium = new SemeiasSwords("SpadeSprucium", sprucium);
GameRegistry.registerItem(SpadeSprucium, "spadeSprucium");
HoeSprucium = new SemeiasSwords("HoeSprucium", sprucium);
GameRegistry.registerItem(HoeSprucium, "hoeSprucium");
}
이상이 당시 제가 스프루슘 도구들을 추가하는 데 사용하던 코드입니다. 하이라이트 힘들었어요 뺴애액. 하여튼 찬찬히 살펴보겠습니다. 일단 유일하게 정상작동하던 검을 기준으로 ARABOPSIDA.
마인크래프트의 도구(검도 도구입니다)들에는 ToolMaterial이 있습니다. 이 ToolMaterial에 따라서 도구의 스탯이 결정됩니다. 도구의 성능에 영향을 주는 것은 오직 ToolMaterial뿐이죠. 기본적은 ToolMaterial에는 나무, 돌, 철, 금, 다이아몬드 5가지가 있습니다.
자, 그러면 이 ToolMaterial에 새로운 재료인 Sprucium을 추가해야 되겠죠? 그런데 마크 자체적으로는 이걸 지원 안 하고(...) 마인크래프트 포지, 정확히는 포지 모드로더에 포함된 Enum 기능으로 추가해야 합니다. 그 부분이 바로 public static Item.ToolMaterial sprucium = EnumHelper.addToolMaterial("Sprucium", 6, 20150110, 15.0F, 20150110.0F, 50);입니다. 이걸 뜯어보면 다음과 같습니다.
public static = 모릅니다. 저 자바 전혀 모릅니다. import가 그 뭐시기고 extends는 상속에 final은 최종 재정의를 의미한다는 것밖에 모릅니다.
Item.ToolMaterial sprucium = sprucium이라는 ToolMaterial을 추가합니다
= EnumHelper.addToolMaterial(); = EnumHelper로 괄호 안의 ToolMaterial을 추가해서 sprucium이라는 ToolMaterial을 그걸로 정의합니다.
("Sprucium", 6, 20150110, 15.0F, 20150110.0F, 50) = 추가할 ToolMaterial을 설정합니다. 이름은 "Sprucium", 채광 레벨은 6, 내구도는 20150110, 채광 속도는 15.0, 공격력은 20150110.0, 마법성은 50입니다.
자, 이렇게 ToolMaterial sprucium을 추가 완료했습니다. 그러면 이제부터는 이 재료를 실제로 사용하는 도구를 추가해야겠지요? 일단 public static Item SwordSprucium;으로 SwordSprucium이라는 아이템을 추가한 후 그 아이템에다 스프루슘 검을 추가해야겠지요. 이 추가 작업은 SemeiasSwords 클래스에서 이루어집니다. 그곳으로 가 봅시다.
하이라이트 넣기 귀찮습니다(...) 자세한 건 생략하고, 중요한 건 다음 부분입니다.
private final String name;
public SemeiasSwords(String name, ToolMaterial sprucium) {
super(sprucium);
this.name = name;
}
그 사이 코드 좀 고쳤는데 거기서 거기입니다. 일단 private final String name;이 name이라는 스트링을 지정합니다. 그 다음 SemeiasSwords라는.. 이걸 뭐라고 하죠? 함수인가? 하여튼 그걸 이용해서 2개의 입력 - 스트링 name과 툴매티리얼 sprucium - 이 입력되면 그에 따라 이러쿵저러쿵 아이템을 정의해서 메챠쿠챠하는 겁니다. 그리고 name은 name으로 정의했죠. 따라서 이걸 임포트한 SemeiasUtilsItems.class에서는 앞에서 추가한 아이템 이름 = new SemeiasSwords("아이템 이름", ToolMaterial) 구문을 이용해 추가한 아이템에 정보를 삽입할 수 있게 됩니다.
완벽하죠? 뭐가 문제냐고요?
그 삽입하는 부분을 다시 한 번 보여드리겠습니다.
SwordSprucium = new SemeiasSwords("SwordSprucium", sprucium);
GameRegistry.registerItem(SwordSprucium, "swordSprucium");
AxeSprucium = new SemeiasSwords("AxeSprucium", sprucium);
GameRegistry.registerItem(AxeSprucium, "axeSprucium");
PickSprucium = new SemeiasSwords("PickSprucium", sprucium);
GameRegistry.registerItem(PickSprucium, "pickSprucium");
SpadeSprucium = new SemeiasSwords("SpadeSprucium", sprucium);
GameRegistry.registerItem(SpadeSprucium, "spadeSprucium");
HoeSprucium = new SemeiasSwords("HoeSprucium", sprucium);
GameRegistry.registerItem(HoeSprucium, "hoeSprucium");
이제 아시겠죠?
네, 분명 검(SemeiasSwords.class)뿐만 아니라 도끼(SemeiasAxes.class), 곡괭이(SemeiasPicks.class), 삽(SemeiasSpades.class)과 괭이(SemeiasHoes.class)까지 모두 클래스와 메서드???인가 하여튼 아이템 정보 삽입할 때 쓰는 그걸 만들어 놨는데도 멍청하게 도구 5개 전부를 검으로 만들어서 삽입했습니다. 뭐 이런 정신나간 짓을 다 한 거야.
뭐, 하여튼 고쳤습니다. 이번에는 자력으로. 예전 같은 수모는 당하지 않으리(...)
그렇게 했습니다. 이번에는 lang 파일을 만드는 중. 대체 왜 이클립스 기본 세팅이 UTF-8이 아닌 거야
짠.
짠! 아, 공격력 내렸습니다.
덤으로 가공 도구들 - 망치, 커터, 줄칼, 용접기 - 도 만들었습니다. 텍스처가 개판이지만 넘어갑니다. 그리고 얘네는 나름 무기 취급입니다. 그래서 이렇게 용접기로 패리할 수 있습니다(...) 뭐 이런 막장이.
자, 이렇게 일단 아이템과 도구들은 대충 만들었고, 다음 차례는 이 아이템과 도구들을 만들 조합법을 추가하는 것이겠군요.
근데 조합법 어떻게 만들지???
그렇게 제 멘탈은 펄버라이저를 통과했습니다.
... 하지만 여기서 멈출 수는 없는 법.
과연 자바는 0도 모르는 세메이아는 모드 제작에 성공할 것인가!
다음 이 시간에.
'모딩 이야기 > 세메이아의 삽질 공방' 카테고리의 다른 글
모딩 강좌 - 1. 환경 설정 (5) | 2017.02.28 |
---|---|
아 ! 이 얼마나 무서운가 (3) | 2017.02.16 |
모드 개발 근황 - 2017년 2월 15일 (0) | 2017.02.16 |
Semeias Utils 0.2.1 (0) | 2017.02.15 |
Semeias Utils 로고 (4) | 2017.02.14 |