diff --git a/Localization/GettingStarted-KR.md b/Localization/GettingStarted-KR.md new file mode 100644 index 0000000000..ac27141408 --- /dev/null +++ b/Localization/GettingStarted-KR.md @@ -0,0 +1,214 @@ +# Exiled 저수준 문서 +*(Written by [KadeDev](https://github.com/KadeDev) for the community) (번역: [Cocoa](https://github.com/Cocoa2219))* + +## 시작하기 +### 개요 +Exiled는 불필요한 부분 없이 게임에서 함수를 직접적으로 호출 할 수 있는 저수준 API입니다. + +이 덕분에 Exiled는 업데이트가 상당히 쉽고, 게다가 게임이 업데이트하기도 전에 Exiled가 업데이트될 수 있습니다. + +또한 이것은 플러그인 개발자들이 SCP:SL 또는 Exiled의 업데이트마다 코드를 바꿀 필요가 없다는 것을 나타냅니다. + +이 문서는 Exiled 플러그인을 만들기 위한 가장 기본적인 부분을 설명하고 있습니다. 여기서부터 Exiled와 함께 당신의 창의력으로 무엇이든지 만들어보세요! + +### 플러그인 예제 +이 [플러그인 예제](https://github.com/galaxy119/EXILED/tree/master/Exiled.Example)는 이벤트를 사용하는 방법과 기본적인 구조를 설정하는 방법을 잘 나타내고 있습니다. 이것을 통해 Exiled를 제대로 사용하는 방법을 알 수 있으며, 이 플러그인 예제 안에는 몇 가지의 중요한 부분이 있습니다. 한번 볼까요? + +#### OnEnable + OnDisable 동적 업데이트 +Exiled는 **Reload** 명령어를 통해 원래 있던 모든 플러그인과 새 플러그인들을 리로드 할 수 있습니다. 이 말은 여러분이 여러분들의 플러그인을 **동적으로 업데이트** 할 수 있게 만들어야 한다는 뜻입니다. 모든 변수, 이벤트, 코루틴 등등은 *무조건* 활성화되었을 때 할당되고 비활성화되었을 때 null이 되어야 합니다. **OnEnable** 메소드는 모든 것들을 활성화시켜야 하고, **OnDisable** 메소드는 모든 것을 비활성화시켜야 합니다. 그러면 **OnReload**는 뭘까요? 정적인 변수들은 리로드 될 때 지워지지 않으므로, 이 메소드는 변수들을 지워지게 놔두고 싶지 않을 때 사용합니다. 예를 들어: +```csharp +// 이 정적 변수는 리로딩될 때 지워지지 않습니다 +public static int StaticCount = 0; + +// 이 변수는 리로딩될 때 초기화됩니다 +public int counter = 0; + +// 플러그인 활성화 +public override void OnEnable() +{ + // StaticCount에서 저장된 값 가져오기 + counter = StaticCount; + counter++; + Info(counter); +} + +// 플러그인 비활성화 +public override void OnDisable() +{ + counter++; + Info(counter); +} + +// 플러그인 리로드 +public override void OnReload() +{ + // counter는 초기화되니 리로딩 되어도 초기화되지 않는 정적 변수에 저장 + StaticCount = counter; +} +``` + +출력값은: (가독성을 위해 출력만 보이게 간소화했습니다) +```bash +# OnEnable 호출 +1 +# Reload 명령어 사용 +# OnDisable 호출 +2 +# OnReload 호출 +# 다시 OnEnable 호출 +3 + +``` + +이렇게 하지 않으면 리로딩 될 때 counter가 1에서 2로 갔다가 변수가 초기화됩니다. + +### 플레이어 + 이벤트 +이제 플러그인을 **동적 업데이트**가 가능하게 하는 작업이 끝났습니다! 이제 플레이어와 이벤트를 통해 상호작용하는 방법을 알아봅시다. + +이벤트는 SCP:SL이 Exiled와 통신하고, Exiled가 다시 모든 플러그인과 통신할 수 있게 합니다. + +메인 플러그인 소스 코드의 맨 위에 이런 줄을 추가함으로서 이벤트를 처리할 수 있습니다: +```csharp +using EXILED; +``` +그리고 실제로 이벤트를 사용하기 위해 `Exiled.Events.dll` 파일을 참조해야 합니다. + +이벤트를 사용하기 위해 "EventHandlers"라는 새로운 클래스를 만들겠습니다. + +OnEnable과 OnDisable에서 다음과 같이 이벤트를 구독하고 구독 취소할 수 있습니다: + +`MainClass.cs` +```csharp +using Player = Exiled.Events.Handlers.Player; + +public EventHandlers EventHandler; + +public override OnEnable() +{ + // EventHandlers 클래스를 하나 생성하고 + EventHandler = new EventHandlers(); + // 이벤트 신호를 받을 수 있게 이벤트에 메소드를 구독하세요 + Player.Verified += EventHandler.PlayerVerified; +} + +public override OnDisable() +{ + // 동적 업데이트가 가능하게 만들기 위해 이벤트에서 구독 취소하고 (모든 이벤트에서 구독 취소해야 합니다) + Player.Verified -= EventHandler.PlayerVerified; + // EventHandler를 해제하세요 + EventHandler = null; +} +``` + +그리고 EventHandlers 클래스에서는: + +```csharp +public class EventHandlers +{ + public void PlayerVerified(VerifiedEventArgs ev) + { + + } +} +``` + +이제 (플레이어가 서버에 들어오고 나서 인증 후 호출되는) Verified 이벤트가 호출될 때 우리의 코드를 실행할 수 있습니다! 모든 이벤트는 각각의 이벤트 인수가 있고, 각각의 인수는 각각 다른 속성이 있다는 것에 주의하세요. (VerifiedEventArgs 안에는 접속한 플레이어가 담겨있는 것에 반해, HurtingEventArgs 같은 다른 인수는 공격자, 피해자, 데미지 양 등 다른 속성이 있습니다.) + +Exiled는 플레이어에게 자막을 띄울 수 있는 함수가 미리 준비되어 있으므로 사용해 봅시다: + +```csharp +public class EventHandlers +{ + public void PlayerVerified(VerifiedEventArgs ev) + { + // 자막(또는 힌트)은 유니티 TextMeshPro의 리치 텍스트를 사용할 수 있습니다 + // 자세한 내용은 https://docs.unity3d.com/Packages/com.unity.textmeshpro@4.0/manual/RichText.html (영문)을 참고하세요 + ev.Player.Broadcast(5, "제 멋진 서버에 온 것을 환영해요!"); + } +} +``` + +위에서 설명했듯이, 모든 이벤드는 각각 다른 인수가 있습니다. 아래 코드는 NTF 진영에 한해 테슬라 작동을 중지시키는 코드입니다. + +`MainClass.cs` +```csharp +using Player = Exiled.Events.Handlers.Player; + +public EventHandlers EventHandler; + +public override OnEnable() +{ + EventHandler = new EventHandlers(); + Player.TriggeringTesla += EventHandler.TriggeringTesla; +} + +public override OnDisable() +{ + + Player.TriggeringTesla -= EventHandler.TriggeringTesla; + EventHandler = null; +} +``` + +`EventHandlers.cs` +```csharp +public class EventHandlers +{ + public void TriggeringTesla(TriggeringTeslaEventArgs ev) + { + // 만약 플레이어의 팀이 Mtf 진영이라면 + if (ev.Player.Role.Side == Side.Mtf) { + // 테슬라 트리거를 비활성화 합니다. + ev.IsTriggerable = false; + } + } +} +``` + + +### 설정 +Exiled 플러그인의 대부분은 설정이 포함되어 있다는 것입니다. 설정으로 서버 유지관리자가 플러그인을 입맛에 맞게 (물론 플러그인 개발자가 제공하는 부분에 한하여) 바꿀 수 있습니다. + +일단 `Config` 클래스를 만들고, 메인 플러그인 클래의 상속을 `Plugin<>`에서 `Plugin` 로 바꾸세요. + +이제 `Config` 클래스가 `IConfig`으로부터 상속받아야 합니다. `IConfig`을 상속하고 난 후, `IsEnabled`와 `Debug` 2개의 속성을 클래스 안에 추가하세요. 당신의 설정 클래스는 이제 이렇게 보여야 합니다: + +```csharp +public class Config : IConfig +{ + public bool IsEnabled { get; set; } + public bool Debug { get; set; } +} +``` + +설정 옵션을 설정 클래스 안에 넣고 다음과 같이 불러올 수 있습니다: + +`Config.cs` +```csharp +public class Config : IConfig +{ + public bool IsEnabled { get; set; } + public bool Debug { get; set; } + + // 개발자가 추가한 설정값 + public string TextThatINeed { get; set; } = "this is the default"; +} +``` + +`MainClass.cs` +```csharp +public override OnEnabled() +{ + // 불러온 설정 출력 + Log.Info(Config.TextThatINeed); +} +``` + +이제 축하합니다! 첫 Exiled 플러그인을 만드셨군요! 아, 그리고 모든 플러그인은 **무조건** IsEnabled 옵션이 있어야 한다는 것을 꼭 기억하세요. 이 옵션은 서버 유지관리자가 플러그인을 상황에 맞게 활성화하거나 비활성화 할 수 있게 할 때 꼭 필요합니다. IsEnabled 옵션은 Exiled를 불러올 때 로더가 읽을 것입니다 (`IsEnabled == true` 등 IsEnabled가 참인지 조건을 확인하지 않아도 됩니다). + +### 다음으론? +더 많은 정보를 얻고 싶으시다면 [디스코드](https://discord.gg/PyUkWTg)에 가입해보세요! + +#resources 채널에 들어가 유용한 정보들을 찾을 수 있으며, 여러분의 플러그인 개발을 기꺼이 도와줄 Exiled 기여자분들 또는 플러그인 개발자분들이 준비되어 있습니다. + +...아니면 현재 존재하는 이벤트를 모두 읽고 싶으시다면 [여기](https://github.com/galaxy119/EXILED/tree/master/Exiled.Events/EventArgs)를 클릭해주세요! diff --git a/Localization/README-KR.md b/Localization/README-KR.md index 72635edd60..3ba9df45da 100644 --- a/Localization/README-KR.md +++ b/Localization/README-KR.md @@ -146,7 +146,7 @@ public IEnumerator MyCoroutine() } ``` -MEC과 익숙치 않거나, 더 배우고 싶거나, 조언을 좀 받고 싶고나, 도움이 필요하다면 구글링을 좀 하거나 디스코드에서 물어보는 것이 **_매우_** 추천됩니다. 질문들은 얼마나 '수준 낮은지' 와 상관없이, 플러그인 개발자분들에게 추진력을 실어주기 위해 항상 최대한 호의적이고 깔끔하게 답변될 것입니다. 더 좋은 코드는 모두에게 좋은 것이니까요! +MEC과 익숙치 않거나, 더 배우고 싶거나, 조언을 좀 받고 싶나, 도움이 필요하다면 구글링을 좀 하거나 디스코드에서 물어보는 것이 **_매우_** 추천됩니다. 질문들은 얼마나 '수준 낮은지' 와 상관없이, 플러그인 개발자분들에게 추진력을 실어주기 위해 항상 최대한 호의적이고 깔끔하게 답변될 것입니다. 더 좋은 코드는 모두에게 좋은 것이니까요! ### 동적 리로드 @@ -176,3 +176,4 @@ _새로운_ 어셈블리들이라는 것에 주목해주세요. 만약 똑같은 모든 플러그인이 동적 리로딩을 지원하지 않아도 됩니다. 만약 동적 리로딩을 지원하지 않기로 생각했다면, 진짜 괜찮아요. :) 플러그인의 어셈블리 버전을 바꾸는 것을 피하시고, 서버 주인분들에게 플러그인을 업데이트하기 위해 서버를 재시작하라고 요청하세요. +