디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

ㅇㄹ) 명상 시에 자지 않는 모드를 만들어보자. 3

ㅇㅇ갤로그로 이동합니다. 2025.01.18 17:27:10
조회 194 추천 9 댓글 2
														

+++-이전 연재.


https://gall.dcinside.com/board/view/?id=rlike&no=484437&page=2

 




https://gall.dcinside.com/board/view/?id=rlike&no=484443

 


저번 화에서 우리는 CanSleep(); 을 수정하면 목적을 달성할 수 있을 것이라는 이야기를 했다.


이번 연재에서는 모드 개발에 필요한 종속성과 Harmony 라이브러리를 이용해서 패치하는 법을 다룬다.


7. 종속성 세팅.


먼저 플러그인 프로젝트를 만드는 방법에 대해서 알아보자. 



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2ad1c99a51bc60b67517468763



+새 프로젝트 만들기를 하면 이런 화면이 뜰텐데 "클래스 라이브러리"를 택한다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a85c19c5bbf33e37317468763


그 뒤에는 원하는 프로젝트명과 솔루션 이름을 정한다.


나는 DcMod로 하겠다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a85c09d0de863b92917468763


프레임워크는 netstandard2.0을 선택한다. 


다른 가이드에서는 .netframework 4.7.2를 쓰라고 하는데, 걱정말고 일케 쓰자.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a859ac85aba63b87517468763


드디어 프로젝트 창이 나왔다. 이제 종속성을 추가해주자.


우리가 추가해야할 종속성은 Elin 게임 폴더 내부에 있는 라이브러리들이다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a869f9a0bed33b22817468763


우측 메뉴에서 프로젝트를 클릭하면, 위와 같이 프로젝트 설정이 나온다. 


일단 아래의 코드를 <Project> 안에 붙여넣자.


<!-- 기존의 ItemGroup 같은 경우에는 전부 밀어버려도 무관하다.-->

<!-- HintPath의 경로는 본인이 Elin을 설치한 폴더에서 참조한다.-->

<ItemGroup>

<Reference Include="0Harmony">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\BepInEx\core\0Harmony.dll</HintPath>

<Private>False</Private>

</Reference>

<Reference Include="BepInEx.Core">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\BepInEx\core\BepInEx.Core.dll</HintPath>

<Private>False</Private>

</Reference>

<Reference Include="BepInEx.Unity">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\BepInEx\core\BepInEx.Unity.dll</HintPath>

<Private>False</Private>

</Reference>

<Reference Include="Elin">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\Elin_Data\Managed\Elin.dll</HintPath>

<Private>False</Private>

</Reference>

<Reference Include="Plugins.BaseCore">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\Elin_Data\Managed\Plugins.BaseCore.dll</HintPath>

<Private>False</Private>

</Reference>

<Reference Include="Plugins.UI">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\Elin_Data\Managed\Plugins.UI.dll</HintPath>

<Private>False</Private>

</Reference>

<Reference Include="UnityEngine">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\Elin_Data\Managed\UnityEngine.dll</HintPath>

<Private>False</Private>

</Reference>

<Reference Include="UnityEngine.CoreModule">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\Elin_Data\Managed\UnityEngine.CoreModule.dll</HintPath>

<Private>False</Private>

</Reference>

<Reference Include="UnityEngine.UI">

<HintPath>C:\Program Files (x86)\Steam\steamapps\common\Elin\Elin_Data\Managed\UnityEngine.UI.dll</HintPath>

<Private>False</Private>

</Reference>

</ItemGroup>




<HintPath> 에서 "C:\Program Files (x86)\Steam\steamapps\common\Elin" 부분을 본인이 엘린을 설치한 위치로 바꾼 뒤 저장한다.


정상적으로 로딩이 됐다면, 우측 메뉴의 "종속성 - 어셈블리" 에 들어가보면 라이브러리들이 나올 것이다.


만일 느낌표가 떠있다면 로딩이 안 되었다는 뜻이니 다시 시도해보자.



8. 코드 작성.


그 뒤 메인 파일을 편집하자.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a8ecccf0fe862b87517468763


이것은 BepInEx 공식 문서에 등장하는 플러그인 기본 형태이다. 


클래스명까지 맞출 필요는 없고, BaseUnityPlugin을 상속하고 Awake(); 메소드를 만들어주자.


그 뒤 클래스 위에 대괄호로 적혀있는 것은 아래와 같이 대체가 가능하다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a859fcd5abc64b92117468763


순서대로 plugin의 uid, 플러그인 이름, 플러그인 버전이다.


