2023.5.4 00:43 추가: Persistent와 Temporary, ESM에 대하여도 읽어볼 것을 권장함


ESL 플래그 다는 것에 대해, 틀린 것으로 밝혀진 몇몇 옛날 정보들 혹은 잘못 알고 있는 정보들 있는 것 같아서 한번 내가 아는대로 ESL, ESP 및 ESL 플래그 다는 것에 대한 정보글을 작성하고자 함

1. ESL 플래그 없는 플러그인(예시: SkyrimSE.esm)에서 새로 정의된 CELL 혹은 Worldspace 안에 새로운 데이터를 생성하거나 그 CELL 혹은 Worldspace 안에 있는 데이터를 수정하는 패치를 만들고자 하는 경우, ESPFE로 만들어도 아무 문제 없음

2. ESL 플래그 달린 플러그인, 혹은 .esl 플러그인도 다른 플러그인의 마스터 파일이 될 수 있음(예시: Skyrim Anniversary Edition에서 새로 추가된 Survival 및 Rare Curious, Skyrim Landscape and Water Fixes)

3. 심지어는 Sky UI SE도 ESL 플래그 박아도 됨(Is it safe to ESLify SkyUI_SE.esp? 참조. Unofficial Skyrim Special Edition Patch 만든 Arthmoor도 그렇게 사용중이며, 모드 2000개 넘게 설치한 나도 이로 인한 CTD나 버그 발생한 없음)

혹시나 저 Is it safe to ESLify SkyUI_SE.esp? 링크 타고 들어가도 못 찾겠으면 https://i.imgur.com/PbbsaSJ.png 참조


CTD 등이 발생한다면 그건 ESPFE 때문이 아니라 스크립트에서 참조하는 데이터에 실수로 Deleted 플래그를 박아서 지워버렸거나 패치를 잘못 만들었거나 했을 가능성이 높음

만약 특정 데이터를 비활성화하는 패치를 만들고 싶다면, 되도록이면 Deleted 플래그 대신 Initially Disabled 플래그 박는 게 좋음. Deleted 플래그 박힌 데이터를 스크립트가 참조하는 경우 확정 CTD 발생하지만, Initially Disabled 박힌 데이터를 스크립트가 참조하는 경우 CTD까지는 발생하지 않음. 다만 그 스크립트가 정상 작동한다고 보장할 수는 없음. 간혹 GetFormFromFile이라는 함수로 직접 데이터를 참조하는 스크립트들도 존재하니, 네가 비활성화하고자 하는 데이터를 참조하는 스크립트가 존재하지 않는다고 100% 확신할 수 없다면 데이터 비활성화는 되도록이면 피하는 게 좋음


대부분의 내용은 ESPFE라는 명칭을 처음으로 도입한 넥서스 모더의 정보글인 On ESPFEs and Proper Patch Plugin Placement에서 가져왔음

내일 저녁에 시간 된다면 ESM 플래그에 대해서도 내가 알고 있는 정보글을 작성해보고자 함


들어가기에 앞서, 용어 정의부터 시작하겠음

1. 순수 ESL: 확장자가 .esl이고 ESM 플래그가 달려있지 않은 플러그인

2. 순수 ESP: 확장자가 .esp이고 ESL 플래그나 ESM 플래그가 달려있지 않은 플러그인

3. ESPFE: 순수 ESP에 ESL 플래그를 박은 플러그인

4. ESL 플러그인: 순수 ESL, ESPFE, ESM 플래그가 달린 순수 ESL, ESM 플래그가 달린 ESPFE를 모두 지칭하는 용어


(1) ESL이 뭐임?

esp와 esl이란 무엇이며 무슨 차이인가 라는 정보글에 이미 자세히 설명되어 있음

스카이림에는 활성화할 수 있는 플러그인 갯수에 제한이 있음. 이 제한을 어느 정도 피하고자 스카이림 스페셜 에디션(이하 SE) 1.5.3 버전에서 새로 도입된 것이 ESL임(출처: Plugin Files and You)

