강좌/Minecraft Mod 제작2015. 10. 28. 20:42

 

강의 환경 : forge-1.7.10-10.13.0.1160-1.7.10

강의 목표 :

  1. 마인크래프트가 실행될 발생하는 FML 기본 이벤트들을 이해할 있다.

 

이번 강좌에서는 FML 기본 이벤트들에 대해 알아보겠습니다.

 

저번 '모드 기반 제작' 강좌에서,

  • FMLPreInitializationEvent
  • FMLInitializationEvent
  • FMLPostInitializationEvent

를 배웠었죠?

 

사실 이들 말고도 이런 종류의 이벤트들이 더 있습니다.

 

이들은 모두 같은 방식으로 이용할 수 있습니다:

 

  1. 모드 기반 클래스에 @EventHandler가 붙은 메소드를 통해 이벤트를 받습니다.
  2. 이벤트 인자를 통해 받을 이벤트의 종류를 결정할 수 있습니다.
  3. 이벤트 인자 내부 필드/메소드들을 통해 이벤트와 관련된 여러 작업을 할 수 있습니다.

 

우선 이미 보았던 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 기본 이벤트들에 대한 강좌를 마치도록 하겠습니다.

Posted by Abastro