Jongyeol(비교)
r15 vs r16 | ||
---|---|---|
... | ... | |
295 | 295 | 플레이 할 떄 사용하고 있는 입력 오프셋을 전체, 맵별로 기록한다. |
296 | 296 | 기록된 오프셋은 버튼을 눌러 바로 현재 오프셋으로 설정할 수 있다. |
297 | 297 | === JALib === |
298 | ==== 개요 ==== |
|
299 | Jongyeol Adofai Library에 약자로 얼불춤 모딩에 여러가지 편리한 기능을 제공하는 라이브러리형 모드다. |
|
300 | [[https://jalib.jongyeol.kr/modApplicator/JALib/betalatest|다운로드]][* 베타버전으로 정식버전은 아직 존재하지 않는다.] |
|
301 | JALib을 이용하여 모드를 만드려면 UMM모드 만들듯이 만들면 안되고 JALib을 사용한 모드들에 틀에 맞게 만들어야된다. [[https://github.com/Jongye0l/JALib/blob/main/Document/DevelopGuide.md|JALib 모드 개발 가이드]] |
|
302 | {{{#!syntax csharp |
|
303 | using JALib.Core; |
|
304 | ||
305 | namespace MyMod; |
|
306 | ||
307 | public class Main : JAMod { |
|
308 | protected override void OnSetup() { |
|
309 | Log("MyMod is Setuped."); |
|
310 | } |
|
311 | ||
312 | protected override void OnEnable() { |
|
313 | Log("MyMod is Enabled."); |
|
314 | } |
|
315 | ||
316 | protected override void OnDisable() { |
|
317 | Log("MyMod is Disabled."); |
|
318 | } |
|
319 | } |
|
320 | }}} |
|
321 | ==== 기능 ==== |
|
322 | 라이브러리가 아직 배타버전이기 때문에 없어지거나 사용법이 바뀔 수 있다. |
|
323 | ===== 모드 기본 기능 ===== |
|
324 | * 자동 업데이트 |
|
325 | * 업데이트 알림 |
|
326 | * 모드 자동 적용 |
|
327 | * 온라인 모드 정보 받아오기 |
|
328 | * 모드 자동 다운로드 |
|
329 | * 필요한 모드 자동 다운로드 |
|
330 | ===== 자동 예외 Catch ===== |
|
331 | 자동 예외 Catch는 Action, Task가 지원한다. |
|
332 | ||
333 | * Action 사용법 |
|
334 | {{{#!syntax csharp |
|
335 | JAction action = new JAction(Main.Instance, () => { |
|
336 | throw new Exception("Action Catch"); |
|
337 | }); |
|
338 | action.Invoke(); |
|
339 | }}} |
|
340 | * Task 사용법 |
|
341 | {{{#!syntax csharp |
|
342 | JATask.Run(Main.Instance, () => { |
|
343 | throw new Exception("Task Catch"); |
|
344 | }); |
|
345 | }}} |
|
346 | ===== 다양한 랜덤 ===== |
|
347 | {{{#!syntax csharp |
|
348 | JARandom random = new JARandom(); |
|
349 | random.NextInt(); |
|
350 | random.NextLong(); |
|
351 | }}} |
|
352 | ===== 쉬운 TCP 통신 ===== |
|
353 | {{{#!syntax csharp |
|
354 | JATcpClient client = new JATcpClient("localhost", 12345, new JAction(Main.Instance, () => { |
|
355 | client.ReadUTF(); |
|
356 | }); |
|
357 | }}} |
|
358 | SRV 사용하여 TCP연결 |
|
359 | {{{#!syntax csharp |
|
360 | JATcpClient client = new JATcpClient("localhost", 12345, "MyService", false, new JAction(Main.Instance, () => { |
|
361 | client.ReadUTF(); |
|
362 | }); |
|
363 | }}} |
|
364 | ===== 간단한 HTTP 통신 ===== |
|
365 | {{{#!syntax csharp |
|
366 | HttpClient client = new HttpClient(); |
|
367 | string result = await client.GetString("http://localhost:3000"); |
|
368 | }}} |
|
369 | ===== 간단한 리플렉션 ===== |
|
370 | {{{#!syntax csharp |
|
371 | typeof(Main).Invoke("OnEnable", this); |
|
372 | this.Invoke("Log", "Hello World!"); |
|
373 | }}} |
|
374 | ===== 스트림 다양한 형식 읽기 ===== |
|
375 | {{{#!syntax csharp |
|
376 | Stream stream; |
|
377 | stream.ReadInt(); |
|
378 | stream.ReadLong(); |
|
379 | stream.ReadUTF(); |
|
380 | }}} |
|
381 | ===== 메모리 형식에 파일 압축/압축해제 ===== |
|
382 | {{{#!syntax csharp |
|
383 | byte[] data; |
|
384 | RawFile[] result = Zipper.Unzip(data); |
|
385 | }}} |
|
386 | ===== 메인 스레드 ===== |
|
387 | {{{#!syntax csharp |
|
388 | if(!MainThread.IsMainThread()) { |
|
389 | MainThread.Run(Main.Instance, () => { |
|
390 | Main.Instance.Log("Hello World!"); |
|
391 | }); |
|
392 | await MainThread.WaitForMainThread(); |
|
393 | } |
|
394 | }}} |
|
395 | ===== 언어별 글데이터 ===== |
|
396 | 언어별 글 데이터는 모드 폴더/localization/언어.json 에 넣은 데이터들을 불러옵니다. |
|
397 | {{{#!syntax csharp |
|
398 | string value = Main.Instance.Localization["Hi"]; |
|
399 | }}} |
|
400 | ===== 기능별 관리 ===== |
|
401 | 다음과 같이 기능을 생성할 수 있다. |
|
402 | {{{#!syntax csharp |
|
403 | public MyFeature : Feature { |
|
404 | public MyFeature() : base(Main.Instance, nameof(MyFeature)) { |
|
405 | } |
|
406 | ||
407 | protected override void OnEnable() { |
|
408 | Main.Instance.Log("MyFeature is Enabled"); |
|
409 | } |
|
410 | ||
411 | protected override void OnDisable() { |
|
412 | Main.Instance.Log("MyFeature is Disabled"); |
|
413 | } |
|
414 | } |
|
415 | }}} |
|
416 | 기능 추가는 OnSetup 매서드에서 진행되며 다음과 같이 할 수 있다. |
|
417 | {{{#!syntax csharp |
|
418 | protected override void OnSetup() { |
|
419 | AddFeature(new MyFeature()); |
|
420 | } |
|
421 | }}} |
|
422 | 기능을 생성할 때 기능별 설정, 패치를 설정할 수 있다. |
|
423 | ===== 패치 ===== |
|
424 | JALib에선 기존 Harmony 기능보다 다양하게 패치를 진행할 수 있다. |
|
425 | 일반 패치 매서드는 다음과 같이 만들 수 있다. |
|
426 | {{{#!syntax csharp |
|
427 | [JAPatch(typeof(Main), "OnEnable", PatchType.Prefix, false, TryingCatch = true)] |
|
428 | private static void OnEnablePrefix(Main __instance) { |
|
429 | __instance.Log("Enable Prefix"); |
|
430 | } |
|
431 | }}} |
|
432 | PatchType에는 다음과 같은 종류가 있다. |
|
433 | * Prefix |
|
434 | * Postfix |
|
435 | * Transpiler |
|
436 | * Finalizer |
|
437 | * Replace |
|
438 | TryingCatch를 통해 이 패치 매서드에서 예외발생을 방지할 지 설정할 수 있다. |
|
439 | ||
440 | Reverse 패치 매서드는 다음과 같이 만들 수 있다. |
|
441 | {{{#!syntax csharp |
|
442 | [JAReversePatch(typeof(Main), "OnEnable", ReversePatchType.Original)] |
|
443 | private static void OnEnableReverse(Main __instance) => throw new NotImplementedException(); |
|
444 | }}} |
|
445 | ReversePatchType은 Flag로 여러개를 한번에 선택할 수 있으며 다음과 같은 종류가 있다. |
|
446 | * Original = 0 |
|
447 | * PrefixCombine = 1 |
|
448 | * PostfixCombine = 2 |
|
449 | * TranspilerCombine = 4 |
|
450 | * FinalizerCombine = 8 |
|
451 | * ReplaceCombine = 16 |
|
452 | * OverrideCombine = 32 |
|
453 | * AllCombine = PrefixCombine | PostfixCombine | TranspilerCombine | FinalizerCombine | ReplaceCombine | OverrideCombine |
|
454 | * DontUpdate = 0x40000000 |
|
455 | ||
456 | Override 패치 매서드는 기본적으로 상속된 매서드에서 사용할 수 있다. Override 패치 매서드는 다음과 같이 만들 수 있다. |
|
457 | {{{#!syntax csharp |
|
458 | [JAOverridePatch] |
|
459 | public void OnEnable() { |
|
460 | Log("MyMod is Enabled but Patched!"); |
|
461 | } |
|
462 | }}} |
|
463 | ===== 설정 ===== |
|
464 | 다음과 같은 형식으로 설정을 만들 수 있다. |
|
465 | {{{#!syntax csharp |
|
466 | public MyModSetting : JASetting { |
|
467 | public string SettingField; |
|
468 | ||
469 | public MyModSetting(JAMod mod, JObject jsonObject) : base(mod, jsonObject) { |
|
470 | } |
|
471 | } |
|
472 | }}} |
|
473 | 기본적으로 field를 이용해 저장한다. |
|
474 | ||
475 | 다음과 같은 형식으로 field에 넣지않고 저장할수도 있다. |
|
476 | {{{#!syntax csharp |
|
477 | JASetting setting; |
|
478 | setting["MySetting"] = "This is my Setting"; |
|
479 | }}} |
|
480 | 480 | ==== JALib ModApplicator ==== |
481 | 481 | === JipperResourcePack === |
482 | 482 | ==== Jipper-Overlayer ==== |
... | ... |