스카이림 레전더리 에디션(이하 LE)에서는 플러그인을 00부터 FE까지 총 16^2 - 1 = 255개 활성화할 수 있음(16진법 사용함). FF는 게임 플레이하면서 새로 생성되는 NPC나 아이템 등의 데이터를 임시 저장하기 위해 사용되므로, 플러그인 갯수가 255개를 넘어간다면 스카이림이 제대로 인식하지 못해 버그나 게임 강제 종료(이하 CTD)가 발생함

아파트를 00동부터 FE동까지만 지을 수 있는 벧엗스타라는 국가가 있다고 생각해보자

이 국가의 부동산 정책은 특이해서, 가족 구성원 수가 2명이든 1000명이든 상관없이 한 가족당 무조건 대충 1600만명이 들어갈 수 있는 아파트 한 동을 무조건 소유해야만 함

이렇게 하면 가족 구성원 수가 적은 경우 낭비되는 공간이 꽤 많겠지? 그래서 이 벧엗스타라는 정부에서 FE동을 통째로 매입한 후, 가족 구성원 수가 적은 가족들을 FE동 내 000호부터 FFF호까지(각 호는 대략 최대 2048명까지 들어갈 수 있음) 순차적으로 한 호씩 들어갈 수 있도록 정책을 바꿨음(대신 FE동은 개인 혹은 단체가 소유할 수 없게 됨)

이렇게 SE 1.5.3버전부터는 ESL 플러그인을 제외한 나머지 플러그인들이 00부터 FD까지 총 254개만 활성화할 수 있도록 하고, ESL 플러그인은 FE:000부터 FE:FFF까지 총 16^3 = 4096개 활성화할 수 있도록 바꿨음

그 덕분에 SE에서는 모드를 256개 이상 설치하고 활성화할 수 있게 됨


(2) 그럼 더 많은 모드를 활성화하고자 한다면 모드를 ESL 플러그인으로 바꾸면 되겠네?

안타깝지만 ESL 플러그인에는 몇가지 주의해야 할 사항들이 있어서 무지성으로 그렇게 할 수는 없음


(3) ESL 플러그인으로 바꾸고자 할 때 주의사항은 뭐임?

1. 세이브파일 생성하던 당시의 ESL 플러그인들 사이의 순서를 세이브 이후 바꾸게 된다면 그 세이브파일은 더 이상 제대로 작동하지 않으니 버리고 처음부터 메인 화면의 New Game으로 새 게임 시작해야 함

2. 플러그인 내에 새로 생성한 데이터들의 전체 갯수가 2048개 이하여야 함(기존의 다른 플러그인 내의 데이터를 수정하는 경우 이 갯수에는 카운트되지 않으니 패치 파일들은 ESPFE로 만드는 게 좋음. 이유는 추후 설명). 그 이상인 플러그인을 ESL 플러그인으로 바꾸면 버그 발생함

3. 내부 FormID가 바뀌니까 이에 맞춰서 추가 작업해야 할 사항들이 발생함. 이 작업 안 하면 버그 발생함. 만약 ESL 플러그인으로 바꾸기 이전에 맞춘 패치들이 존재했다면 그 패치들도 전부 수정 작업이 필요함.

4. ESL 플러그인에서 새로 추가되는 CELL 혹은 Worldspace가 존재할 경우, 그 ESL 플러그인의 로드 오더 순서가 FE:000이 아닐 경우, 이 새로 추가된 CELL 혹은 Worldspace 내의 데이터를 수정하는 패치가 존재할 경우 그 CELL 혹은 Worldspace 안의 모든 Temporary reference들은 게임 내에서 사라지고 나타나지 않게 됨


(3) - 1. ESL 플러그인 순서를 함부로 바꾸면 안 되는 이유