우리가 만든 플러그인이 어떤 것인지 우리가 설명해주는 것이다. 대충 적어보자



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a83cfc85ce165e42017468763


그럼 우리가 수정한 파일이 대충 이런 모습이 될 것이다.


이제 새로운 cs폴더를 하나 생성하고 하모니 코드를 작성해보자.


우리는 Chara의 ai가 AI_Meditate인 경우 CanSleep이 false를 반환하게 만들 것이다.


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a87c9cf5cbf60b27017468763



Patch 메소드를 정의해주면 결과적으로 위와 같은 모습이 된다.


여기서 우리가 주의해서 봐야하는 부분은 어트리뷰트([HarmonyPostfix], [HarmonyPatch])를 사용하는 부분이다.


우리는 위와 같은 어트리뷰트를 통해서 크게 2가지 정보를 하모니에게 전달한다.


하나는 어떤 메소드를 패치할 것인가? 하는 부분이다. => [HarmonyPatch]


=> 메소드는 일반적으로 클래스 내부에 있으니 클래스명도 같이 적어줘서 Chara의 CanSleep 메소드를 패치하라고 명시했다. 


나머지 하나는 패치를 어떻게 할 것인가? 하는 부분이다. => [HarmonyPostfix]


=> 우리는 메소드의 return 값을 가로채기로 했으므로 postfix를 사용했다.


또 주의 사항이 있다. Harmony가 패치하기 위해 사용하는 메소드는 반드시 static 메소드여야 한다.  


위와 같은 조건을 지키면 그 다음에는 메소드를 작성하는 것만 남는다. 이 작업은 어떻게 하느냐?



ac5939a70001b942813e33669735c1bcc2a977c21c773585f0dabed5e42e074dc2d2552d4ea5fd28c0a114c2d1971e9e46b93c9fb3c0a776af2b9556df8f2905b14f09942a1022a741d9269669



__instance나 __result 같은 매개 변수가 함수에 정의되어 있는 것이 보일 것이다. 


메소드가 실행되는 인스턴스와 메소드에 접근하기 위해 선언한 것이다.


이게 Harmony로 코드를 작성할 때의 핵심이다. 이를 이용해 원본을 작업을 완전히 갈아치울 수도 있기 때문이다.


자세한 사항은 Harmony 공식 문서에서 Injections 란을 살펴보면 된다.


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2a85cec059bf32b17017468763



패치 메소드를 다 썼으니, 다시 돌아가서 Awake(); 메소드 안에 Harmony.CreateAndPatchAll(); 을 사용해준다.


이로서 이 플러그인이 로딩되면, CanSleep(); 뒤에 우리가 정의한 메소드가 실행될 것이다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610cb09aa5b8e6e1036c3dfb9109c09762f2f021e5ee847e03b24



그럼 이제 빌드를 해서 dll파일을 가져오자.


별 설정이 없다면 dll 파일은 해당 프로젝트 폴더의 bin/Debug/netstandard2.0 폴더에 있을 것이다.


그 뒤 엘린 게임 폴더 내부의 Package라는 폴더에 들어가 Mod_DcMod라는 폴더를 만들고, 그 안에 dll 파일을 넣는다.


그 뒤에 메모장을 켠 뒤에 아래와 같은 xml 코드를 복붙한 뒤, 적절히 수정한다.


<?xml version="1.0" encoding="utf-8"?>

<Meta>

  <title>Custom Map Test(Example Mod)</title>

  <id>elin_example_mod_custom_map1</id>

  <author>Lafrontier</author>

  <loadPriority>100</loadPriority>

  <description>This is a sample description text for this workshop item.

  </description>

</Meta>


그 다음 같은 폴더에 package.xml이라는 파일명으로 저장한다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2ad29ac00fe932b82517468763



그러면 결과적으로 이런 모습이 될 것이다.


9. 디버그


그럼 이제 디버깅을 해보자. 하지만 그 전에 한 가지 설정할 게 있다. 


엘린 게임 폴더 안에 BepInEx/config/BepInEx.cfg 라는 파일이 있다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610cb09aa5b8e6e1036c3dfb9109c052528220d115eea47e03b1e



이것을 텍스트 편집기로 연 다음에 아래로 내리다 보면 Logging.Console이라는 옵션이 있다.


이건 BepInEx의 콘솔창을 열 것인지 말지를 결정하는 옵션이다.


false로 되어 있는 기본값을 위와 같이 true로 바꿔준다.


이 콘솔을 통해서 우리가 Harmony 코드에 써놓은 Console.WriteLine(); 의 내용이 출력될 것이다. 



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07ca0eff7425cd55e4f97610a665ae5f8f681337e40c6d2ad4cbca51bd63b12517468763


