2024. 1. 4
내용 추가2 - ESMifyer Addon - Set unique NPCs persistent도 같이 적용하는 게 좋음

2023.10.02
내용 추가 - SEQ가 있는 경우 ESMifyer랑 Persistentify Those Plugins 적용했다면 SEQ도 새로 생성해야 함

어제 내가 올렸던 ESL, ESP, 및 ESPFE에 대한 정보에 이어서 오늘은 ESM 플래그에 대해 설명하고자 함

The case for flagging every plugin as an esm이라는 글의 댓글을 기반으로 설명할 테니, 영어 되는 사람이면 그 댓글만 읽고 이 글 무시해도 됨


우선 ESM 플래그에 대해 설명하기 위해서는 Persistent reference와 Temporary reference에 대해 먼저 알아야 함

1. Persistent reference와 Temporary reference가 뭐임?

대충 스카이림은 Worldspace라는 국가들(탐리엘 국가, 솔리튜드 국가, 등등)이 있고, 각 국가는 대한민국의 행정구역이 크게 도(또는 특별시나 광역시 등)/시/구 로 나뉜 것처럼 Block(또는 Persistent reference를 위한 특별한 cell)/Sub-Block/Cell로 나뉘어 있음

아래 스샷 참조


스카이림은 2011년에 처음 출시된, 12년이 넘은 옛날 게임이기에 그 당시 컴퓨터 사양으로 오픈월드를 구성하기 위해 다음과 같은 방식을 사용했음

플레이어가 탐리엘 국가의 Block A라는 도, Sub-Block B라는 시의 헬겐 1구에 있다고 가정해보자.(헬겐은 헬겐 1구, 헬겐 2구 등등으로 구성되어 있음)

스카이림 게임 시스템은 툴붕이의 뇌와 비슷한 능력을 갖고 있어서, 너무 많은 걸 불러오면 머리가 터짐. 즉 한번에 불러올 수 있는 데이터에는 한계가 있음

그래서 플레이어가 헬겐 1구에 있다면 헬겐 1구 안에 있는 인물들, 건물들, 아이템들 등등만 불러옴. 헬겐 2구 안에 있는 것들이나 솔리튜드 국가에 있는 것들 등등 헬겐 1구에 있는 것이 아닌 모든 것은 기본적으로 불러오지 않음

만약 플레이어가 헬겐 2구 쪽으로 들어가면 그제서야 헬겐 2구에 있는 것들만 불러오는데, 불러오기 전에 머릿속에 공간을 마련하기 위해 헬겐 1구에 대한 것들을 머릿속에서 비워버림

이렇게 필요할 때마다 불러왔다 비워버렸다 하는 것들을 Temporary reference라고 부름

이렇게 해도 플레이어가 보기엔 오픈월드인 것처럼 보이겠지? 대충 말하자면 네가 서울특별시 용산구에 있을 땐 용산구에 있는 것들만 볼 수 있으니 영등포구라던지 서초구라던지 용산구가 아닌 곳에 있는 건 어차피 안 보이니까 시스템에 부담을 주지 않기 위해 안 불러오는 것임


하지만 이렇게만 하면 문제가 발생함. 예컨대 네가 서울특별시 용산구에 있는 어떤 은행에 방문해서 돈을 통장에 넣고 나서 강남구로 이동한다고 하자.

위의 방식대로면 네가 강남구로 이동하는 순간 용산구에 대한 건 잊어버리니까 용산구에 있는 은행에 돈을 넣었다는 정보도 잊어버리게 되어 강남구에 있는 은행에서는 네가 맡겼던 돈을 인출할 수가 없게 됨

스카이림 시스템에서는 이를 해결하기 위해 은행거래처럼 중요한 사항(스크립트, 퀘스트 등등)과 연관된 것들은 네가 어디에 있든 잊어버리지 말고 항상 불러온 상태를 유지하도록 하는데, 이렇게 플레이어가 어디에 있든 항상 불러오는 것들을 Persistent reference라고 함


2. 그래서 Persistent reference와 Temporary reference가 ESM과 무슨 관계임?

2011년에 출시된 옛날 게임인 스카이림의 시스템은 앞서 말했다시피 툴붕이의 뇌와 비슷해서, 기억할 수 있는 용량에 한계가 있음

한번에 불러와서 처리할 수 있는 reference의 숫자는 2^20 = 1048576개가 한계임(출처: SSE Engine Fixes 모더의 레딧 포스트)

ESM 플래그가 박힌 플러그인의 경우, 해당 플러그인에서 생성한 Persistent reference만 플레이어 위치와 상관없이 항상 불러오고, Temporary reference는 플레이어가 현재 위치한 Cell 안에 있는 것들만 불러옴