(1). ESL이 뭐임?에서 설명했던 우리의 벧엗스타 국가에서는 아파트 각 동의 소유주만 기록함. 그러니 16동에 살던 가족이 AD동으로 이주해도 아무 문제 없이 인식할 수 있음(ESL 플러그인 외의 다른 플러그인들 순서 바꿔도 일반적으로 큰 문제가 발생하지 않는 이유)

하지만 FE동은 벧엗스타 국가 소유이니 그 안의 010호가 055호로 이사갈 경우, 이를 벧엗스타 국가가 알 수 없으니 세금 고지서 등이 잘못 전달될 수 있고 이로 인해 문제가 발생하게 됨

FE동에 085호까지만 입주한 상태에서 새로운 가족이 FE동으로 들어오고자 하는 경우, 086호부터 시작해서 087호, 088호 순으로 순서대로 들어가기만 한다면 문제는 발생하지 않음. 다만 086호가 나중에 088호로 이사갈 경우 벧엗스타 국가는 이를 알지 못해서 세금 고지서 등이 잘못 전달되어 문제가 발생하게 됨

따라서 ESL 플러그인 순서를 바꾸면 순서 바꾸기 이전 세이브들은 전부 나가리되어서 버려야 하게 됨. 


(3) - 2. 플러그인 내에 새로 생성된 데이터들의 전체 갯수가 2048개 이하여야 하는 이유

이건 (1). ESL이 뭐임?을 읽어보면 당연하다는 것을 알게 됨. FE동의 각 호에는 2048명까지만 들어갈 수 있으니까


(3) - 3. 내부 FormID가 바뀌니까 이에 맞춰서 추가 작업해야 할 사항들이 발생하는 이유

(1). ESL이 뭐임?에서 설명했던 우리의 벧엗스타 국가에서는 각 개인의 주소인 FormID를 다음과 같이 정의함

ESL 플러그인 외의 다른 플러그인들: (동 숫자) - (이 동에 거주하는 해당 거주인이 가족 구성원 중 몇 번째로 태어났는지)

ESL 플러그인: FE - (호 숫자) - (16진법으로 800 + 이 호에 거주하는 해당 거주인이 가족 구성원 중 몇 번째로 태어났는지)

일단 몇 번째로 태어났는지 출생신고서에 등록(게임 세이브)한 이후엔 이를 무단으로 수정해서는 안 됨.

만약 무단으로 수정했다면 관련 기관들에게 왜 수정하게 되었는지 사유서 등을 작성해야만 하며(추가 작업이 필요하게 됨), 그렇게 하지 않는다면 이로 인한 법적 문제가 발생하게 됨(CTD나 버그 발생)

기존 00동부터 FD동 사이에 거주하던 가족(구성원 숫자가 2048명 이하)이 FE동으로 이사(ESL 플러그인으로 바꿈)하는 경우, FormID를 ESL 플러그인 FormID 법칙에 맞춰서 수정하는 사유서 등을 작성해야 하는데, 이를 SSEEDIT에서는 Compact FormIDs라고 함


(3) - 4. ESL 플러그인에서 새로 추가되는 CELL 혹은 Worldspace가 존재할 경우, 그 ESL 플러그인의 로드 오더 순서가 FE:000이 아닐 경우, 이 새로 추가된 CELL 혹은 Worldspace 내의 데이터를 수정하는 패치가 존재할 경우 그 CELL 혹은 Worldspace 안의 모든 Temporary reference들은 게임 내에서 사라지고 나타나지 않게 됨


위의 (3) - 2를 만족하면서 (3) - 4. 관련사항이 없을 경우에만 ESL 플러그인으로 바꿀 수 있음.  만약 관련사항이 없다면 esp에 esl 플래그 박는 법 참조 따라했을 때 Warning:Plugin has new CELL(s) which won't work when turned into ESL and overridden by other mods due to the game bug 뜨는 플러그인이어도 ESL 플러그인으로 바꿀 수 있음