그 뒤에 엘린을 켜서 Hook을 달아준다.


우리가 수정한 것이 제대로 적용되었다면, CanSleep(); 메소드는 졸림 상태에서 Chara.ai가 AI_Meditate여도 false를 반환할 것이다.


만일 캐릭터가 졸려하지 않는다면 2편에서 다루었던 대로 pc의 Chara 인스턴스에 들어가서 직접 값을 수정해주자.



ac5939a70001b942813e33669735c1bcc2a977c21c773585f0dabed5e42e074dc2d2552d4ea5fd28c0a114c2d1971e9e46b93c9fb3c0a777af2c9556da8a29058ed4582899106abb8a851b863b46



그리고 명상을 눌러보면?



ac5939a70001b942813e33669735c1bcc2a977c21c773585f0dabed5e42e074dc2d2552d4ea5fd28c0a114c2d1971e9e46b93c9fb3c0a777af2c9256dc802905d6a51c1496fa55b353ea17f72b6f


아까 우리가 설정을 고쳐서 띄운 BepInEx 콘솔 창을 확인해보자.


우리가 디버그용으로 출력한 문자열과 CanSleep();이 False를 반환한 것을 볼 수 있다.


+성공!



추천 비추천

9

고정닉 3

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 사회생활 대처와 처세술이 '만렙'일 것 같은 스타는? 운영자 25/03/31 - -
AD 트릭컬 지금 접속 시 죠안 확정권 지급 운영자 25/03/28 - -
490300 ㅇㄹ) 영원의 서약도 재밌는듯 [4] ㅇㅇ(121.181) 02.23 252 0
490299 ㅇㄹ)auto act 켜놓고 함정 때리니까 기울어진천장갤로그로 이동합니다. 02.23 140 0
490298 ㅇㄹ) 구속대나 구속의자는 어디서 얻음? [3] ㅇㅇ갤로그로 이동합니다. 02.23 140 0
490297 ㅇㄹ)아오! 왜 벽에 구멍이 나는거야! [1] 기울어진천장갤로그로 이동합니다. 02.23 175 0
490296 액션 로그라이크 추천점 [2] 로갤러(182.216) 02.22 139 0
490295 ㅋㅌㅋㅂㅂ)지하에서 지상으로 올라가는 경사로 되겠지? [6] 로갤러(116.127) 02.22 118 0
490293 ㅇㄹ) 이런 표식 있는 NPC는 주민숫자에 포함 안되는거맞지? [2] 로갤러(1.243) 02.22 208 0
490289 ㄷㅈ) 챌린지 별 하나 얻은줄 알았는데 헥슬링어 시작이었구나.. [4] 로갤러(175.193) 02.22 157 3
490288 ㅇㄹ) 농부 대신 이게 나왔는데 고용해도 됨??? [5] ㅇㅇ(14.32) 02.22 242 0
490284 ㅇㄹ)아이 물병 닦느냐고 잎사귀 줍고있네 [2] 기울어진천장갤로그로 이동합니다. 02.22 164 0
490276 ㅇㄹ)동료 템 뺄 수 있음? [2] 로갤러(220.116) 02.22 139 0
490275 ㅇㄹ) 메인 퀘스트 진행 관련 질문 [3] 로갤러(118.41) 02.22 130 0
490273 ㄷㅈ) 폴터가이스트랑 레버넌트 전용 칭호 [4] ㅇㅇ(106.255) 02.22 139 5
490272 연금술사 딜뻥 <<< 어케해야함 [5] 공하싫갤로그로 이동합니다. 02.22 127 1
490267 ㄷㅈ) 중갑전사 요즘 초반 어케넘기냐 [8] 헤으갤로그로 이동합니다. 02.22 211 1
490266 ㅇㄹ) 보석 연금할수있는방법없음? [7] 로갤러(1.243) 02.22 152 0
490259 ㄷㅈ) 레버넌트 재밌네 [1] ㅇㅇ(175.121) 02.22 91 0
490256 ㅇㄹ)씨앗은 +20강인데 열매는 +2,+3 이러네 [1] 환불이안됨갤로그로 이동합니다. 02.22 157 0
490251 ㅇㄹ) 연속마법 유전자 구하기가 젤 빡센듯 ㅇㅇ(118.36) 02.22 122 0
490250 ㄷㅈ) bazaar가 한 게임에 여러번 나올 수도 있는건가? [6] 로갤러(175.193) 02.22 151 1
490242 ㅇㄹ) 혹시 장비에 달린 옵션을 -로 바꿀수있음? [2] 로갤러(211.49) 02.22 131 0
490240 ㅇㄹ) 임금님 침대 품질 올리려면 어떻게 해야되는거임? [1] 로갤러(1.243) 02.22 160 0
490235 파토스 첫 노데스탈출 Randommagic갤로그로 이동합니다. 02.22 112 4
490234 엘린 시작하자마자 돈 2만5천됐는데 어케함?? [2] 로갤러(122.43) 02.22 191 0
490233 ㅇㄹ ) 북쪽이나 남쪽에 귀환할수있는 곳 있음? [4] 호키후쿠갤로그로 이동합니다. 02.22 132 0
490231 ㄷㅈ) 돌켓몬 추천좀 [1] ㅇㅇ갤로그로 이동합니다. 02.22 136 1
490228 ㅇㄹ)유튜브에서 본 옷감 파밍 이거 좋네 [4] 로갤러(1.243) 02.22 227 0
490226 ㄷㅈ) 이레데 기도술 얼마나 줌? [3] ㅇㅇ갤로그로 이동합니다. 02.22 116 1
490225 ㄷㅈ) 지니 올룬클 [2] ㅇㅇ(106.255) 02.22 124 1
490224 ㅇㄹ) 카오스셰이프 신체부위 이거 콘솔로 뗄 방법 없음? [3] 로갤러(118.39) 02.22 147 0
490218 ㅇㄹ) 아 플람 레시피 팔아버렸나봐.. [3] 환불이안됨갤로그로 이동합니다. 02.22 143 0
490217 ㅇㄹ) 비늘로 가방만들면 불 안타는 줄 알았는데 활활잘타노 [7] 로갤러(61.83) 02.22 185 0
490210 톰죽) 팅커직업들 죄다 개성있음 + 강캐인게 맘에 듬 [2] 가이우스(76.174) 02.22 129 0
490209 ㄷㅈ)종족 대체를 안하고 리멬하면 안되나 [4] 로갤러(59.22) 02.22 128 0
490208 ㅇㄹ) 농장 팻말 펜스치고 하나만 박아도 되는 거 맞음? [7] ㅇㅇ(39.112) 02.22 139 0
490207 톰죽 유연전투 기사 <<이거 히트인듯 [4] ㅇㅇ갤로그로 이동합니다. 02.22 105 0
490204 ㅋㅌㅋㅂㅂ) 비활성화 된 로봇 주웠는데 이거 내가 명령 못내림? [2] 로갤러(116.127) 02.22 88 0
490202 나메 연금술사 어렵구나 [1] 공하싫갤로그로 이동합니다. 02.22 57 0
490200 ㄷㅈ) 고도로 발달된 기술은 마법과 구분할 수 없다 [1] ㅇㅇ(106.255) 02.22 111 2
490193 ㅇㄹ) 임금님 침대 레시피 목공렙 몇이어야함? [1] 로갤러(1.243) 02.22 181 0
490192 ㅇㄹ) 팬티는 관광 자원이 맞다 ㅇㅇ(14.32) 02.22 142 0
490185 pbd 마나쉴드 빅브레인 블랙마크 엘방 엘슽 시드 공유 로갤러(119.77) 02.22 60 0
490179 톰죽 증기장갑 드랍확률 왤캐 높은거같지 [3] ㅇㅇ갤로그로 이동합니다. 02.22 87 0
490176 ㅇㄹ)혹시 죽을때 페널티 돈 떨구는거 말고 또 있음? [4] 로갤러(168.126) 02.22 137 0
490170 ㅇㄹ) 영지 이름 어케 바꿈?? [2] ㅇㅇ(223.62) 02.22 95 0
490169 ㅇㄹ) NPC 옆에 별은 뭐임?? 로갤러(1.243) 02.22 95 0
490166 톰죽) 1.7.6 인세인 섬멸자 클리어 + 올보스 [4] 가이우스(76.174) 02.22 122 0
490165 돌죽 법사는 중후반에 생존기 마법 뭐씀? [6] ㅁㄴㅇㄹ(211.226) 02.22 120 0
490142 카타클 빨리 새 포크 흥햇으면 좋겟다 ㅇㅇ갤로그로 이동합니다. 02.22 111 0
490141 밝밤 멋쟁이 특성 없어졌네 ㅋㅋㅋㅋ [2] 점화자갤로그로 이동합니다. 02.22 171 3
뉴스 박경림 “조인성→박수홍, 열애설 상대들 어마어마…최진혁 영광인 줄 알길” (아는형님) 디시트렌드 03.30
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2