ESM 플래그가 없는 다른 모든 플러그인의 경우, 해당 플러그인에서 생성한 Persistent reference와 Temporary reference 전부 다 플레이어 위치와 상관없이 항상 불러옴. 사실상 Temporary reference가 없고 전부 Persistent reference인 것과 다를 바가 없음


그러니 시스템에 부담을 주지 않기 위해서는 ESM 플래그를 달아주는 게 좋음. Legacy of the Dragonborn처럼 대형모드들이 ESM 플래그를 다는 이유가 이것임(확장자가 .esm이면 자동으로 ESM 플래그 있는 것으로 인식함)


3. 그러면 모든 플러그인에 ESM 다는 게 좋지 않음?

스카이림 시스템은 플러그인들을 불러올 때 다음과 같은 순서로 불러옴

(1) 확장자 상관없이 ESM 플래그가 박힌 플러그인들(확장자가 .esm인 플러그인 포함) 및 확장자가 .esl인 플러그인들

(2) 나머지 플러그인들, 즉 확장자가 .esp이고 ESM 플래그가 없는 플러그인들(ESM 플래그가 없는 ESPFE 포함. ESPFE에 대해서는 ESL, ESP, 및 ESPFE에 대한 정보 참조)

모드 오거나이저에서는 ESM 플래그가 박혀있으면 아래 스샷처럼 굵은 글자로 표시해줌


ESM 플래그가 박힌 굵은 글자로 표기된 플러그인들은 설령 네가 모드 오거나이저에서 제일 아래쪽에 둔다고 해도 실제 게임 실행시 알아서 확장자가 ESM 플래그가 없는, 확장자가 .esp인 플러그인들 위쪽으로 올려보냄. 

만약 이런 ESM 플래그가 박힌 플러그인들 여러개를 모드 오거나이저에서 제일 아래쪽에 두었을 경우, 스카이림 실행시 알아서 위쪽으로 올려보내면서 이들 사이의 상대적인 순서가 랜덤으로 흐트러질 수 있으니 게임 실행 전 모더가 언급한 로드 오더에 맞춰서 미리 위쪽으로 올려보내야 함. 안 그러면 예상치 못한 모드 사이의 충돌 등이 발생할 수 있음


사실 이건 그리 중요한 문제가 아님. 제일 중요한 문제는 ESM 플래그가 없는 모드의 플러그인에 ESM 플래그를 무지성으로 박았다간 해당 모드의 스크립트들이나 퀘스트 등이 잘못 실행되어 버그나 게임 강제 종료(이하 CTD)가 발생할 수 있다는 것임

왜 그러느냐? 내가 위에서 언급한 "2. 그래서 Persistent reference와 Temporary reference가 ESM과 무슨 관계임?" 때문임

ESM 플래그가 없는 모드의 플러그인의 경우, 사실상 Temporary reference들 전부 Persistent reference 취급당함(플레이어가 어디에 있든 해당 플러그인에서 생성한 모든 Temporary reference들을 불러옴). 하지만 ESM 플래그를 달면 플레이어가 위치한 Cell에 있는 Temporary reference 외의 다른 모든 Temporary reference들은 불러오지 않음


만약 모더가 ESM 플래그가 없지만 스크립트가 퀘스트 등이 있는 모드를 제대로 만들었다면, 이 스크립트나 퀘스트와 관련된 것들은 전부 Persistent reference로 만들었을 것임. 

하지만 Creation Kit의 버그라던지 모더의 부주의라던지 아니면 의도적으로 "ESM 플래그가 없는 플러그인의 경우 모든 Temporary reference들이 Persistent reference 취급받으니까 굳이 Persistent reference로 만들지 않고 Temporary reference로 만듦"이라는 행위를 저질렀다면, 이 플러그인에 무지성으로 ESM 플래그를 다는 순간 플레이어가 속하지 않은 Cell에 있지만 스크립트나 퀘스트 등과 연관된 Temporary reference들은 불러와지지 않아서 버그나 CTD가 발생하게 됨

우리의 베데스다도 이런 찐빠를 저질러서 넥서스 모더들이 스크립트나 퀘스트 등과 연관된 것들 중 Temporary reference인 것들을 Persistent reference로 바꿔주는 패치를 만들기도 함

대표적인 예로 스카이림 Anniversary Edition 출시하면서 무료로 배포한 Fishing 모드(ccBGSSE001-Fish.esm)의 "Rubbish Retrieval" 퀘스트와 연관된 것들 중 던스타와 모탈에 있는 것들을 Temporary reference로 만드는 찐빠를 저질러서 던스타와 모탈 쪽으로는 진행되지 않는 버그가 있음. 이는 (CC Fishing) Rubbish Retrieval Bugfix를 설치하면 해결됨