만약 Unofficial Skyrim Downgrade Patcher의 BestOfBoth 사용해서 Skyrim SE로 다운그레이드하면서 Survival Mode(ccQDRSSE001-SurvivalMode.esl)를 추가한다면 이 Survival Mode가 무조건 FE:000을 차지하니 사실상 ESL 플러그인에서 새로 추가하는 CELL 혹은 Worldspace 내의 데이터를 수정하는 패치가 존재한다면 그 CELL 혹은 Worldspace 안의 모든 Temporary reference들은 게임 내에서 사라지고 나타나지 않는 버그가 발생함

즉 CELL 혹은 Worldsapce를 새로 추가하는 플러그인에서 새로 추가하는 데이터 갯수가 2048개 이하이고, 이 새로운 CELL 혹은 Worldspace 내의 데이터를 수정하는 패치가 존재하지 않을 때에는 이 플러그인을 ESL 플러그인으로 바꿀 수 있음. 아래 글 읽어보고 해당되는 사항에 맞춰 작업하면 됨


SSEEDIT에서 자세한 추가 작업 사항들은 esl로 변환하기(스크립트 사용하는 모드도 가능) 참조하면 되는데, 몇가지 추가 사항들이 있음

1. ESL 플러그인으로 바꾸고자 하는 모드에 대한 패치들 혹은 그 모드에 의존하는 다른 모드들이 존재하는 경우, ESL 플러그인으로 바꾸지 않는 게 정신건강에 좋음(불가능하다는 건 아니지만 고생에 비해 얻는 게 거의 없을 것임). 특히 만약 넥서스 등에 있는, ESL 플러그인이 아닌 모드라면 그 모드의 Requirements 탭을 열었을 때 Mods requiring this file에 뭔가 하나라도 존재한다면 ESL 플러그인으로 바꾸지 않는 게 좋음(예: Unofficial Skyrim Modder's Patch 같은 건 ESL 플러그인으로 바꾸지 않는 게 정신건강에 좋음)

만약 정말 바꾸고 싶다면 네가 사용하는 해당 패치들 포함해서 전부 SSEEDIT으로 불러온 후, esp에 esl 플래그 박는 법 참조 따라했을 때 Warning:Plugin has new CELL(s) which won't work when turned into ESL and overridden by other mods due to the game bug가 뜨지 않을 경우에만 esl로 변환하기(스크립트 사용하는 모드도 가능) 혹은 아래 2번부터 5번 사항 중 해당되는 경우에 맞춰서 "ESL 플러그인으로 바꾸고자 하는 모드" + "해당 모드 관련 모든 패치들"에 적용하면 됨


2. ESL 플러그인으로 바꾸고자 하는 모드가 script 폴더를 포함하거나, Dynamic Animation Replacer (이하 DAR) 사용해서 에니메이션 추가, SPID나 Base Object Swapper, Keyword Item Distributor, Formlist Manipulator, Animated Object Swapper 사용해서 뭔가를 추가하거나 수정, Payload Interpreter나 Precision, POISE, True Directional Movement 등으로 모션 추가하거나 수정하거나 패치, SKSE INI 파일 수정, 등등이 있는 경우: ESLify Everything 사용하면 됨. 다만 네가 활성화한 스크립트 안에 FormID를 직접 참조하는 GetFormFromFile 함수를 사용하는지를 일일이 체크해야 하기 때문에 시간 엄청 오래 걸려서 난 사용하지 않음. 만약 모션 관련 모드이고 모더가 ESL 플러그인이 아닌 플러그인으로 만들었다면 ESL 플러그인으로 바꾸지 않는 게 정신건강에 좋음(해당 모더가 자비롭다면 ESL 플러그인으로 만들어 줄 지도 모르지만 그건 어디까지나 그 모더 마음이니 강요하진 말 것)

그냥 DAR이나 SPID 등을 사용하지 않고 script 폴더가 있는 경우, esl로 변환하기(스크립트 사용하는 모드도 가능) 참조해서 source 폴더 혹은 scripts\source 폴더 안의 소스 파일들 일일이 수작업으로 분석해서 GetFormFromFile 함수 쓰는지 안 쓰는지 체크하면 됨

만약 ESL로 바꾸고자 하는 플러그인 이름이 ABE.esp인 경우, GetFormFromFile 함수처럼 직접 FormID를 참조하는 스크립트라면 "ABC.esp" 혹은 "ABC"가 포함되어 있으니 해당 사항이 있는지 검색하면 됨. 만약 있다면 esl로 변환하기(스크립트 사용하는 모드도 가능)에서 설명한 대로 FormID를 맞춰서 수정하면 됨

만약 source 폴더 혹은 scripts\source 폴더가 없다? 그러면 그 모더가 소스 파일 공개한 게 아니니 정 원한다면 Champollion 설치해서 디컴파일한 후(사용법은 스크립트 번역시 번역할 부분 참조. Champollion은 LE버전밖에 없지만 SE 스크립트에도 대부분 문제 없이 잘 작동함), 재업) pex 파일 수정하는법 완전정리 참조해서 수정 후 컴파일하면 됨


