[task] | instruction_following [pass] | ✅ 통과 [title] | LocalizationService [question] | `enTranslator`를 사용하여 `TEXT_TEST4` 키의 텍스트를 포맷팅할 때, 인수로 1과 2를 전달한 각각의 결과 문자열을 코드 블록(`lua`) 안에 `log` 문구만으로 출력하고, 다른 설명은 주석으로만 작성하세요. [answer] | ```lua -- enTranslator로 TEXT_TEST4 키를 1, 2 인수로 포맷팅하여 출력 local enTranslator = _LocalizationService:GetTranslatorForLocale("en") log(enTranslator:GetTextFormat("TEXT_TEST4", 1)) log(enTranslator:GetTextFormat("TEXT_TEST4", 2)) ``` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 질문에서 요구한 코드 블록 내 log 출력 및 주석만 사용하는 형식을 정확히 준수하며, 문서의 API 사용법과 일치합니다. [source_doc] | LocaleDataSet에서 텍스트를 조회하고 포맷에 맞게 변환하는 예제입니다. LocaleDataSet에 아래와 같이 내용을 작성해 예제를 사용할 수 있습니다. | Key | Source | Note | ko | en | | --- | --- | --- | --- | --- | | TEXT_TEST1 | Default Text | 일반 텍스트 예제 | 안녕 | Hello | | TEXT_TEST2 | Default Text | 간단한 포맷 예제 | 안녕, {0}! | Hello, {0}! | | TEXT_TEST3 | Defau
[task] | instruction_following [pass] | ✅ 통과 [title] | DataStorageService [question] | _데이터베이스_ 예제 코드에서 페이지 처리를 위한 while 루프의 종료 조건을 3문장 이내로 설명하세요. [answer] | `pages.IsLastPage` 속성이 `true`가 되면 `break`를 실행하여 루프를 종료합니다. 마지막 페이지가 아닌 경우 `pages:MoveToNextPageAndWait()`를 호출해 다음 페이지로 이동합니다. 이로써 모든 페이지의 데이터 처리가 완료되면 while 루프가 자연스럽게 종료됩니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 예제 코드를 정확히 분석하여 while 루프의 종료 조건과 페이지 이동 로직을 3문장 이내로 명확하고 올바르게 설명했습니다. [source_doc] | # Examples #### GetGlobalDataStorage DataStorageService를 활용해서 GlobalDataStorage를 가져오는 예제입니다. ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") ``` #### GetGlobalDataStoragePagesAsync DataStorageService를 활용해서 모든 GlobalDataStorage를 제거하는 예제입니다. ```lua _DataSto
[task] | instruction_following [pass] | ✅ 통과 [title] | DataStorageService [question] | _GetGlobalDataStoragePagesAsync_ 콜백 함수의 매개변수 이름 두 개를 표로 정리해서 출력하세요. [answer] | `_DataStorageService:GetGlobalDataStoragePagesAsync` 콜백 함수의 매개변수는 다음과 같습니다. | 매개변수 이름 | 설명 | | :--- | :--- | | `errorCode` | 오류 코드 | | `pages` | GlobalDataStorage 페이지 정보 객체 | [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서의 코드 예제에서 확인되는 콜백 매개변수 두 개를 정확하고 간결하게 표로 정리했습니다. [source_doc] | # Examples #### GetGlobalDataStorage DataStorageService를 활용해서 GlobalDataStorage를 가져오는 예제입니다. ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") ``` #### GetGlobalDataStoragePagesAsync DataStorageService를 활용해서 모든 GlobalDataStorage를 제거하는 예제입니다. ```lua _DataSto
[task] | two_turn [pass] | ✅ 통과 [title] | InputService [question] | InputService 를 사용하여 스크린 터치 입력을 처리하고 커서를 변경하는 방법을 설명해 주세요 [answer] | 메이플스토리 월드의 mLua 스크립트에서 `InputService`는 화면 터치 입력과 마우스 커서 상태 관리를 위한 주요 서비스입니다. 터치 이벤트는 클라이언트 공간에서 발생하며, 커서 변경도 클라이언트에서만 처리됩니다. ### 1. 스크린 터치 입력 처리 스크린 터치 이벤트는 `HandleScreenTouchEvent`와 `HandleScreenTouchReleaseEvent` 이벤트 핸들러를 통해 처리합니다. 이벤트 객체에는 `TouchId` (터치 식별자)와 `TouchPoint` (터치된 화면 좌표)가 포함되어 있습니다 [followup] | HandleScreenTouchEvent 에서 ScreenToWorldPosition 변환 시 UI 로직과 월드 좌표 계층 간 오차가 발생하면 어떻게 수정해야 하나요? [followup_answer] | 제공된 참고 문서에는 `HandleScreenTouchEvent`에서 `_UILogic:ScreenToWorldPosition` 변환 시 발생하는 UI 로직과 월드 좌표 계층 간 오차의 원인에 대한 설명이나, 이를 수정하기 위한 구체적인 API, 설정 방법, 또는 보정 로직이 포함되어 있지 않습니다. 문서에는 터치된 화면 좌표(`TouchPoint`)를 월드 좌표로 변환하는 방법만 다음과 같이 제시되어 있습니다: ```lua root.Children[TouchId].TransformComponent.WorldPosition = [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 API와 코드를 정확히 재현하고, 터치/커서 처리의 실행 공간 및 좌표 변환 로직을 명확하게 설명하여 질문 의도를 완벽히 충족함. [source_doc] | #### 터치 입력 터치한 위치에 파티클을 보여주는 예제입니다. ```lua Method: [server only] void OnBeginPlay () { local root = _EntityService:GetEntityByPath(EntityPath) for i = 1, #root.Children do root.Children[i].Enable = false end } Event Handler: [service: InputService] HandleScreenTouchEvent (ScreenTouchEvent ev
[task] | two_turn [pass] | ✅ 통과 [title] | Service [question] | 서비스의 부모 클래스인 Service에서 ConnectEvent와 DisconnectEvent를 사용하여 이벤트 연결과 해제를 관리하는 기본 방식이 궁금합니다. [answer] | Service 클래스는 모든 서비스의 부모 클래스이며, 이벤트 연결과 해제를 관리하기 위해 `ConnectEvent`와 `DisconnectEvent` 메서드를 제공합니다. ### 이벤트 연결: ConnectEvent `ConnectEvent` 메서드를 사용하여 특정 이벤트가 발생했을 때 실행될 핸들러 함수를 등록할 수 있습니다. 두 가지重载(overload) 형태가 있습니다. 1. **이벤트 이름(String) 기반**: * **서명**: `EventHandlerBase ConnectEvent(string key [followup] | ConnectEvent에 string key를 전달할 때, SendEvent로 발생한 이벤트의 타입 이름이 key와 정확히 일치하지 않으면 핸들러가 호출되지 않는지, 그리고 이러한 불일치 상황에서 발생하는 예외나 로그 메시지는 무엇인지 알려주세요. [followup_answer] | 제공된 문서에는 `ConnectEvent`의 string key 매개변수가 `SendEvent`로 발생한 이벤트의 타입 이름과 정확히 일치해야만 핸들러가 호출되는지에 대한 명시적인 설명은 없습니다. 다만, "타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다"라는 설명으로부터 이름이 일치해야 통지된다는 것을 추론할 수는 있습니다. 또한, 이름 불일치 상황에서 발생하는 예외나 로그 메시지에 대한 정보는 제공된 문서에 포함되어 있지 않습니다. [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서에 있는 ConnectEvent와 DisconnectEvent의 시그니처, 반환값, 매개변수 역할을 정확히 설명하여 질문에 충실히 답하고 있습니다. [source_doc] | 모든 서비스의 부모 서비스입니다. 서비스의 기본 기능들을 제공합니다. # Methods - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤
[task] | single_turn [pass] | ✅ 통과 [title] | LocalizationService [question] | SmartFormat에서 choose 포맷을 사용할 때, 대괄호 안에 포함된 값의 개수와 파이프 구분으로 나뉜 형식 문자열의 개수가 일치하지 않으면 어떤 오류가 발생하나요? [answer] | 제공된 문서에는 `choose` 포맷에서 대괄호 안의 값 개수와 파이프(`|`)로 구분된 형식 문자열 개수가 일치하지 않을 때 발생하는 구체적인 오류 내용이나 예외 처리 방식에 대한 정보가 포함되어 있지 않습니다. 문서에는 `choose` 포맷의 사용 예제만 제시되어 있을 뿐, 잘못된 형식 입력 시의 동작 방식을 설명하고 있지 않습니다. [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 문서에 해당 오류 정보가 없음을 정확히 지적하여 환상을 방지했으나, 구체적인 답변을 제공하지 못해 유용성이 약간 낮습니다. [source_doc] | LocaleDataSet에서 텍스트를 조회하고 포맷에 맞게 변환하는 예제입니다. LocaleDataSet에 아래와 같이 내용을 작성해 예제를 사용할 수 있습니다. | Key | Source | Note | ko | en | | --- | --- | --- | --- | --- | | TEXT_TEST1 | Default Text | 일반 텍스트 예제 | 안녕 | Hello | | TEXT_TEST2 | Default Text | 간단한 포맷 예제 | 안녕, {0}! | Hello, {0}! | | TEXT_TEST3 | Defau
[task] | single_turn [pass] | ✅ 통과 [title] | Service [question] | 이벤트 핸들러를 등록하고 나서는 언제든 `DisconnectEvent`를 호출해서 연결을 끊을 수 있나요? [answer] | 네, `DisconnectEvent` 메서드를 사용하여 이벤트 핸들러와 서비스 간의 연결을 언제든 끊을 수 있습니다. `ConnectEvent`를 통해 이벤트를 연결할 때 반환되는 `EventHandlerBase` 객체를 매개변수로 전달하면, 해당 특정 핸들러와의 연결만 해제됩니다. `DisconnectEvent` 호출 성공 시 `true`, 실패 시 `false`를 반환합니다. 참고로 연결을 끊을 때는 이벤트 식별자(`string key` 또는 `Type eventType`)와 함께, 원래 연결할 때 받은 `EventHandl [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 API 시그니처(ConnectEvent 반환값, DisconnectEvent 매개변수 및 반환값)를 정확히 인용하고, mLua 문법 규칙에 부합하는 올바른 코드 예시를 제시하여 질문에 명확히 답변했습니다. [source_doc] | 모든 서비스의 부모 서비스입니다. 서비스의 기본 기능들을 제공합니다. # Methods - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤
[task] | instruction_following [pass] | ✅ 통과 [title] | DataStorageService [question] | inherited from Service 블록의 ConnectEvent와 DisconnectEvent 메서드 시그니처를 입력/출력/설명 3열의 표로 정리하세요. [answer] | ```lua | 입력 | 출력 | 설명 | | :--- | :--- | :--- | | `string key`<br>`IScriptFunction eventHandler` | `EventHandlerBase` | 이 서비스에서 이름이 `key`인 이벤트가 발생하면, `eventHandler`로 통지받습니다. 핸들러는 `event` 매개 변수를 전달받습니다. | | `Type eventType`<br>`IScriptFunction eventHandler` | `EventHandlerBase` | 이 서비스에서 타입이 `eventTyp [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 명시된 ConnectEvent와 DisconnectEvent의 시그니처와 설명을 정확히 표로 정리하여 질문 의도에 부합합니다. [source_doc] | taStoragePagesAsync(func<int32, UserDataStoragePages> callbackFunction) [ServerOnly]** UserDataStorage를 페이지 단위로 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **boolean SetAndWait(string storageName, string key, string value) [Deprecated] [ServerOnly] [Yield
[task] | instruction_following [pass] | ✅ 통과 [title] | LocalizationService [question] | `Choose` 포맷 예시에서 `subjects` 테이블의 모든 요소를 순회하며 `SmartFormat`으로 생성되는 출력 문장 7개를, 각 문장의 주어(I, You, We, They, He, She, It)가 무엇인지 명시하는 단계별 번호 목록으로 나열하세요. [answer] | 참고 문서에 포함된 `Choose` 포맷 예시 코드를 바탕으로 생성되는 7개의 출력 문장은 다음과 같습니다. ```lua local subjects = {"I", "You", "We", "They", "He", "She", "It"} for _, s in ipairs(subjects) do log(_LocalizationService:SmartFormat( "{0} {0:choose(I|You|We|They):am|are|are|are|is} ready.", s)) end ``` 1. 주어: `I` → 출력: `I am re [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=3 coherence=4 complexity=2 verbosity=2 [judge_reason] | 요청된 7개 문장을 명확하게 나열했으나, 참고 문서에 없는 'It' 항목에 대해 'is'를 출력으로 단정하여 문법적 오류가 발생할 수 있는 불확실한 추측을 포함했습니다. [source_doc] | LocaleDataSet에서 텍스트를 조회하고 포맷에 맞게 변환하는 예제입니다. LocaleDataSet에 아래와 같이 내용을 작성해 예제를 사용할 수 있습니다. | Key | Source | Note | ko | en | | --- | --- | --- | --- | --- | | TEXT_TEST1 | Default Text | 일반 텍스트 예제 | 안녕 | Hello | | TEXT_TEST2 | Default Text | 간단한 포맷 예제 | 안녕, {0}! | Hello, {0}! | | TEXT_TEST3 | Defau
[task] | code [pass] | ❌ 탈락 [title] | InputService [question] | ScreenTouchEvent 를 수신하여 터치 위치를 기반으로 BasicParticleComponent 를 활성화하고, ScreenTouchReleaseEvent 가 발생하면 비활성화하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에 `ScreenTouchEvent`와 `ScreenTouchReleaseEvent`라는 이벤트 이름은 나열되어 있지만, 이 이벤트들이 어떤 프로퍼티(예: 터치 위치를 나타내는 좌표 프로퍼티)를 포함하는지에 대한 구체적인 정보가 없습니다. 또한, `BasicParticleComponent`를 활성화/비활성화하는 구체적인 메서드(예: `SetActive`, `Play` 등)에 대한 정보도 문서에 포함되어 있지 않습니다. 따라서, 문서에 없는 API나 프로퍼티를 지어내지 않기 위해, 현재 제공된 정보만으로는 **완전한 [followup] | [followup_answer] | [scores] | helpfulness=2 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서에 API 상세 정보가 없어 실제 동작 코드를 작성할 수 없는 상황에서, 존재하는 이벤트 이름과 컴포넌트 접근 규칙만 준수하여 정직한 스테레톤을 제공하며 지어내지 않는 태도가 정확합니다. [source_doc] | * BasicParticleComponent * RigidbodyComponent * StateComponent * TransformComponent * KeyboardKey * KeyDownEvent * KeyHoldEvent * KeyReleaseEvent * KeyUpEvent * ScreenTouchEvent * ScreenTouchReleaseEvent * UILogic * UtilLogic * Vector3 * EntityService * [InputService를 활용한 입력과 액션](/docs?postId=209)
[task] | two_turn [pass] | ✅ 통과 [title] | LocalizationService [question] | _LocalizationService 로 다국어 텍스트를 조회할 때 기본 GetText 와 Translator 객체 사용의 차이는 무엇이며, 어떤 경우에 각각을 사용해야 하는가? [answer] | `_LocalizationService`를 이용한 다국어 텍스트 조회 시 **기본 `GetText`**와 **Translator 객체** 사용의 차이는 다음과 같습니다. ### 1. 차이점 * **기본 `_LocalizationService:GetText(key)`** * **동작 방식:** 현재 월드에 설정된 **현재 언어 설정(Current Locale)** 에 해당하는 컬럼의 텍스트만 조회합니다. * **특징:** 특정 언어를 지정할 수 없으며, 항상 클라이언트나 서버의 현재 로케일 설정을 따릅니다 [followup] | SmartFormat 함수에서 hpp(한자음 종결음)과 choose(선택) 포맷을 함께 사용할 수 있는지, 불가능하다면 예외 처리 방법은 무엇인가? [followup_answer] | 제공된 참고 문서에 근거할 때, `SmartFormat` 함수 내에서 `hpp` 포맷과 `choose` 포맷을 **같은 문자열 리터럴 내에서 함께 사용하는 구체적인 예시나 문법 규칙은 문서에 명시되어 있지 않습니다.** 문서에는 각각의 포맷이 독립적으로 사용되는 예제만 제공되고 있습니다: 1. **hpp 포맷 예제:** `"안녕, {0:hpp:{}아|{}야}!"` 2. **choose 포맷 예제:** `"{0} {0:choose(I|You|We|They):am|are|are|are|is} ready."` 따라서, 두 포맷을 [scores] | helpfulness=4 correctness=3 coherence=4 complexity=4 verbosity=2 [judge_reason] | API 사용법과 차이점에 대한 설명은 정확하고 유용하지만, 참고 문서 예제에서 [clinet only]로 표기된 것을 [client only]로 정정하여 제시한 것은 원문과의 일치성 측면에서 감점 사유가 됩니다. [source_doc] | LocaleDataSet에서 텍스트를 조회하고 포맷에 맞게 변환하는 예제입니다. LocaleDataSet에 아래와 같이 내용을 작성해 예제를 사용할 수 있습니다. | Key | Source | Note | ko | en | | --- | --- | --- | --- | --- | | TEXT_TEST1 | Default Text | 일반 텍스트 예제 | 안녕 | Hello | | TEXT_TEST2 | Default Text | 간단한 포맷 예제 | 안녕, {0}! | Hello, {0}! | | TEXT_TEST3 | Defau
[task] | code [pass] | ❌ 탈락 [title] | InputService [question] | InputService의 ScreenTouchHoldEvent를 처리하여 화면을 계속 누르고 있는 동안 1초마다 log를 출력하는 스크립트를 작성해줘 [answer] | `ScreenTouchHoldEvent`는 화면을 계속 터치하거나 클릭하고 있는 동안 발생하는 이벤트입니다. 질문에서 요청하신 "1초마다 log 출력"은 이 이벤트가 연속적으로 트리거되는 특성을 활용하여, 마지막 로그 시각을 추적하고 1초 이상 경과했을 때만 로그를 출력하는 방식으로 구현할 수 있습니다. 참고 문서에 있는 API와 이벤트 정보에 기반하여 작성한 스크립트는 다음과 같습니다. ```lua Property: [None] number LastLogTime = 0 Method: [client only] void OnBe [followup] | [followup_answer] | [scores] | helpfulness=1 correctness=2 coherence=0 complexity=2 verbosity=5 [judge_reason] | 응답이 지극히 장황하고 중간에 코드 블록이 잘못 닫혀 문법적으로 불일치하며, OnUpdate의 실행 공간이 [client only]인 반면 이벤트 핸들러는 [service: InputService]로 선언되어 클라이언트/서버 간 상태 공유가 불가능한 구조적 오류가 있습니다. [source_doc] | - **ExitPopupClosedEvent** 종료 팝업을 닫을 때 발생하는 이벤트입니다. - **ExitPopupOpenedEvent** 종료 팝업을 열 때 발생하는 이벤트입니다. - **KeyDownEvent** Key를 눌렀을 때 1회 발생합니다. - **KeyHoldEvent** Key를 누르는 동안 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyReleaseEvent** Key를 눌렀다 뗐을 때 1회 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyUpEvent** Key를 눌렀다
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | DeleteUserDataStorageAndWait 메서드에서 반환되는 int32 에러 코드가 0이 아닐 경우, 보통 어떤 원인으로 발생한다고 볼 수 있나요? [answer] | 제공된 문서에는 `DeleteUserDataStorageAndWait` 메서드가 반환하는 에러 코드의 구체적인 원인(에러 코드별 의미)에 대한 설명이 포함되어 있지 않습니다. 문서에서는 해당 메서드가 "userId에 해당하는 UserDataStorage를 삭제하고, 에러 코드를 반환한다"는 사실과, 수행하는 동안 스크립트 실행이 중단되는(Yield) 점만 명시하고 있을 뿐, 에러 코드 0이 아닐 때 발생하는 구체적인 원인은 언급되어 있지 않습니다. 따라서 문서의 근거만으로는 에러의 원인을 특정할 수 없습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 제공된 문서에 에러 코드별 원인이 명시되어 있지 않음을 정확히 지적하고, 근거 없는 추측을 배제하여 질문에 적절히 답변했습니다. [source_doc] | 다양한 DataStorage 접근 기능을 제공합니다. # Methods - **int32 DeleteCreatorDataStorageAndWait() [ServerOnly] [Yield]** CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **int32 DeleteCreatorDataStorageAndWait(string name) [ServerOnly] [Yield]** 특정 이름의 CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다
[task] | single_turn [pass] | ❌ 탈락 [title] | Service [question] | `ConnectEvent`의 두 가지 오버로드 중 `Type eventType`를 사용하는 방식과 `string key`를 사용하는 방식의 실용적인 차이는 무엇인가요? [answer] | `ConnectEvent`의 두 가지 오버로드는 이벤트 식별 방식에 차이가 있으며, 이는 코드 유지보수성과 안정성에 영향을 줍니다. **1. `string key` 사용 방식** * **방법:** 이벤트의 이름(문자열)을 직접 전달합니다. ```lua _SomeService:ConnectEvent("MyEventName", MyHandlerFunction) ``` * **특징:** * 직관적으로 이벤트 이름을 알 수 있습니다. * **단점:** 이벤트 이름이 변경되거나 오타가 있으 [followup] | [followup_answer] | [scores] | helpfulness=2 correctness=0 coherence=3 complexity=3 verbosity=3 [judge_reason] | mLua는 Lua 기반이라 컴파일 시 타입 체크가 불가능하고, 문서에 'Type' 객체를 전달하는 문법이나 IDE 자동완성 등 정적 분석 기능이 존재하지 않으므로 응답이 사실을 지어냄. [source_doc] | 모든 서비스의 부모 서비스입니다. 서비스의 기본 기능들을 제공합니다. # Methods - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤
[task] | single_turn [pass] | ✅ 통과 [title] | Service [question] | `EventHandlerBase` 타입은 `ConnectEvent`를 호출할 때 반환되는데, 이 반환 값을 나중에 `DisconnectEvent`에 전달해야 하는 이유는 무엇인가요? [answer] | `EventHandlerBase` 반환 값을 나중에 `DisconnectEvent`에 전달해야 하는 이유는, **이벤트 연결의 고유한 인스턴스(핸들러)를 식별하기 위해서**입니다. ### 상세 설명 1. **다중 핸들러 지원:** * `ConnectEvent`를 호출하면 특정 이벤트(예: `UserEnterEvent`)에 대한 핸들러가 등록됩니다. * 만약 같은 이벤트에 대해 **여러 개의 다른 핸들러 함수**를 연결할 수 있다면, 어떤 핸들러가 연결되었는지를 구분해야 합니다. * `Connec [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 ConnectEvent/DisconnectEvent 시그니처를 정확히 인용하여, 핸들러 식별을 위해 반환값이 필요한 이유를 논리적으로 잘 설명했습니다. [source_doc] | 모든 서비스의 부모 서비스입니다. 서비스의 기본 기능들을 제공합니다. # Methods - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤
[task] | two_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | DataStorageService에서 CreatorDataStorage를 삭제할 때 동기(Wait) 방식과 비동기(Async) 방식의 차이점과 사용 시 주의사항이 무엇인가요? [answer] | DataStorageService에서 CreatorDataStorage를 삭제할 때 동기(Wait) 방식과 비동기(Async) 방식의 주요 차이점과 주의사항은 다음과 같습니다. ### 1. 동기(Wait) 방식: `DeleteCreatorDataStorageAndWait` * **동작 방식**: 함수 호출 시 즉시 실행되며, 삭제 작업이 완료될 때까지 스크립트의 실행을 중단(블로킹)합니다. * **리턴값**: 작업 완료 후 **에러 코드(int32)** 를 반환합니다. * **사용 예시**: ```lua [followup] | [Yield] 태그가 붙은 DeleteCreatorDataStorageAndWait() 호출 시 스크립트 실행이 중단되는 동안 다른 로직이 처리되지 않는 현상을 방지하기 위해 Async 버전과 콜백 함수를 조합한 코드 예제를 작성해 주세요. [followup_answer] | `[Yield]` 태그가 붙은 동기 함수 호출 시 발생하는 블로킹 문제를 방지하기 위해, `DeleteCreatorDataStorageAsync`와 콜백 함수를 조합하여 비동기적으로 처리하는 코드 예제는 다음과 같습니다. ```lua Method: [server only] void RequestDeleteCreatorStorage() { -- 비동기 삭제 요청 -- 삭제 작업은 백그라운드에서 수행되며, 이 함수는 즉시 반환됩니다. _DataStorageService:DeleteCreatorDataStorage [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 API 시그니처, 속성(ServerOnly, Yield), 동작 방식(블로킹/비동기) 및 반환 타입을 정확히 설명하고 올바른 mLua 코드 예시를 제시하여 질문에 충실히 답함. [source_doc] | 다양한 DataStorage 접근 기능을 제공합니다. # Methods - **int32 DeleteCreatorDataStorageAndWait() [ServerOnly] [Yield]** CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **int32 DeleteCreatorDataStorageAndWait(string name) [ServerOnly] [Yield]** 특정 이름의 CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | CreatorDataStorage를 이름 없이 기본값으로 가져오는 방법과 특정 이름을 지정해서 가져오는 방법의 구분이 궁금합니다. [answer] | `DataStorageService`에서 `CreatorDataStorage`를 가져오는 방법은 두 가지로 나뉩니다. 두 방법 모두 `[ServerOnly]`로, 서버 공간에서만 호출할 수 있습니다. **1. 이름 없이 기본값으로 가져오는 방법** `GetCreatorDataStorage()` 메서드를 파라미터 없이 호출합니다. ```lua local storage = _DataStorageService:GetCreatorDataStorage() ``` **2. 특정 이름을 지정해서 가져오는 방법** `GetCreatorDat [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서와 mLua 규칙에 따라 CreatorDataStorage의 두 가지 접근 방식을 정확하고 명확하게 설명했습니다. [source_doc] | tAsync() 함수를 사용하세요. - **CreatorDataStorage GetCreatorDataStorage() [ServerOnly]** CreatorDataStorage를 얻어옵니다. - **CreatorDataStorage GetCreatorDataStorage(string name) [ServerOnly]** 특정 이름의 CreatorDataStorage를 얻어옵니다. - **int32, CreatorDataStoragePages GetCreatorDataStoragePagesAndWait() [ServerOn
[task] | code [pass] | ✅ 통과 [title] | LocalizationService [question] | 클라이언트에서 실행되는 스크립트에서 _LocalizationService:GetTextFormat("player_level", self.PlayerLevel)을 사용하여 플레이어 레벨이 포함된 번역된 텍스트를 생성하고 log로 출력하는 스크립트를 작성해줘 [answer] | ```lua Method: [client only] void OnBeginPlay() { local text = _LocalizationService:GetTextFormat("player_level", self.PlayerLevel) log(text) } ``` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=None verbosity=2 [judge_reason] | 요청 사항과 참고 문서의 API 시그니처 및 실행 공간([client only])을 정확히 반영하여 간결하고 올바른 스크립트를 제공했습니다. [source_doc] | 텍스트 번역 관련 기능을 제공합니다. # Properties - **string CurrentLocaleId [ReadOnly]** 클라이언트의 현재 언어 코드입니다. 출시 월드에서는 '월드 언어' 메뉴에서 선택한 언어이며, 메이커에서는 '테스트 플레이 언어' 옵션에서 설정한 언어입니다. - **Translator LocalTranslator [ReadOnly]** CurrentLocaleId에 해당하는 Translator 객체입니다. # Methods - **string GetText(string key) [Clie
[task] | instruction_following [pass] | ✅ 통과 [title] | DataStorageService [question] | 비동기 페이지 조회 함수의 시그니처와 콜백 함수의 인자 구성을 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void ExampleCreatorDataStoragePages() { -- GetCreatorDataStoragePagesAsync: CreatorDataStorage를 페이지 단위로 비동기 조회합니다. -- 인자: callbackFunction (func<int32, CreatorDataStoragePages> 타입) -- 콜백 함수는 작업 완료 시 에러 코드(int32)와 조회용 객체(CreatorDataStoragePages)를 인자로 받습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=4 verbosity=2 [judge_reason] | 참고 문서에 명시된 4가지 비동기 페이지 조회 함수의 시그니처와 콜백 인자를 정확히 코드와 주석으로 제시했으며, mLua 규칙에도 부합합니다. [source_doc] | tAsync() 함수를 사용하세요. - **CreatorDataStorage GetCreatorDataStorage() [ServerOnly]** CreatorDataStorage를 얻어옵니다. - **CreatorDataStorage GetCreatorDataStorage(string name) [ServerOnly]** 특정 이름의 CreatorDataStorage를 얻어옵니다. - **int32, CreatorDataStoragePages GetCreatorDataStoragePagesAndWait() [ServerOn
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | 페이지 단위 조회 함수들을 사용했을 때 반환되는 int32 에러 코드가 0이 아니면 어떤 문제를 의미하는 건지 궁금합니다. [answer] | 제공된 문서에는 `GetCreatorDataStoragePagesAndWait()`, `GetGlobalDataStoragePagesAndWait()`, `GetSortableDataStoragePagesAndWait()` 및 각 비동기 함수가 에러 코드(`int32`)와 함께 반환한다고 명시되어 있습니다. 그러나, **에러 코드가 0이 아닐 때 구체적으로 어떤 문제(예: 네트워크 오류, 권한 문제, 데이터 없음 등)를 의미하는지에 대한 상세한 설명은 제공된 문서에 포함되어 있지 않습니다.** 문서에는 단순히 "작업이 완료되면 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 없는 에러 코드 의미를 지어내지 않고 문서 범위 내 정보를 정확히 전달했으나, 문서에 없는 '1000005' 예시를 언급하여 사실 확인이 불가한 내용을 포함했습니다. [source_doc] | tAsync() 함수를 사용하세요. - **CreatorDataStorage GetCreatorDataStorage() [ServerOnly]** CreatorDataStorage를 얻어옵니다. - **CreatorDataStorage GetCreatorDataStorage(string name) [ServerOnly]** 특정 이름의 CreatorDataStorage를 얻어옵니다. - **int32, CreatorDataStoragePages GetCreatorDataStoragePagesAndWait() [ServerOn
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | GetDataStorage 함수가 Deprecated 표시가 붙어 있는데, 이제 어떤 함수를 대체해서 사용해야 하는지 알려주세요. [answer] | `GetDataStorage(string name)` 함수는 더 이상 사용되지 않도록(Deprecated) 처리되어 있습니다. 이 함수를 대체하여 사용해야 하는 함수는 저장하려는 데이터의 성격에 따라 다음 네 가지 중 하나를 선택하여 사용해야 합니다. 1. **`GetGlobalDataStorage(string name)`**: 전역적으로 공유되는 데이터를 저장할 때 사용합니다. 2. **`GetUserDataStorage(string userId)`**: 특정 유저에게만 적용되는 개인 데이터를 저장할 때 사용합니다. 3. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서와 규칙에 근거하여 Deprecated 함수의 대체안을 정확히 설명하고, 표준 구문을 활용한 적절한 코드 예시를 제시하였습니다. [source_doc] | tAsync() 함수를 사용하세요. - **CreatorDataStorage GetCreatorDataStorage() [ServerOnly]** CreatorDataStorage를 얻어옵니다. - **CreatorDataStorage GetCreatorDataStorage(string name) [ServerOnly]** 특정 이름의 CreatorDataStorage를 얻어옵니다. - **int32, CreatorDataStoragePages GetCreatorDataStoragePagesAndWait() [ServerOn
[task] | single_turn [pass] | ✅ 통과 [title] | LocalizationService [question] | LocalTranslator와 GetTranslatorForLocale으로 생성한 Translator의 GetTextFormat 호출 시, 두 번째 인자로 전달하는 숫자(예: 1, 2)는 어떤 역할을 하는지 설명해 주세요. [answer] | `GetTextFormat` 메서드의 두 번째 인자로 전달되는 숫자는 **복수 형태(Plural) 처리를 위한 값**으로 사용됩니다. 문서에 포함된 예시를 보면, `TEXT_TEST4` 키의 영어(en) 컬럼에 `"I have {0:p:an apple\|{} apples}."`라는 스마트 포맷 문자열이 정의되어 있습니다. 여기서 `{0:p: ... }` 구문은 첫 번째 인자(`{0}`)의 값이 숫자일 때, 그 숫자의 크기에 따라 괄호 안의 대안 텍스트 중 하나를 선택하여 적용하는 역할을 합니다. 구체적인 동작은 다음과 같습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 예제와 결과를 정확히 인용하여 숫자 인자가 복수/단수 포맷 선택에 사용됨을 명확히 설명했습니다. [source_doc] | LocaleDataSet에서 텍스트를 조회하고 포맷에 맞게 변환하는 예제입니다. LocaleDataSet에 아래와 같이 내용을 작성해 예제를 사용할 수 있습니다. | Key | Source | Note | ko | en | | --- | --- | --- | --- | --- | | TEXT_TEST1 | Default Text | 일반 텍스트 예제 | 안녕 | Hello | | TEXT_TEST2 | Default Text | 간단한 포맷 예제 | 안녕, {0}! | Hello, {0}! | | TEXT_TEST3 | Defau
[task] | single_turn [pass] | ✅ 통과 [title] | LocalizationService [question] | `GetTextFormat`과 `SmartFormat` 메서드의 차이점이 무엇이며, 어떤 상황에서 각각을 사용하는 것이 적절한가요? [answer] | `GetTextFormat`과 `SmartFormat` 메서드는 모두 텍스트에 값을 채워넣는 형식화(formatting) 기능을 제공하지만, **번역 테이블을 사용하는지 여부**에서 근본적인 차이가 있습니다. ### 1. 주요 차이점 | 구분 | `GetTextFormat(string key, any... args)` | `SmartFormat(string format, any... args)` | | :--- | :--- | :--- | | **출처** | **번역 테이블(Translation Table)**에서 `key`를 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=4 verbosity=2 [judge_reason] | 참고 문서의 API 정의와 일치하며, 두 메서드의 차이점과 사용 시나리오를 명확하고 정확하게 설명했습니다. [source_doc] | 텍스트 번역 관련 기능을 제공합니다. # Properties - **string CurrentLocaleId [ReadOnly]** 클라이언트의 현재 언어 코드입니다. 출시 월드에서는 '월드 언어' 메뉴에서 선택한 언어이며, 메이커에서는 '테스트 플레이 언어' 옵션에서 설정한 언어입니다. - **Translator LocalTranslator [ReadOnly]** CurrentLocaleId에 해당하는 Translator 객체입니다. # Methods - **string GetText(string key) [Clie
[task] | single_turn [pass] | ✅ 통과 [title] | LocalizationService [question] | 클라이언트에서 `_LocalizationService.GetText("key")`를 호출했는데 아무 값도 안 나와서, 번역 테이블 구조와 키 매칭 방식이 어떻게 되는지 알고 싶습니다. [answer] | `_LocalizationService:GetText("key")`가 값을 반환하지 않는다면, 주로 **키(key)가 번역 테이블에 정확히 존재하지 않는 경우**나 **현재 로케일(CurrentLocaleId)에 해당하는 번역 값이 비어 있는 경우**일 가능성이 높습니다. 문서에 명시된 번역 테이블 구조와 매칭 방식은 다음과 같습니다. ### 1. 번역 테이블 구조 번역 테이블은 행(Row)과 열(Column) 구조를 가지며, `GetText` 메서드는 다음과 같은 로직으로 값을 찾습니다. * **행(Key):** `Get [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=3 coherence=4 complexity=3 verbosity=2 [judge_reason] | 번역 테이블 구조와 매칭 방식 설명은 정확하나, Translator 객체의 GetText 메서드 존재 여부가 문서에 명시되지 않아 불확실성이 있다. [source_doc] | 텍스트 번역 관련 기능을 제공합니다. # Properties - **string CurrentLocaleId [ReadOnly]** 클라이언트의 현재 언어 코드입니다. 출시 월드에서는 '월드 언어' 메뉴에서 선택한 언어이며, 메이커에서는 '테스트 플레이 언어' 옵션에서 설정한 언어입니다. - **Translator LocalTranslator [ReadOnly]** CurrentLocaleId에 해당하는 Translator 객체입니다. # Methods - **string GetText(string key) [Clie
[task] | instruction_following [pass] | ✅ 통과 [title] | ItemService [question] | ItemService에서 아이템을 생성하거나 소유권을 변경할 때 서버에서만 실행 가능한 메서드 2개를 단계별 번호 목록으로 제시해 주세요. [answer] | ItemService에서 아이템 생성 및 소유권 변경 시 서버에서만 실행 가능한 메서드는 다음과 같습니다. 1. `CreateItem` 2. `ChangeOwner` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 질문에서 요구한 서버 전용 메서드 2개를 정확하고 간결하게 목록으로 제시하여 문서와 일치하며 유용합니다. [source_doc] | 아이템 관련 기능을 제공합니다. # Methods - **void ChangeOwner(Item item, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **void ChangeOwner(string itemGUID, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **Item CreateItem(Type itemType,
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | GlobalDataStorage 와 SortableDataStorage 를 삭제할 때 사용되는 DeleteGlobalDataStorageAndWait 와 DeleteSortableDataStorageAndWait 의 파라미터 구성이 왜 다른지 설명해 주세요. [answer] | 참고 문서에 제시된 `DeleteGlobalDataStorageAndWait`와 `DeleteSortableDataStorageAndWait` 메서드의 시그니처를 보면, 두 메서드 모두 **`string name`** 하나만 파라미터로 받습니다. * `int32 DeleteGlobalDataStorageAndWait(string name)` * `int32 DeleteSortableDataStorageAndWait(string name)` 즉, 두 메서드의 파라미터 구성은 **동일**합니다. 질문에서 언급하신 '파라미터 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서와 대조하여 두 메서드의 파라미터가 동일하다는 점을 정확히 지적하고, 관련 메서드와의 차이점까지 설명하여 질문에 효과적으로 답했습니다. [source_doc] | 다양한 DataStorage 접근 기능을 제공합니다. # Methods - **int32 DeleteCreatorDataStorageAndWait() [ServerOnly] [Yield]** CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **int32 DeleteCreatorDataStorageAndWait(string name) [ServerOnly] [Yield]** 특정 이름의 CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다
[task] | code [pass] | ✅ 통과 [title] | LocalizationService [question] | 클라이언트에서 실행되는 스크립트에서 _LocalizationService:GetText("welcome_message")를 호출하여 현재 언어에 맞는 환영 문구를 가져와 log로 출력하는 스크립트를 작성해줘 [answer] | 요청하신 기능은 `GetText` 메서드가 `[ClientOnly]`로 지정되어 있어 클라이언트에서만 실행되도록 구성해야 합니다. `OnBeginPlay` 생명주기 메서드 내에서 해당 메서드를 호출하여 결과를 `log`로 출력하는 스크립트입니다. ```lua Method: [client only] void OnBeginPlay () { local welcomeMessage = _LocalizationService:GetText("welcome_message") log(welcomeMessage) } ``` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서의 API 사용법과 mLua 규칙에 부합하는 정확하고 간결한 예제를 제공했습니다. [source_doc] | 텍스트 번역 관련 기능을 제공합니다. # Properties - **string CurrentLocaleId [ReadOnly]** 클라이언트의 현재 언어 코드입니다. 출시 월드에서는 '월드 언어' 메뉴에서 선택한 언어이며, 메이커에서는 '테스트 플레이 언어' 옵션에서 설정한 언어입니다. - **Translator LocalTranslator [ReadOnly]** CurrentLocaleId에 해당하는 Translator 객체입니다. # Methods - **string GetText(string key) [Clie
[task] | instruction_following [pass] | ✅ 통과 [title] | ItemService [question] | ItemService의 CreateItem 메서드에서 UserItemDataSet에 필수로 작성해야 하는 기본 3개 열의 이름을 표로 정리해서 나열해 주세요. [answer] | `ItemService`의 `CreateItem` 메서드에서 `UserItemDataSet`에 기본으로 작성해야 하는 필수 3개 열의 이름은 다음과 같습니다. | 열 이름 | | :--- | | Name | | IconRUID | | Description | [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 UserItemDataSet의 필수 3개 열(Name, IconRUID, Description)을 정확히 표로 정리하여 질문에 완벽하게 부합합니다. [source_doc] | 아이템 관련 기능을 제공합니다. # Methods - **void ChangeOwner(Item item, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **void ChangeOwner(string itemGUID, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **Item CreateItem(Type itemType,
[task] | single_turn [pass] | ✅ 통과 [title] | LocalizationService [question] | GetTranslatorForLocale("en")으로 영문 번역기를 만든 후, 해당 번역기의 GetTextFormat을 호출하면 현재 게임 설정 언어와 관계없이 항상 영문 텍스트가 반환되나요? [answer] | 네, `_LocalizationService:GetTranslatorForLocale("en")`으로 생성한 번역기(Translator)의 `GetTextFormat` 메서드를 호출하면, 현재 게임의 언어 설정과 관계없이 항상 영문(`en`) 컬럼의 텍스트가 반환됩니다. 참고 문서의 예제 코드를 보면 이를 명확히 확인할 수 있습니다. 현재 언어 설정이 한국어(`ko`)라고 가정할 때, `koTranslator`는 현재 언어 설정에 해당하는 컬럼을 조회하지만, `enTranslator`는 명시적으로 영문 컬럼을 조회하도록 지정되어 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 예제 코드를 정확히 인용하여 GetTranslatorForLocale이 특정 로케일에 고정됨을 명확히 설명했으므로 모든 항목에서 높은 점수를 받을 수 있습니다. [source_doc] | LocaleDataSet에서 텍스트를 조회하고 포맷에 맞게 변환하는 예제입니다. LocaleDataSet에 아래와 같이 내용을 작성해 예제를 사용할 수 있습니다. | Key | Source | Note | ko | en | | --- | --- | --- | --- | --- | | TEXT_TEST1 | Default Text | 일반 텍스트 예제 | 안녕 | Hello | | TEXT_TEST2 | Default Text | 간단한 포맷 예제 | 안녕, {0}! | Hello, {0}! | | TEXT_TEST3 | Defau
[task] | code [pass] | ✅ 통과 [title] | LocalizationService [question] | 클라이언트에서 실행되는 스크립트에서 _LocalizationService:CurrentLocaleId를 확인하여 "ko_KR"일 경우 _LocalizationService:GetText("korean_only_text")를, 그렇지 않을 경우 _LocalizationService:GetText("english_default_text")를 호출하여 조건부 로컬라이즈된 메시지를 log로 출력하는 스크립트를 작성해줘 [answer] | 요청하신 조건부 로컬라이즈 메시지 출력 로직을 구현한 스크립트입니다. ```lua Method: [client only] void OnBeginPlay() { local localeId = _LocalizationService.CurrentLocaleId local message = "" if localeId == "ko_KR" then message = _LocalizationService:GetText("korean_only_text") else message = _L [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 API(_LocalizationService, GetText)와 시스템 규칙([client only], OnBeginPlay, log)을 정확히 준수하여 질문한 조건부 로직을 명확하게 구현했습니다. [source_doc] | 텍스트 번역 관련 기능을 제공합니다. # Properties - **string CurrentLocaleId [ReadOnly]** 클라이언트의 현재 언어 코드입니다. 출시 월드에서는 '월드 언어' 메뉴에서 선택한 언어이며, 메이커에서는 '테스트 플레이 언어' 옵션에서 설정한 언어입니다. - **Translator LocalTranslator [ReadOnly]** CurrentLocaleId에 해당하는 Translator 객체입니다. # Methods - **string GetText(string key) [Clie