4. 그러면 ESM 플래그는 달 수 없음?

ESMifyerPersistetify Those Plugins를 쓰면 스크립트 및 퀘스트 등과 연관되었지만 Temporary reference인 것들을 찾아서 전부 Persistent reference로 바꿔줌

실제로 ESMifyer의 Post에서 helgen reborn을 검색하면 ESMifyer를 이용해서 성공적으로 Helgen Reborn에 ESM 플래그를 달았다는 글이 있음 

Persistentify Those Plugins 모더는 Description에서 ESMifyer에 있는 몇몇 문제점들(스크립트 혹은 퀘스트와 연관되지 않은 몇몇 Temporary reference들을 과도하게 Persistent reference로 바꾸는 등)을 개선했다고 하는데, 이것만 이용해서 Helgen Reborn에 ESM 플래그를 달려고 했더니 내 환경에서는 CTD가 발생하는 문제가 있었음

Helgen Reborn에 ESMifyer를 적용하고 Persistentify Those Plugins를 이어서 적용하면 CTD가 발생하지 않은 것으로 볼 때, 아마 Persistentify Those Plugins가 놓치는 항목들이 있어서 그런 것으로 추정됨

하지만 ESMifyer가 놓치는 항목들을 Persistentify Those Plugins가 잡는 경우도 꽤 자주 겪었으니, 개인적으로는 ESMifyer 먼저 적용 후에 Persistentify Those Plugins 적용하는 걸 추천함

그리고 둘 다 놓치는 항목들은 ESMifyer Addon - Set unique NPCs persistent가 잡는 경우가 있다는 제보가 들어왔음
비록 ESMifyer Addon - Set unique NPCs persistent의 Description 제일 위쪽에는 "ESMifyer Addon - Set unique NPCs persistent가 놓치는 항목들을 Persistentify Those Plugins가 잡아주고, 불필요한 부분들은 제외한다"는 문구가 있지만, 그래도 ESMifyer Addon - Set unique NPCs persistent까지 포함해서 3개 다 돌리는 걸 추천함

4 - (1). ESMifyer 어떻게 사용함?

영어를 몰라서, 혹은 ESMifyer 설명글 읽기 귀찮은 사람을 위해 적용법을 설명하겠음

- 우선 ESMifyer를 받는다(Manual Download 외엔 선택지가 없으니 Manual Download 눌러서 압축파일 받으면 됨)

- 압축파일 안에 있는 ESMifyer.pas를 SSEEdit이 설치된 폴더(통팩이라면 아마 모드 오거나이저 있는 폴더의 Tools 폴더 안에 SSEEDIT 이런 식의 폴더가 있을 것임) 안의 Edit Scripts 폴더 안에 넣는다(Edit Scripts 폴더 안에는 .pas 파일들이 잔뜩 있을 것임. 이 .pas 파일들과 같은 공간에 ESMifyer.pas를 넣으면 됨)

- SSEEDIT을 실행하고 ESM 플래그를 달고 싶은 플러그인을 불러온 후, 해당 플러그인을 마우스 오른쪽 버튼으로 클릭 -> Apply Script... 클릭 -> Filter 아래쪽 Script 항목의 오른쪽 탭을 클릭한 후, 스크롤 내려서 ESMifyer를 찾아서 클릭한 후, OK버튼을 클릭

아래 스샷 참조


- Persistent reference로 바뀐 항목들은 굵은 글자로 표기될텐데, 아래 스샷처럼 굵은 글자로 표기된 항목 안에 있는 사항들 전부 펼친 후, Persistent 안에 굵은 글자로 표기된 항목을 덮어쓰는 게 없는지 확인한다

아래 스샷 참조

- 만약 덮어씌우는 게 있다면(주로 ESM 플래그가 달리기 이전 버전을 기준으로 작업한 패치들로 인해, Persistent reference여야 하는 것을 Temporary reference로 하는 경우가 많음) 해당 항목을 클릭 후 Record Flags에 Persistent가 있도록 해야 함(초록색이든 아니든 상관없이, 네가 ESMifyer로 돌린 플러그인에서 바꾼 항목이 가진 Persisent flag가 다른 어떤 모드에 의해서도 덮어씌워지지 않아야 함)

아래 스샷 참조

- 저장하고 SSEEDIT을 닫는다


4 - (2). Persistentify Those Plugins 어떻게 사용함?

위의 "4 - (1). ESMifyer 어떻게 사용함?" 이랑 비슷함

- 우선 Persistentify Those Plugins를 받는다(Manual Download 외엔 선택지가 없으니 Manual Download 눌러서 압축파일 받으면 됨) 

