From ee432e3c9fb7479e113f2a21c114344c5d1ccabf Mon Sep 17 00:00:00 2001 From: You Seong Hyeon <89614632+Cocoa2219@users.noreply.github.com> Date: Tue, 23 Apr 2024 22:45:20 +0900 Subject: [PATCH 1/5] Create README-KR.md --- Localization/README-KR.md | 178 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 Localization/README-KR.md diff --git a/Localization/README-KR.md b/Localization/README-KR.md new file mode 100644 index 0000000000..1b19ab59a8 --- /dev/null +++ b/Localization/README-KR.md @@ -0,0 +1,178 @@ +

EXILED - EXtended In-runtime Library for External Development

+
+ +[CI](https://github.com/Exiled-Team/EXILED/actions/workflows/main.yml/badge.svg?branch=master) +GitHub Releases +Downloads +![Github Commits](https://img.shields.io/github/commit-activity/w/Exiled-Team/EXILED/apis-rework?style=for-the-badge&logo=git) + + Chat on Discord + + +
+ +EXILED는 SCP: 비밀 연구소 서버들을 위한 고급 플러그인 프레임워크입니다. 개발자가 게임의 코드를 바꾸거나 자신만의 기능을 넣을 수 있는 이벤트 시스템을 제공하며, 모든 EXILED 이벤트들은 Harmony로 작성되어 직접적으로 서버의 어셈블리를 바꿀 필요가 없어, 2가지의 장점을 만들어냅니다. + +- 첫째로, 모든 프레임워크의 코드는 자유롭게 공유되거나 배포될 수 있어, 개발자들이 _어떻게_ 프레임워크가 작동하고 기능을 추가하고나 바꾸는 방법을 배울 수 있습니다. +- 둘째로, 프레임워크가 관련된 모든 코드가 서버 어셈블리 밖에서 작동되기 때문에, 만약 작은 업데이트가 존재하더라도, 프레임워크에는 아주 작은 영향을 미치게 됩니다. 이로 하여금 계속되는 업데이트와의 호환성이 (거의) 보장되며, 업데이트를 _필요할 때_ 할 수 있습니다. + +# 번역본 + +- [Русский](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-Русский.md) +- [中文](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-中文.md) +- [Español](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-ES.md) +- [Polski](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-PL.md) +- [Português-BR](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-BR.md) +- [Italiano](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-IT.md) +- [Čeština](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-CS.md) +- [Dansk](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-DK.md) +- [Türkçe](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-TR.md) +- [German](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-DE.md) +- [Français](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-FR.md) +- [한국어](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-KR.md) + +# EXILED 설치하기 + +EXILED의 설치 과정은 상당히 간단합니다. 노스우드의 Plugin API을 이용해 프레임워크를 불러오며, 이는 릴리즈 파일 `Exiled.tar.gz` 안에 2개의 폴더가 있는 이유가 됩니다. `SCP Secret Laboratory` 폴더는 `EXILED` 폴더에 있는 EXILED의 모든 기능을 불러오는데 필요한 파일들을 담고 있습니다. 이제 이 두 폴더를 (아래에 설명된) 위치로 옮기면, 짜잔! EXILED 설치 완료! + +만약 설치 프로그램을 사용한다면, 제대로 실행할 시 모든 EXILED의 기능을 자동으로 설치할 것입니다. + +# Windows + +### 설치 프로그램 사용 ([설치 프로그램 설명 (영어)](https://github.com/Exiled-Team/EXILED/blob/master/Exiled.Installer/README.md)) + +**주의사항**: 설치 프로그램을 사용하기 전에, SCP: 비밀 연구소 서버를 실행할 유저와 같은 유저인지, 또는 관리자 권한을 가진 유저인지 확인해주세요. + +- **[여기에서](https://github.com/Exiled-Team/EXILED/releases) `Exiled.Installer-Win.exe`** 를 다운로드합니다. (Assets 클릭 -> Exiled.Installer-Win.exe 클릭) +- 서버와 같은 폴더에 프로그램을 위치시킵니다. (서버를 다운로드 받지 않았다면 설치하세요.) +- **`Exiled.Installer.exe`** 를 실행하거나 프리릴리즈 버전을 설치하려면 **이 [.bat 파일](https://www.dropbox.com/s/xny4xus73ze6mq9/install-prerelease.bat?dl=1)을 받아** 서버 폴더에 넣고 실행합니다. +- 플러그인을 다운로드하고 설치하려면, 아래 [플러그인 설치](#플러그인-설치) 문단을 참고하세요. + **주의사항:** EXILED를 원격 서버에 설치하려고 한다면, .exe 파일을 실행할 때 SCP: 비밀 연구소 서버를 실행할 유저와 같은 유저인지, 또는 관리자 권한을 가진 유저인지 확인해주세요. + +### 수동 설치 + +- **`Exiled.tar.gz`를 [여기서](https://github.com/Exiled-Team/EXILED/releases)** 다운로드합니다. +- 안의 내용을 [7Zip](https://www.7-zip.org/) 이나 [WinRar](https://www.win-rar.com/download.html?&L=6)로 압축을 풀어주세요. +- **`EXILED`** 폴더를 **`%appdata%`** 로 옮깁니다. \*주의사항: 이 폴더는 `C:\Users\%UserName%\AppData\Roaming\SCP Secret Laboratory`**_가 아닌_** `C:\Users\%UserName%\AppData\Roaming`에 위치해야만 하며, `(...)\AppData` 가 아닌, **무조건** `(...)\AppData\Roaming`에 위치해야 합니다.\* +- **`SCP Secret Laboratory`** 폴더를 **`%appdata%`** 로 옮기세요. + - Windows 10 & 11: + `%appdata%`를 Windows 검색 창에 입력하거나, Windows 탐색기 상단 바에 입력하세요. + - 다른 Windows 버전: + `Win + R`을 누르고 `%appdata%`를 입력하세요. + +### 플러그인 설치 + +자, 이제 모든 설치가 완료되었습니다! EXILED는 이제 설치되었고 다음 서버 구동시 활성화 될 것입니다. EXILED 자체로는 아무것도 하지 않습니다. **[저희의 디스코드 서버](https://discord.gg/PyUkWTg)** 에서 새롭고 재미있는 플러그인을 찾아보세요! + +- 플러그인을 설치하려면: + - [_플러그인의_ 릴리즈 페이지](https://i.imgur.com/u34wgPD.jpg)에서 플러그인을 다운로드하세요. (**무조건 `.dll` 파일 형식이어야 합니다!**) + - 그리고 파일을 옮기세요! `C:\Users\%UserName%\AppData\Roaming\EXILED\Plugins` 로 .dll 파일을 옮기세요. (Win + R을 누르고, `%appdata%`을 적는 것으로 이동할 수 있습니다.) + +# 리눅스 + +### 설치 프로그램 사용 ([설치 프로그램 설명 (영어)](https://github.com/Exiled-Team/EXILED/blob/master/Exiled.Installer/README.md)) + +**주의사항**: 설치 프로그램을 사용하기 전에, SCP: 비밀 연구소 서버를 실행할 유저와 같은 유저인지, 또는 `root` 유저인지 확인해주세요. + +- **`Exiled.Installer-Linux`** 를 **[여기서](https://github.com/Exiled-Team/EXILED/releases)** 다운로드 하세요. (Assets 클릭 -> 설치 프로그램 다운로드) +- **`./Exiled.Installer-Linux --path /path/to/server`** 를 입력해 설치하거나, 파일을 서버 폴더 안에 위치시키고 터미널을 이동시킨 다음 (`cd`) **`./Exiled.Installer-Linux`** 를 입력하세요. +- 프리릴리즈 버전을 원한다면, 실행 시 **`--pre-releases`** 를 추가하세요. 예시: **`./Exiled.Installer-Linux /home/scp/server --pre-releases`** +- 또 다른 예시: 만약 `Exiled.Installer-Linux`를 서버 폴더 안에 위치시켰다면: **`/home/scp/server/Exiled.Installer-Linux --pre-releases`** 를 입력하세요. +- 플러그인을 다운로드하고 설치하려면 [플러그인 설치](#플러그인-설치-1) 문단을 참고해주세요. + +### 수동 설치 + +- SCP 서버를 실행하는 유저와 같은지 **확인하세요.** +- **`Exiled.tar.gz`** 를 **[여기서](https://github.com/Exiled-Team/EXILED/releases)** 다운로드하세요. (SSH: 우클릭으로 `Exiled.tar.gz` 링크를 복사하고, **`wget (다운로드-링크)`** 를 입력하세요.) +- 현재 폴더로 압축을 풀려면, **`tar -xzvf EXILED.tar.gz`** 를 입력하세요. +- **`EXILED`** 폴더를 **`~/.config`** 로 위치시키세요. \*주의사항: 이 폴더는 `~/.config/SCP Secret Laboratory` **_가 아닌_** `~/.config`에 위치해야 합니다. (SSH: **`mv EXILED ~/.config/`**) +- **`SCP Secret Laboratory`** 폴더를 **`~/.config`** 에 위치시키세요. \*주의사항: 이 폴더는 `~/.config/SCP Secret Laboratory` **_가 아닌_** `~/.config`에 위치해야 합니다. (SSH: **`mv SCP Secret Laboratory ~/.config/`**) + +### 플러그인 설치 + +자, 이제 모든 설치가 완료되었습니다! EXILED는 이제 설치되었고 다음 서버 구동시 활성화 될 것입니다. EXILED 자체로는 아무것도 하지 않습니다. **[저희의 디스코드 서버](https://discord.gg/PyUkWTg)** 에서 새롭고 재미있는 플러그인을 찾아보세요! + +- 플러그인을 설치하려면: + - [_플러그인의_ 릴리즈 페이지](https://i.imgur.com/u34wgPD.jpg)에서 플러그인을 다운로드하세요. (**무조건 `.dll` 파일 형식이어야 합니다!**) + - 그리고 파일을 옮기세요! + `~/.config/EXILED/Plugins` 로 .dll 파일을 옮기세요. (만약 SSH를 root로 사용한다면, `/home/(SCP 서버 유저)` 안에 있는 올바른 `.config`를 찾아보세요.) + +# 설정 + +EXILED 자체도 몇 가지 설정을 가지고 있습니다. 이 설정들은 서버 시작 시 자동으로 생성되며, `~/.config/EXILED/Configs/(서버-포트)-config.yml` 파일에 위치해 있습니다. (Windows의 경우 `%AppData%\EXILED\Configs\(서버포트)-config.yml` 입니다.) + +플러그인 설정은 **_위의_** `config_gameplay.txt` 파일에 위치해 있지 않습니다. 대신, 플러그인 설정은 `~/.config/EXILED/Configs/(서버-포트)-config.yml` 파일에 위치해 있습니다. (Windows의 경우 `%AppData%\EXILED\Configs\(서버포트)-config.yml` 입니다.) +하지만, 몇몇 플러그인은 아마도 자신만의 설청 파일을 가지고 있을 수 있습니다. 이 경우, 플러그인의 설명서를 참고하세요. + +# 개발자들을 위한 정보 + +만약 EXILED 플러그인을 만들고 싶다면, 사실 간단합니다. 튜토리얼을 원한다면 [여기 (영어)](https://github.com/Exiled-Team/EXILED/blob/master/GettingStarted.md)를 읽어주세요. + +좀 더 상세하고 자주 업데이트 되는 튜토리얼을 원한다면, [EXILED 웹사이트](https://exiled-team.github.io/EXILED/articles/install.html)를 방문해보세요. + +하지만 플러그인을 만들기 전에, 몇 가지 주의사항을 알아두세요: + +- 당신의 플러그인은 **무조건** `Exiled.API.Features.Plugin<>`을 상속받는 클래스를 가지고 있어야 합니다. 없다면 EXILED 실행 시 플러그인이 작동되지 않습니다. +- 플러그인이 실행되면, `OnEnabled()` 메서드가 **바로** 실행됩니다. 다른 플러그인이 불러와질 때까지 기다리지도 않고, 서버 시작 절차가 끝날 때가지 기다리지도 않습니다. **_아무것도 기다리지 않아요._** `OnEnabled()` 메소드을 구현할 때, 아직 설정이 되지 않은 것들, 예를 들어 `ServerConsole.Port`, 혹은 `PlayerManager.localPlayer` 을 사용하고 있지는 않은지 확인하세요. +- 만약 아직 설정이 되지 않은 것들을 빨리 사용하고 싶다면, `WaitingForPlayers` 이벤트를 기다리거나, 더 빨리, 최대한 빨리 사용하고 싶다면 코드를 `while(!x)` 안에 접근하고 싶은 것이 `null`이 아닌지 확인하는 코드와 함께 넣어주세요. +- EXILED는 플러그인 어셈블리들을 서버 동작 중 동적으로 다시 불러올 수 있습니다. 플러그인을 업데이트하고 싶다면, 서버를 재시작할 필요가 없습니다. 하지만, 플러그인을 다시 불러온다면, 플러그인이 리로드를 지원하는지 확인하세요. 지원하지 않은 상태로 리로드를 시도하면, 아주, 매우, 안 좋은 시간을 보내게 될 겁니다. `동적 리로드` 문단을 읽어 보세요. +- OnUpdate, OnFixedUpdate 이나 OnLateUpdate는 EXILED에 **_존재하지 않습니다_**. 코드를 그 정도로 많이 실행시키고 싶다면, MEC 코루틴을 사용하여 1 프레임, 0.01초 기다리는 코루틴을 사용하거나 Timing 레이어 (Timing.FixedUpdate 등) 를 사용하세요. + +### MEC 코루틴 + +만약 MEC과 익숙치 않다면, 괜찮아요! 이 문단은 아주 간단한 당신의 MEC의 시작점이 될 것입니다. +MEC 코루틴은 다시 말해서 그냥 기다릴 수 있는 메소드입니다. +코드를 실행하기 전에, SCP: 비밀 연구소 게임의 기본 스레드를 건드리지 않고, 몇 초/분~~(또는 아마도 시간)~~을 기다릴 수 있습니다. MEC 코루틴은 일반적인 스레딩과 달리 유니티와 사용할 때 안전합니다. **_유니티와 상호작용하려고 새로운 스레드를 만들지 마십시오. 이 행동은 서버를 터뜨릴 것입니다._** + +MEC을 사용하려면, `Assembly-CSharp-firstpass.dll`을 서버 파일로부터 참조하고 `using MEC;`을 코드에 넣어야 합니다. +여기 반복 할 때 딜레이를 주는 간단한 예제가 있습니다: + +```cs +using MEC; +using Exiled.API.Features; + +public void SomeMethod() +{ + Timing.RunCoroutine(MyCoroutine()); +} + +public IEnumerator MyCoroutine() +{ + for (;;) // 무한 반복 + { + Log.Info("무⭐한⭐반⭐복!"); // 서버 로그를 생성합니다. + yield return Timing.WaitForSeconds(5f); //코루틴에게 5초를 기다리라고 지시합니다. + } +} +``` + +MEC과 익숙치 않거나, 더 배우고 싶거나, 조언을 좀 받고 싶고나, 도움이 필요하다면 구글링을 좀 하거나 디스코드에서 물어보는 것이 **_매우_** 추천됩니다. 질문들은 얼마나 '수준 낮은지' 와 상관없이, 플러그인 개발자분들에게 추진력을 실어주기 위해 항상 최대한 호의적이고 깔끔하게 답변될 것입니다. 더 좋은 코드는 모두에게 좋은 것이니까요! + +### 동적 리로드 + +EXILED는 플러그인 어셈블리를 서버를 재시작하지 않고도 동적으로 재시작 할 수 있는 프레임워크입니다. +예를 들어, 만약 `Exiled.Events` 1개의 플러그인을 서버를 시작하고, 새로운 플러그인을 추가하고 실행하고 싶다면, 서버를 재시작 할 필요가 없습니다. `reload plugins`을 RA나 서버 콘솔에 입력해 모든 EXILED 플러그인-전에 없던 플러그인들도 리로딩할 수 있습니다. + +이것은 또한 플러그인을 완전히 서버를 재시작하지 않다고 *업데이트*를 할 수 있다는 것을 의미합니다. 하지만 이를 지원하기 위해, 플러그인 개발자들이 따라야 할 몇 가지 규칙이 있습니다. + +**_서버 주인은_** + +- 플러그인을 업데이트하고 있다면, 플러그인의 어셈블리 이름이 현재와 다른지 확인하세요. 플러그인 개발자가 동적 리로딩을 염두에 두고 플러그인을 개발해야 했으며, 파일 이름을 바꾸는 것 만으로는 충분하지 않습니다. +- 만약 플러그인이 동적 리로딩을 지원한다면, 새로운 플러그인을 "Plugins" 폴더에 넣을 때, 전에 있던 플러그인을 먼저 지워야 합니다. 그렇지 않으면, 안 좋은 일이 많이 일어날 수 있습니다. +- 플러그인을 동적으로 리로딩하는데 생기는 모든 책임은 모두 플러그인 개발자 혹은 서버 주인에게 있습니다. EXILED가 동적 리로드를 지원하는데, 문제가 생기는 방법은 플러그인 개발자나 서버 주인이 무언가를 잘못하는 방법 밖에는 없습니다. EXILED 개발자들에게 동적 리로드로 버그를 신고하기 전에 둘 모두에게 모든 것이 제대로 동작되었는지 확인하세요. + +**_개발자는_** + +- 동적 리로딩을 지원하는 플러그인을 만들 때, 플러그인이 걸려있던 모든 이벤트들을 비활성화되거나 리로딩 할 때 해제되어야 합니다. +- Harmony 패치가 있는 플러그인이라면 Harmony 인스턴스를 만들 때 이름을 일종의 항상 바뀌는 변수로 만들어야 합니다. 또한 플러그인이 비활성화되거나 리로딩 될 때 Harmony 패치를 `UnPatchAll()` 메소드로 해제해야 합니다. +- `OnEnabled()` 메소드에서 시작된 모든 코루틴들은 플러그인이 비활성화되거나 리로딩 될 때 중지되어야 합니다. + +위의 모든 것들은 `OnReloaded()` 또는 `OnDisabled()` 메소드에서 수행될 수 있습니다. EXILED가 플러그인을 리로드할 때, `OnDisabled()`가 호출되고 `OnReloaded()`가 호출됩니다. 그리고 새로운 어셈블리를 로드하고 `OnEnabled()`가 호출됩니다. + +_새로운_ 어셈블리들이라는 것에 주목해주세요. 만약 똑같은 이름을 가진 어셈블리로 바꾼다면, 업데이트되지 **_않을 것입니다_**. 이것은 GAC (Global Assembly Cache) 때문이며, 이미 캐시에 있는 어셈블리를 '불러오려고' 시도할 때, 이미 캐시에 있던 어셈블리를 불러 올 것입니다. +이러한 이유로, 만약 당신의 플러그인이 동적 리로딩을 지원한다면, 빌드 옵션에서 다른 어셈블리 이름을 가지고 빌드해야 합니다. (파일 이름을 바꾸는 것은 동작하지 않습니다.) 또한, 원래의 어셈블리가 필요하지 않을 때 "제거되지" 않으므로 만약 이벤트 해제, Harmony 인스턴스 언패칭, 코루틴 중지 등을 하지 않는다면 새로운 코드와 함께 오래된 코드가 같이 실행될 것입니다. 별로 좋은 일이 아니에요. + +이 때문에, 동적 리로딩을 지원하는 플러그인을 만들 때, **_무조건_** 이러한 규칙을 따라야 합니다. 만약 이러한 규칙을 따르지 않는다면, 디스코드 서버에서 삭제될 수 있습니다. + +모든 플러그인이 동적 리로딩을 지원하지 않아도 됩니다. 만약 동적 리로딩을 지원하지 않기로 생각했다면, 진짜 괜찮아요. :) +플러그인의 어셈블리 버전을 바꾸는 것을 피하시고, 서버 주인분들에게 플러그인을 업데이트하기 위해 서버를 재시작하라고 요청하세요. From f24d346973f13c5233b21def30084ce9fde080da Mon Sep 17 00:00:00 2001 From: You Seong Hyeon <89614632+Cocoa2219@users.noreply.github.com> Date: Tue, 23 Apr 2024 22:47:24 +0900 Subject: [PATCH 2/5] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b5607f6b33..755816ce3e 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ All EXILED events are coded with Harmony, meaning they require no direct editing - [Türkçe](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-TR.md) - [German](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-DE.md) - [Français](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-FR.md) +- [한국어](https://github.com/Exiled-Team/EXILED/blob/master/Localization/README-KR.md) # Installation Installation of EXILED is quite simple. It loads itself through Northwood’s Plugin API. That's why there are two folders inside the ``Exiled.tar.gz`` in release files. ``SCP Secret Laboratory`` contains the necessary files to load EXILED features in ``EXILED`` folder. All you need to do is move these two folders into the appropriate path, which are explained below, and you are done! From 095aae3845890072637c4b021956d0d7f8d1ce39 Mon Sep 17 00:00:00 2001 From: You Seong Hyeon <89614632+Cocoa2219@users.noreply.github.com> Date: Wed, 24 Apr 2024 07:29:24 +0900 Subject: [PATCH 3/5] Fixed Some Typos --- Localization/README-KR.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Localization/README-KR.md b/Localization/README-KR.md index 1b19ab59a8..72635edd60 100644 --- a/Localization/README-KR.md +++ b/Localization/README-KR.md @@ -102,7 +102,7 @@ EXILED의 설치 과정은 상당히 간단합니다. 노스우드의 Plugin API EXILED 자체도 몇 가지 설정을 가지고 있습니다. 이 설정들은 서버 시작 시 자동으로 생성되며, `~/.config/EXILED/Configs/(서버-포트)-config.yml` 파일에 위치해 있습니다. (Windows의 경우 `%AppData%\EXILED\Configs\(서버포트)-config.yml` 입니다.) 플러그인 설정은 **_위의_** `config_gameplay.txt` 파일에 위치해 있지 않습니다. 대신, 플러그인 설정은 `~/.config/EXILED/Configs/(서버-포트)-config.yml` 파일에 위치해 있습니다. (Windows의 경우 `%AppData%\EXILED\Configs\(서버포트)-config.yml` 입니다.) -하지만, 몇몇 플러그인은 아마도 자신만의 설청 파일을 가지고 있을 수 있습니다. 이 경우, 플러그인의 설명서를 참고하세요. +하지만, 몇몇 플러그인은 아마도 자신만의 설정 파일을 가지고 있을 수 있습니다. 이 경우, 플러그인의 설명서를 참고하세요. # 개발자들을 위한 정보 @@ -122,7 +122,7 @@ EXILED 자체도 몇 가지 설정을 가지고 있습니다. 이 설정들은 만약 MEC과 익숙치 않다면, 괜찮아요! 이 문단은 아주 간단한 당신의 MEC의 시작점이 될 것입니다. MEC 코루틴은 다시 말해서 그냥 기다릴 수 있는 메소드입니다. -코드를 실행하기 전에, SCP: 비밀 연구소 게임의 기본 스레드를 건드리지 않고, 몇 초/분~~(또는 아마도 시간)~~을 기다릴 수 있습니다. MEC 코루틴은 일반적인 스레딩과 달리 유니티와 사용할 때 안전합니다. **_유니티와 상호작용하려고 새로운 스레드를 만들지 마십시오. 이 행동은 서버를 터뜨릴 것입니다._** +코드를 실행하기 전에, SCP: 비밀 연구소 게임의 기본 스레드를 건드리지 않고, 몇 초/분 ~~(또는 아마도 시간)~~ 을 기다릴 수 있습니다. MEC 코루틴은 일반적인 스레딩과 달리 유니티와 사용할 때 안전합니다. **_유니티와 상호작용하려고 새로운 스레드를 만들지 마십시오. 이 행동은 서버를 터뜨릴 것입니다._** MEC을 사용하려면, `Assembly-CSharp-firstpass.dll`을 서버 파일로부터 참조하고 `using MEC;`을 코드에 넣어야 합니다. 여기 반복 할 때 딜레이를 주는 간단한 예제가 있습니다: From 85f451e12ad435583482d303dfd5ca0ad597d623 Mon Sep 17 00:00:00 2001 From: You Seong Hyeon <89614632+Cocoa2219@users.noreply.github.com> Date: Wed, 29 May 2024 10:46:12 +0900 Subject: [PATCH 4/5] Typo --- Localization/README-KR.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 @@ _새로운_ 어셈블리들이라는 것에 주목해주세요. 만약 똑같은 모든 플러그인이 동적 리로딩을 지원하지 않아도 됩니다. 만약 동적 리로딩을 지원하지 않기로 생각했다면, 진짜 괜찮아요. :) 플러그인의 어셈블리 버전을 바꾸는 것을 피하시고, 서버 주인분들에게 플러그인을 업데이트하기 위해 서버를 재시작하라고 요청하세요. + From d37e6e07325bbf8ea02afad6f8520d6ae3c9c1a3 Mon Sep 17 00:00:00 2001 From: You Seong Hyeon <89614632+Cocoa2219@users.noreply.github.com> Date: Wed, 29 May 2024 13:01:34 +0900 Subject: [PATCH 5/5] Create GettingStarted-KR.md --- Localization/GettingStarted-KR.md | 214 ++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 Localization/GettingStarted-KR.md 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)를 클릭해주세요!