3. creature.d 폴더로 크리쳐에게 쥬지 달아주는 모드일 경우: creatures.d 폴더 안의 json 파일 열어서 참조하는 FormID들이 뭔지를 ESL 플러그인으로 바꾸기 이전에 SSEEDIT으로 반드시 확인한 후, 해당 플러그인을 SSEEDIT으로 열고 나서 esp에 esl 플래그 박는 법 참조해서 Find ESP plugins which could be turned into ESL 돌려서 ESL 플러그인으로 변환 가능한지를 먼저 확인한 후, 변환 가능하다면 esl로 변환하기(스크립트 사용하는 모드도 가능) 참조해서 Compact FormIDs로 FormID 압축한 후, creatures.d 폴더 안의 json 파일이 참조했던 FormID들이 무슨 숫자로 바뀌었는지를 확인하고, "FE - (호 숫자)"를 "0x000"으로 바꾸고 나머지 숫자들을 뒤에 붙이면 됨
(예제) json 파일 중 "arousedArmor": "__formData|ABC.esp|0x001D30" 항목에서 ABC.esp를 SSEEDIT으로 불러왔을 때 [A1] ABC.esp였다면 SSEEDIT에서 A1001D30이 Compact FormIDs로 FormID 압축한 후 어떤 숫자로 바뀌었는지를 확인(예컨대 A1001D30 -> FE023800)한 후, json 파일 내 해당 항목을 "arousedArmor": "__formData|ABC.esp|0x000800"으로 바꾸면 됨. 이런 식으로 "raceForm": "__formData|"로 시작하는 항목이랑 "skinForm": "__formData|"으로 시작하는 항목들도 수정하면 됨


4. ESL 플러그인으로 바꾸고자 하는 모드가 Facegen, sound, SEQ만 포함하거나(scripts 폴더가 없어야 함), meshes\actors\character\animations 및 meshes 폴더 내의 폴더들 중 어느 하나도 animations 폴더를 포함하지 않은 경우: 보통 ESPFE Follower 사용하면 됨. 영어가 안 된다면 ESPFE Follower 동료 모드 ESL플래그 박는 스크립트 읽어보면 됨(꼭 동료모드 아니어도 됨. 시간 별로 안 걸림)


내가 아는 정보는 여기까지이고, 더 잘 아는 고수들이 틀린 내용 있다면 아마 정정해 줄 것임. 궁금한 점 댓글로 물어본다면 내가 아는 한에서 시간 될 때 답변하도록 노력해보겠는데 아마 다른 고수들이 알려줄 것 같음