- 압축파일 안의 Edit Scripts\00_Persistentify_Those_Plugins.pas를 SSEEdit이 설치된 폴더 안의 Edit Scripts 폴더 안에 넣는다(Edit Scripts 폴더 안에는 .pas 파일들이 잔뜩 있을 것임. 이 .pas 파일들과 같은 공간에 00_Persistentify_Those_Plugins.pas를 넣으면 됨)

- SSEEDIT을 실행하고 ESM 플래그를 달고 싶은 플러그인을 불러온 후, 해당 플러그인을 마우스 오른쪽 버튼으로 클릭 -> Apply Script... 클릭 -> Filter 아래쪽 Script 항목의 오른쪽 탭을 클릭한 후, 스크롤 내려서 00_Persistentify_Those_Plugins를 찾아서 클릭한 후, OK버튼을 클릭

- Persistent reference로 바뀐 항목들은 굵은 글자로 표기될텐데, 아래 스샷처럼 굵은 글자로 표기된 항목 안에 있는 사항들 전부 펼친 후, Persistent 안에 굵은 글자로 표기된 항목을 덮어쓰는 게 없는지 확인한다

아래 스샷 참조

- 만약 덮어씌우는 게 있다면(주로 ESM 플래그가 달리기 이전 버전을 기준으로 작업한 패치들로 인해, Persistent reference여야 하는 것을 Temporary reference로 하는 경우가 많음) 해당 항목을 클릭 후 Record Flags에 Persistent가 있도록 해야 함(초록색이든 아니든 상관없이, 네가 ESMifyer로 돌린 플러그인에서 바꾼 항목이 가진 Persisent flag가 다른 어떤 모드에 의해서도 덮어씌워지지 않아야 함)

아래 스샷 참조

- 저장하고 SSEEDIT을 닫는다


4- (3). ESMifyer Addon - Set unique NPCs persistent 어떻게 사용함? 

위의 "4 - (1). ESMifyer 어떻게 사용함?" 이랑 비슷함

- 우선 ESMifyer Addon - Set unique NPCs persistent를 받는다(Manual Download 외엔 선택지가 없으니 Manual Download 눌러서 압축파일 받으면 됨) 

- 압축파일 안의 Set_unique_NPCs_persistent.pas를 SSEEdit이 설치된 폴더 안의 Edit Scripts 폴더 안에 넣는다(Edit Scripts 폴더 안에는 .pas 파일들이 잔뜩 있을 것임. 이 .pas 파일들과 같은 공간에 Set_unique_NPCs_persistent.pas를 넣으면 됨)

- SSEEDIT을 실행하고 ESM 플래그를 달고 싶은 플러그인을 불러온 후, 해당 플러그인을 마우스 오른쪽 버튼으로 클릭 -> Apply Script... 클릭 -> Filter 아래쪽 Script 항목의 오른쪽 탭을 클릭한 후, 스크롤 내려서 Set_unique_NPCs_persistent를 찾아서 클릭한 후, OK버튼을 클릭

- Persistent reference로 바뀐 항목들은 굵은 글자로 표기될텐데, 아래 스샷처럼 굵은 글자로 표기된 항목 안에 있는 사항들 전부 펼친 후, Persistent 안에 굵은 글자로 표기된 항목을 덮어쓰는 게 없는지 확인한다

아래 스샷 참조

- 만약 덮어씌우는 게 있다면(주로 ESM 플래그가 달리기 이전 버전을 기준으로 작업한 패치들로 인해, Persistent reference여야 하는 것을 Temporary reference로 하는 경우가 많음) 해당 항목을 클릭 후 Record Flags에 Persistent가 있도록 해야 함(초록색이든 아니든 상관없이, 네가 ESMifyer로 돌린 플러그인에서 바꾼 항목이 가진 Persisent flag가 다른 어떤 모드에 의해서도 덮어씌워지지 않아야 함)

아래 스샷 참조

- 저장하고 SSEEDIT을 닫는다


위의 세 과정을 거친 후, SEQ 파일이 있다면 SEQ 파일도 새로 생성해야 함
방법은 ESPFE Follower의 "=> HOW TO CREATE SEQ FILE <=" 아래쪽 "Spoiler: Show" 버튼 클릭하면 스샷으로 알려줌

만약 위의 세 과정을 거쳐서 ESM 플래그를 달았는데 해당 모드 플레이시 CTD가 나거나 튕긴다면 ESMifyer랑 Persistentify Those Plugins랑 ESMifyer Addon - Set unique NPCs persistent 셋 다 놓친, 스크립트 및 퀘스트와 관련된 Temporary reference가 있다는 것임. 이건 해당 모더만이 알고 있을테니, 모더가 자비롭게 ESM 플래그를 달고 제대로 변환해주길 기도하셈