Sprucians

모딩 이야기/세메이아의 삽질 공방 6건이 검색되었습니다.

안녕하세요, 세메이아입니다.


저도 모딩 거의 못 합니다(...) 하지만 여러 강좌들과 달리 이 글은 방법을 설명하는 게 아니라 그냥 코드를 복붙할 수 있게 하는 게 목표입니다. 그냥 설명 읽고 그대로 따라하시면 됩니다.


뭐, 그러면 일단 기초 환경 세팅부터 하겠습니다.




1. 환경 설정

준비물: 64비트 컴퓨터, 의지




1-1. JDK


Java Development Kit.


http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

여기서 다운로드 가능합니다. 자바 개발 환경에 필수적입니다.




1-2. Eclipse


통합 개발 툴입니다. 이클립스 없이 메모장 써도 되긴 합니다만... 그러고 싶어요? (진지)


https://www.eclipse.org/downloads/

여기서 다운로드 가능합니다. Windows의 경우 설치기가 있습니다.




1-3. Forge Src


Minecraft Forge SouRce Code.


저는 1.7.10버전으로 진행하므로 1.7.10 기준으로 하겠습니다. 1.10.2는 티머님에게 부탁드리세요.


https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.7.10.html



들어가 보시면 이런 화면이 뜰 텐데, Src를 눌러서 다운로드하시면 됩니다. 권장(Recommended) 버전을 추천합니다.



다운로드한 Src 파일을 압축해제해 주세요. 폴더명은 상관없지만 경로에 한글이 들어가지 않도록 해 줍시다.



이렇게 나왔을 겁니다.



시프트 우클릭 후 여기서 명령 창 열기를 선택해 주세요. 그러면 CMD가 나옵니다.



다음 명령어를 입력하세요.


gradlew setupDecompWorkspace


설치가 안 될 시에는 2가지 이유가 있습니다.


1. JDK가 없다 -> 설치하세요.

2. 마인크래프트가 없다 -> 설치하세요. 멀티MC 안 됩니다.



잘 끝났군요. 보통 몇 분 걸립니다.



그러면 다음 명령어를 입력합시다.


gradlew eclipse


여기까지 성공하면 준비는 끝났습니다.




1-4. 워크스페이스 설정



이클립스를 처음 설치했다면 바로 경로 설정 창이 뜰 테고, 이전에 작업하던 게 있었다면 이전 워크스페이스가 뜰 텐데 File -> Swith Workspace -> Other... 로 들어가시면 됩니다.



경로 설정을 해 둡시다. SRC 폴더 내의 eclipse 폴더로 설정하시면 됩니다.



짠!



기본적으로 존재하는 com.example.examplemod 패키지(폴더라고 생각하시면 됩니다)와 그 아래 있는 ExampleMod 클래스(코드 덩어리라고 생각하시면 됩니다)를 삭제해 줍시다.


이걸로 환경 설정은 끝났습니다.




1-5. 모드 정보 입력



src/main/java를 우클릭해 새 패키지를 만들어 둡시다. 패키지 이름은 다음과 같이 합시다.


(제작자).(모드이름)



전 이렇게 했습니다.


제작자는 semeia, 모드 이름은 HanaNoNisuisen으로 하겠습니다.



패키지를 우클릭해 새 클래스를 만들어줍시다.



이렇게 되어 있을 겁니다. package semeia.HanaNoNisuisen;은 경로 설정이고 public class HanaNoNisuisen { }은 클래스의 내용입니다.



일단 먼저 몇 가지 클래스를 임포트(import)해 줍시다. 임포트에 대한 자세한 설명은 생략하겠습니다. 그냥 다른 클래스의 정보를 가져오는 구문이라고 보시면 됩니다. 그 클래스에서 정의한 함수나 뭐 그런 것들을 사용 가능하게 하죠. 3줄에 다음 구문을 입력합시다.


import cpw.mods.fml.common.Mod;

import cpw.mods.fml.common.Mod.EventHandler;

import cpw.mods.fml.common.event.FMLInitializationEvent;

import cpw.mods.fml.common.event.FMLPreInitializationEvent;



