강의 환경 : forge-1.7.10-10.13.0.1160-1.7.10
강의 목표 :
마인크래프트가 실행될 때 발생하는 FML 기본 이벤트들을 이해할 수 있다.
이번 강좌에서는 FML 기본 이벤트들에 대해 알아보겠습니다.
저번 '모드 기반 제작' 강좌에서,
- FMLPreInitializationEvent
- FMLInitializationEvent
- FMLPostInitializationEvent
를 배웠었죠?
사실 이들 말고도 이런 종류의 이벤트들이 더 있습니다.
이들은 모두 같은 방식으로 이용할 수 있습니다:
- 모드 기반 클래스에 @EventHandler가 붙은 메소드를 통해 이벤트를 받습니다.
- 이벤트 인자를 통해 받을 이벤트의 종류를 결정할 수 있습니다.
- 이벤트 인자 내부 필드/메소드들을 통해 이벤트와 관련된 여러 작업을 할 수 있습니다.
우선 이미 보았던 FML 기본 이벤트들을 더 자세히 살펴봅시다.
1.시작시 발동되는FML 기본 이벤트들
이벤트 | 시기 | 주요 용도 | |
클라이언트 | 서버 | ||
FMLPreInitializationEvent | 모드 로딩 시 1순위 | * 모드 초기화 작업 *아이템/블록/엔티티 등록 | |
FMLInitializationEvent | 모드 로딩 시2순위 | *PreInit 다음에 수행되어야 하는 초기화 작업 *조합법 등의 작업 등록 *모드간의 호환성 작업 (초기 수정) | |
FMLPostInitializationEvent | 모드 로딩 시 3순위 | *모드간의 호환성 작업 (후기 수정) |
이 중FMLPreInitializationEvent이벤트만이 (유용한) 메소드들을 지니고 있습니다.
이벤트 / 메소드 이름 | 형태 | 용도 | |
FML- Pre- Initialization- Event | getSourceFile | File …() | 소스 파일의 경로를 가져옵니다. |
getModMetadata | ModMetadata …() | 모드 ID, 이름 등의 정보를 담고 있는 객체를 가져옵니다. | |
getModConfigurationDirectory | File …() | 모드 컨피그들이 들어있는 경로를 가져옵니다. ((마크 위치)\config) | |
getSuggestedConfigurationFile | File …() | 해당 모드에 대해 추천되는 컨피그 파일 경로를 제공합니다. | |
getAsmData | ASMDataTable …() | 해당 모드에 대한 ASM 데이터를 가져옵니다. | |
getVersionProperties | Properties …() | 해당 모드의 버전 속성을 가져옵니다. | |
getModLog | Logger …() | 해당 모드를 위한 Logger를 가져옵니다. (디버깅 목적으로 유용합니다) |
특히 getModLog, getModContigurationDirectory/getSuggestedConfigurationFile은 각각 디버깅, 컨피그 부분에서
유용하게 쓸 메소드들이니 꼭 기억해 두세요!
2.상태에 관련된FML 기본 이벤트들
이제 상태에 관련된 FML 기본 이벤트들을 알아봅시다.
이들은 주로 모드를 불러오거나, 서버가 시작되거나 끝날 때 발동됩니다.
이들 대부분은 상당히 중요하며 요긴하게 쓰이는 이벤트들이므로 꼭 기억해 두세요.
(FMLInitializationEvent 등지도 상태 관련 이벤트이지만, 편의상 따로 두었습니다)
이벤트 | 시기 | 주요 용도 | ||
클라이언트 | 서버 | |||
FMLConstructionEvent | 모드 로딩 전 (모드 기반 클래스가 처음 로딩되었을 때) | 모드 기반 클래스 로딩 | ||
FMLLoadCompleteEvent | 모드 로딩 완료 후 | 모든 로딩이 완료되었을 때 작업을 수행합니다. (PostInit에 등록을 하는 모드들을 호환시키기 위해 필요합니다..) | ||
FMLServerAboutToStartEvent | 월드 시작시 1순위 | 서버 세팅 로딩 후 (PostInit후) | 서버 세팅 로딩 | |
FMLServerStartingEvent | 월드 시작시 2순위 | 서버 월드 로딩 후 | 월드 관련 작업 서버 커맨드 등록 | |
FMLServerStartedEvent | 월드 시작시 3순위 | 서버가 시작된 직후 | 서버 최종 세팅 | |
FMLServerStoppingEvent | 월드 종료시 1순위 | 서버 종료시 1순위 | 데이터 저장, 백업 등 | |
FMLServerStoppedEvent | 월드 종료시 2순위 | 서버 종료시 2순위 | 데이터 저장, 백업 등 |
(볼드체로 쓴 이벤트들이 중요합니다!)
여기서 유용한 메소드는 단 3개입니다.
FMLServerAboutToStartEvent or FMLServerStartingEvent #getServer(): 서버를 관리하는 객체인 MinecraftServer의 인스턴스를 줍니다.
FMLServerStartingEvent #registerServerCommand(ICommand command): 서버 커맨드를 등록합니다. (커맨드를 등록하는 유일한 방법!)
3.기타FML 기본 이벤트들
기타로 다음과 같은 이벤트들이 추가로 있습니다.
이벤트 | 시기 | 주요 용도 | |
클라이언트 | 서버 | ||
FMLFingerprintViolationEvent | 모드 파일의 무단 변경이 감지되었을 때 | 보안용 (*Fingerprint(지문)를 지원하는 모드에 대해서만 발동됩니다) | |
FMLModDisabledEvent | 모드를 비활성화했을 때 (*현재 이 버전에선 작동하지 않습니다) | 모드 비활성화 지원 | |
FMLMissingMappingsEvent | 월드에 저장된String ID에 해당하는 블록/아이템이 없을 때 | 1. 업데이트 시에 아이템/블록 ID를 바꾼 경우 2. ID가 바뀌었을 때 경고를 하고 싶은 경우 | |
FMLModIdMappingEvent | 월드에 저장된 int ID가 다른 int ID로 해석될 때 | 주로 1.6->1.7 업데이트 시 ID 시스템의 변화로 인한 문제를 감지하기 위함 | |
IMCEvent | FMLPreInit…과 FMLInit… 사이 | 모드간 통신 (즉 호환성을 위함) |
1. FMLFingerPrintViolationEvent
모드 파일의 무단 변경이 감지되었을 때 발동되는 이 이벤트는 4개의 public 멤버변수를 지닙니다.
- Boolean isDirectory: 변경된 파일이 Directory인지 확인
- Set<String> fingerprints: 받아들인 파일 지문(Fingerprint)의 목록
- File source: 문제가 발생한 소스
- String expectedFingerprint: 예상한 파일 지문
이 이벤트를 이용하기 위해서는,
저번 강좌에 사용했던 @Mod 어노테이션의 certificateFingerprint필드에
예상되는 지문이 반드시 지정되어 있어야 합니다.
(꼭 필요하면 사용하시되 과신을 하지 마세요)
2. FMLModDisabledEvent
모드가 불활성화될 때 발동되(어야 하)는 이벤트입니다. ModList Gui의 Disable 버튼과 관련이 있는듯 하지만,
현재 버전에서는 아직 이용할 수 없습니다.
3. FMLMissingMappingEvent
월드에 저장된 ID에 해당하는 블록/아이템이 없을 때 발동되는 이벤트입니다. (이때 ID는 String입니다)
List<MissingMapping> get()을 통해 자신의 모드에 대한 ID들을,
List<MissingMapping> getAll()을 통해 자신의 모드에 대한 들을 가져올 수 있습니다.
이 각각의 MissingMapping들은 String 형태의 ID와 int 형태의 ID를 지니고 있는데,
이들을 확인한 후 ignore/ warn/ fail을 통해 무시/경고/실패를 알리거나,
Remap을 통해 알고 있는 블록/아이템들을 사용하도록 지정할 수 있습니다.
4. FMLModIdMappingEvent
1.6에서 1.7로 업데이트되면서 ID 시스템이 바뀌게 되었는데, 이로 인해 발생할 수 있는 오류를 감지하기 위한 이벤트입니다.
(1.6까지 항상 아이템/블록의 식별자는 정수였으나, 1.7부터 String으로 바뀌었습니다.
이로 인해 아이템/블록 저장/로딩 방식도 약간 바뀌면서 문제가 발생합니다)
이 이벤트에는 다음과 같은 멤버변수 하나가 있습니다.
ImmutableList<ModRemapping> remappedIds;
ModRemapping은 월드에 저장된 int id와, 바꿀 int id를 함께 지니고 있으며
remapTarget으로부터 블록인지 아이템인지를 알 수 있고,
tag로부터 블록 혹은 아이템의 이름을 알 수 있습니다.
이 이벤트를 통해서는 감지만 가능하며 어떤 것도 수정할 수 없습니다.
5. IMCEvent
마지막의 IMCEvent는 Forge가 모드간 통신을 가능하게 해준 Inter Mod Commons기능의 일부입니다.
이 부분은 언젠가 기회가 되면 따로 강좌하기로 하겠습니다.
이상으로 FML 기본 이벤트들에 대한 강좌를 마치도록 하겠습니다.
'강좌 > Minecraft Mod 제작' 카테고리의 다른 글
[1.7.10] 모드 현지화 (0) | 2015.11.04 |
---|---|
[1.7.10] 커스텀 블록 제작 (2) | 2015.11.04 |
[1.7.10] 모드 기반 제작 (0) | 2015.10.06 |
[1.7.10] Minecraft Forge 개발자용 버전 다운로드 및 설정하기(gradle) (0) | 2015.10.06 |
Minecraft Forge 소개 (0) | 2015.10.06 |