public class HanaNoNisuisen { 윗줄에 다음 코드를 적어둡시다.


@Mod(modid = HanaNoNisuisen.MODID, version = HanaNoNisuisen.VERSION)


빨간 줄은 곧 고칠 겁니다.



중괄호 안에 다음 코드를 적어둡시다.


public static final String MODID = "HanaNoNisuisen";

public static final String VERSION = "(모드 버전)";


NotEnoughPearls라고 되어 있는 건 제 다른 모드에서 코드를 베껴서 그런 겁니다. 모드 이름을 넣어주세요.


이걸로 모드의 메인 클래스가 만들어졌습니다.



다음은 src/main/resourcesmcmod.info를 열어 주세요.



정보를 입력합시다.


modid - 모드 ID. 아까 쓰던 모드 이름을 넣어 주시면 됩니다.

name = 모드 이름. 겉으로 표시되는 이름입니다.

description = 모드 설명.

version = 모드 버전. 기본적으로 메인 클래스에서 버전 숫자를 가져오니 비워둬도 됩니다.

mcversion = 놔두시면 됩니다.

url = 모드 홈페이지.

updateUrl = 모드 업데이트 페이지.

authorList = 제작자 목록입니다.

credits = 뭐라고 해야 할까... 대충 기본적으로 있는 예시 보시면 아실 겁니다. 도움 준 사람들에게 감사 문구 넣는 거 비슷한 거에요. 아마.



저장 후 Debug 버튼을 누르시면 모드가 적용된 마인크래프트가 실행됩니다.



짠! 4 mods loaded 보이시죠?



잘 적용된 것을 보실 수 있습니다.


그러면 여기까지.

안녕하세요, 세메이아입니다. 한동안 세메이아유틸은 방치할 것 같습니다. CBS도 시즌 2가 열리고 있고 곧 Sprucians Season 7이 오픈하기 떄문이죠!


뭐, 그래서 오늘은 삽질 이야기.


별 내용은 없습니다. 그저 4시간 동안 엔티머님과 틱팀머튽을 질문으로 괴롭히면서 열심히 삽을 떴지만 끝내 오어젠에 실패했고 격노했다는 내용일 뿐입니다.

안녕하세요, 세메이아입니다.


오늘도 아침부터 모딩을 시작했죠



자, 오늘은 갑옷을 만들어 봅시다. 갑옷도 도구와 마찬가지로 매티리얼에 따라 능력치가 결정되는데, 갑옷의 경우는 ArmorMaterial을 사용합니다.



이게 ArmorMaterial 추가 구문입니다.



빨간줄은 net.minecraft.item.ItemArmor.ArmorMaterial을 임포트하면 해결됩니다.



결과물. 도구랑 매우 비슷하죠?


public static ArmorMaterial sprucian = EnumHelper.addArmorMaterial("Sprucium", 2015, new int[]{5, 8, 7, 5}, 50);

public static = 다음 객채를 생성하라

ArmorMaterial sprucian  = sprucian이라는 ArmorMaterial을 추가합니다

= EnumHelper.addToolMaterial(); = EnumHelper로 괄호 안의 ArmorMaterial을 추가해서 sprucian이라는 ArmorMaterial을 그걸로 정의합니다.

("Sprucian", 2015, new int[]{5, 8, 7, 5}, 50) = 추가할 ArmorMaterial을 설정합니다. 이름은 "Sprucian", 기본 내구도는 2015입니다. 실제 내구도는 여기에다가 투구는 11, 흉갑은 16, 바지는 15, 신발은 13을 곱한 값이죠. 방어력은 투구, 흉갑, 바지, 신발이 각각 5, 8, 7, 5입니다. 마법성은 50입니다.


자, 매티리얼은 추가했으니 아이템 생성용 클래스를 짭시다.





나는 만든다 클래스




자세한 설명은 생략



이렇게 됩니다. 자세한 설명은 생략(...) 귀찮아요



클래스를 활용해서 만든 아이템에 정보를 삽입해 줍시다.

자세히 보시면 문제가 있습니다(...)



당연히 크래시. 고쳤습니다.



그 김에 가독성을 위해 주석 좀 달아놨죠.



잘 되는군요.




아이템 등록 구문을 좀 줄였습니다. 단순히 기존 걸 한줄로 줄인 겁니다. 기존에는 앞에서 만든 아이템에 첫 줄에서 정보를 삽입하고 둘째 줄에서 등록했는데 이번에는 같은 줄에서 정보를 삽입하고 바로 등록합니다.


자, 이번에는 드디어 조합법을 해야겠네요. 하는 법은 전혀 모르지만 티머님이 도와주시겠지(어이



그래서 가르침을 받고 있습니다.



잘 되는군요.


* 조합법 추가 설명


조합법 추가에는 3가지 함수가 있습니다. 무형조합법을 추가하는 GameRegistry.addShapelessRecipe()와 유형조합법을 추가하는 GameRegistry.addRecipe()GameRegistry.addShapedRecipe()가 바로 그것입니다.


먼저 무형조합법부터 알아보도록 하겠습니다.


GameRegistry.addShapelessRecipe(new ItemStack(SemeiasUtilsItems.PlateAkashium), SemeiasUtilsItems.MaruyuHammer, SemeiasUtilsItems.IngotAkashium);


간단합니다. new ItemStack()으로 결과 아이템을 먼저 지정하고, 그 뒤에는 재료 아이템을 죽 늘어놓으면 됩니다. 이 경우는 일회용 망치(SemeiasUtilsItems.MaruyuHammer)와 아카슘 주괴(SemeiasUtilsItems.IngotAkashium)로 아카슘 판(SemeiasUtilsItems.PlateAkashium)을 만드는 조합법입니다.


자, 그러면 유형조합법입니다. 유형조합법에는 GameRegistry.addShapedRecipe()와 GameRegistry.addRecipe() 두 개가 있는데 둘의 차이점은 무엇일까요?


GameRegistry.addShapedRecipe()의 경우에는 무조건 그 모양대로만 조합할 수 있습니다. 예를 들어 (석탄/공백/공백 막대/공백/공백 공백/공백/공백)으로 설정했다면 addShapedRecipe()의 경우는 무조건 저 모양으로만 가능합니다. (공백/석탄/공백 공백/막대/공백 공백/공백/공백) 같은 것은 되지 않습니다.


그런데 GameRegistry.addRecipe()의 경우 좀 더 융통성이 있습니다. 예를 들어 횃불의 조합법을 (석탄 막대)로 설정했다면 (석탄/공백/공백 막대/공백/공백 공백/공백/공백)이든 (공백/석탄/공백 공백/막대/공백 공백/공백/공백)이든 뭐든 상관 없이 (석탄 막대)라는 기본 틀만 지킨다면 다 조합이 됩니다. 또한 조합법을 좌우로 뒤집어도 결과물이 그대로 나옵니다. MTRM의 Mirrored와 같습니다.


그러므로 일반적으로는  GameRegistry.addRecipe()를 사용하는 것이 좋습니다.



잘 됩니다. 임시적으로 철 텍스처를 빌려서 사용했습니다. 텍스처 없는 건 판.



텍스처 만들어 박았습니다.



굳굳



판도 잘 만들어지는군요. 저기 깨진 건 일회용 망치입니다.



투명 설정도 하고 갑옷 텍스처도 만들었습니다. 퀄은 저 모양이지만.


그러면 여기까지. 곧 0.3.0버전이 출시됩니다. 자고 나서는 광물을 만들 예정이에요.

'모딩 이야기 > 세메이아의 삽질 공방' 카테고리의 다른 글

모딩 강좌 - 1. 환경 설정  (5) 2017.02.28
아 ! 이 얼마나 무서운가  (3) 2017.02.16
Semeias Utils 0.2.1  (0) 2017.02.15
Semeias Utils 로고  (4) 2017.02.14
모드 개발 근황 - 2017년 2월 14일  (8) 2017.02.14






내용물은 전혀 없으니 기대하지 마세요 절대.

절.대.




Semeias Utils-0.2.1.jar


1분작입니다


안녕하세요, 세메이아입니다. 회 맛있죠 저도 좋아합니다. 아니 이게 아니라.


최근 모드를 만들고 있습니다.


분명 처음 목표는 스프 시즌 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

Prev 1 Next