[task] | code [pass] | ✅ 통과 [title] | LocalizationService [question] | 현재 언어 설정에 맞춰 TEXT_TEST1 키의 일반 텍스트를 조회하여 log 로 출력하는 [client only] OnBeginPlay() 스크립트를 작성해줘. [answer] | ```lua Method: [client only] void OnBeginPlay() { local plainText = _LocalizationService:GetText("TEXT_TEST1") log("plainText: ", plainText) } ``` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=1 [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] | instruction_following [pass] | ✅ 통과 [title] | ItemService [question] | ItemService의 ChangeOwner 메서드 두 가지 시그니처의 차이를 3문장 이내로 설명해 주세요. [answer] | `ChangeOwner(Item item, InventoryComponent owner)`는 `Item` 객체 인스턴스를 직접 전달하여 소유권을 이전합니다. 반면 `ChangeOwner(string itemGUID, InventoryComponent owner)`는 아이템의 GUID 문자열을 전달하여 대상 아이템을 식별합니다. 두 메서드 모두 서버에서만 실행되며, 최종적으로 지정한 `InventoryComponent`에게 아이템 소유권을 넘기는 기능은 동일합니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 두 시그니처의 차이점과 제약 조건(ServerOnly)을 정확하고 간결하게 설명했습니다. [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] | GetUserDataStorage는 userId를 파라미터로 받는데, 서버 사이드에서 특정 유저의 데이터를 조회할 때 이 함수를 호출하는 것이 맞나요? [answer] | 네, 맞습니다. `GetUserDataStorage`는 `userId`를 파라미터로 받아 특정 유저의 `UserDataStorage` 객체를 반환하는 함수입니다. 참고 문서에 따르면 이 함수는 `[ServerOnly]` 속성이 붙어 있어 **서버 사이드에서만 호출할 수 있습니다.** 따라서 서버 스크립트에서 특정 유저의 데이터를 조회할 때 이 함수를 사용하는 것이 올바른 방식입니다. 아래는 서버 사이드에서 해당 유저의 데이터를 조회하는 mLua 예시입니다. ```lua Property: [None] integer meso = [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=3 complexity=3 verbosity=2 [judge_reason] | GetUserDataStorage 사용법은 정확하나, 문서에 없는 GetAndWait 메서드와 self.Entity.PlayerComponent.UserId를 지어내어 정확도에서 감점됨. [source_doc] | tAsync() 함수를 사용하세요. - **CreatorDataStorage GetCreatorDataStorage() [ServerOnly]** CreatorDataStorage를 얻어옵니다. - **CreatorDataStorage GetCreatorDataStorage(string name) [ServerOnly]** 특정 이름의 CreatorDataStorage를 얻어옵니다. - **int32, CreatorDataStoragePages GetCreatorDataStoragePagesAndWait() [ServerOn
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | DisconnectEvent를 호출하여 이벤트 연결을 끊을 때 반환되는 boolean 값이 false인 경우, 연결이 실패했음을 의미하는 것인지 확인이 필요합니다. [answer] | 제공된 문서에는 `DisconnectEvent` 메서드가 "이벤트 연결을 끊습니다"라고만 설명되어 있으며, 반환되는 `boolean` 값이 `false`일 때의 구체적인 의미(실패 원인, 예외 상황 등)에 대한 정의가 포함되어 있지 않습니다. 따라서 문서 기반으로는 `false` 반환이 단순히 연결 실패를 의미하는지, 혹은 다른 상태를 나타내는지 확인이 불가능합니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 명시되지 않은 반환값의 의미를 지어내지 않고, 문서 기반 한계를 정확히 지적하여 질문자의 확인 요구에 가장 적절한 답변을 제공했습니다. [source_doc] | taStoragePagesAsync(func<int32, UserDataStoragePages> callbackFunction) [ServerOnly]** UserDataStorage를 페이지 단위로 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **boolean SetAndWait(string storageName, string key, string value) [Deprecated] [ServerOnly] [Yield
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | SendEvent 메서드에 전달하는 EventType 객체를 직접 생성하여 발생시키는 과정이 어떻게 이루어지는지 알고 싶습니다. [answer] | 참고 문서에 `SendEvent(EventType sendEvent)` 메서드가 `Service`에서 상속된 메서드로 존재한다는 정보만 있습니다. 하지만, `EventType` 객체를 **직접 생성하는 방법**(생성자, 팩토리 메서드, 또는 초기화 방법)에 대한 설명은 제공된 문서에 포함되어 있지 않습니다. 또한, `EventType`의 구체적인 프로퍼티나 구조에 대한 정보도 없습니다. 따라서 현재 제공된 문서 범위 내에서 `EventType` 객체를 직접 생성하여 `SendEvent`에 전달하는 구체적인 코드 작성은 불가능합니 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 없는 EventType 생성 방법을 지어내지 않고, 문서 한계 내에서 정확하고 명확하게 답변했습니다. [source_doc] | taStoragePagesAsync(func<int32, UserDataStoragePages> callbackFunction) [ServerOnly]** UserDataStorage를 페이지 단위로 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **boolean SetAndWait(string storageName, string key, string value) [Deprecated] [ServerOnly] [Yield
[task] | code [pass] | ✅ 통과 [title] | LocalizationService [question] | ko 로케일 LocalTranslator 를 사용하여 TEXT_TEST3 키에 "세상"과 "세계" 값을 각각 적용한 HPP 포맷 결과를 log 로 출력하는 [client only] OnBeginPlay() 스크립트를 작성해줘. [answer] | ```lua Method: [client only] void OnBeginPlay() { local koTranslator = _LocalizationService.LocalTranslator local formatTextHpp1 = koTranslator:GetTextFormat("TEXT_TEST3", "세상") local formatTextHpp2 = koTranslator:GetTextFormat("TEXT_TEST3", "세계") log("Hpp format: ", formatTextHpp1, "/", forma [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 질문에서 요구한 ko 로케일 LocalTranslator 사용, TEXT_TEST3 키에 대한 '세상'과 '세계' 값 적용, HPP 포맷 결과 log 출력 및 [client only] OnBeginPlay() 스크립트 작성 요구사항을 참고 문서 예제와 완전히 일치하게 정확히 충족함 [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] | en 로케일 Translator 를 생성하여 TEXT_TEST2 키에 "world" 값을 채운 포맷된 텍스트와 ko 로케일 LocalTranslator 에 "세상" 값을 채운 텍스트를 각각 log 로 출력하는 [client only] OnBeginPlay() 스크립트를 작성해줘. [answer] | ```lua Method: [client only] void OnBeginPlay() { local enTranslator = _LocalizationService:GetTranslatorForLocale("en") local koTranslator = _LocalizationService.LocalTranslator local formatTextEn = enTranslator:GetTextFormat("TEXT_TEST2", "world") local formatTextKo = koTranslator [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 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] | single_turn [pass] | ❌ 탈락 [title] | LocalizationService [question] | GetText와 GetTextFormat을 사용할 때 각각 어떤 상황에서 사용해야 하며, 두 함수의 반환값에 차이가 있나요? [answer] | `GetText`와 `GetTextFormat`는 둘 다 `LocaleDataSet`에 정의된 로컬라이제이션 텍스트를 가져오는 함수이지만, 텍스트에 변수 값을 채워 넣어야 하는지에 따라 사용 상황이 다릅니다. **1. 사용 상황** * **`GetText(key)`**: * 텍스트에 **변수(플레이어 이름, 숫자 등)가 포함되지 않은 고정된 문장**을 가져올 때 사용합니다. * 참고 문서의 `TEXT_TEST1`("안녕" / "Hello")처럼 `{0}` 같은 포맷 플레이스홀더가 없는 단순 텍스트를 조회 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | GetText가 포맷 플레이스홀더를 포함해 원본 문자열을 반환한다고 단정하는 것은 문서에 명시되지 않았으며, GetTextFormat이 Translator 객체의 메서드임을 언급하지 않아 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] | single_turn [pass] | ❌ 탈락 [title] | LocalizationService [question] | 서버 공간에서 로컬라이제이션 텍스트를 가져와서 클라이언트로 보내야 할 때, `_LocalizationService`를 서버에서 직접 호출할 수 없으므로 어떤 방식으로 데이터를 전달해야 하나요? [answer] | `_LocalizationService`의 텍스트 조회 메서드(`GetText`, `GetTextFormat`, `SmartFormat`)와 `GetTranslatorForLocale` 모두 **[ClientOnly]** 속성을 가지고 있습니다. 따라서 서버 스크립트에서는 이 서비스의 메서드를 직접 호출할 수 없습니다. 서버에서 클라이언트로 로컬라이제이션 텍스트를 전달해야 하는 경우, 서버는 번역된 문자열 자체를 계산하는 대신 **번역 키(Key)** 또는 **번역에 필요한 변수 값**을 클라이언트로 전송하고, 클라이언트 스크립트 [followup] | [followup_answer] | [scores] | helpfulness=2 correctness=1 coherence=3 complexity=3 verbosity=2 [judge_reason] | 서버-클라이언트 통신에 문서에 없는 ClientCommunicationComponent와 HandleReceiveLocalizationData 메서드를 지어내어 사용하도록 유도했으며, 이는 mLua의 표준 API가 아닙니다. [source_doc] | 텍스트 번역 관련 기능을 제공합니다. # Properties - **string CurrentLocaleId [ReadOnly]** 클라이언트의 현재 언어 코드입니다. 출시 월드에서는 '월드 언어' 메뉴에서 선택한 언어이며, 메이커에서는 '테스트 플레이 언어' 옵션에서 설정한 언어입니다. - **Translator LocalTranslator [ReadOnly]** CurrentLocaleId에 해당하는 Translator 객체입니다. # Methods - **string GetText(string key) [Clie
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | SetAndWait와 SetAsync 함수가 Deprecated 상태로 표시되어 있는데, 이를 대체하기 위해 사용해야 하는 용도에 맞는 DataStorage의 정확한 함수 이름은 무엇인가요? [answer] | 참고 문서에 따르면 `SetAndWait`와 `SetAsync` 함수는 비추천(Deprecated) 상태이며, 이를 대체하기 위해 **"용도에 맞는 DataStorage의 SetAndWait() 함수"** 와 **"용도에 맞는 DataStorage의 SetAsync() 함수"** 를 사용하라고 안내하고 있습니다. 그러나 문서에는 `UserDataStorage` 객체를 통해 호출하는 구체적인 대체 함수의 정확한 시그니처나 매개변수 형태가 명시되어 있지 않습니다. 문서의 예제 코드에서는 여전히 `userDataStorage:SetAs [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=3 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 명시된 대체 함수 이름(DataStorage의 SetAndWait/SetAsync)을 정확히 인용하되, 문서에 없는 'UserDataStorage 객체'나 '예제 코드'를 지어내어 사실 관계를 왜곡했으나, 핵심 답변은 문서와 일치함. [source_doc] | taStoragePagesAsync(func<int32, UserDataStoragePages> callbackFunction) [ServerOnly]** UserDataStorage를 페이지 단위로 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **boolean SetAndWait(string storageName, string key, string value) [Deprecated] [ServerOnly] [Yield
[task] | code [pass] | ❌ 탈락 [title] | Service [question] | `_Service`의 `SendEvent(EventType sendEvent)` 메서드를 사용하여 OnUpdate에서 매 5초마다 "Heartbeat" 이벤트를 발생시키는 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 `SendEvent(EventType sendEvent)` 메서드가 존재함을 명시하고 있으나, `EventType` 클래스를 직접 인스턴스화하는 방법이나 특정 이벤트 타입(예: "Heartbeat")을 생성하는 구체적인 API 문법은 포함되어 있지 않습니다. 또한, mLua 스크립트에서 임의의 문자열 이름을 가진 커스텀 이벤트를 `EventType` 객체로 변환하여 `SendEvent`에 전달하는 방법이 문서에 나와 있지 않아, 이를 추측하여 코드를 작성하는 것은 불가능합니다. 따라서 제공된 문서 정보만으로는 [followup] | [followup_answer] | [scores] | helpfulness=1 correctness=3 coherence=3 complexity=2 verbosity=2 [judge_reason] | 문서에 없는 API를 지어내지 않으려 정확성을 유지했으나, mLua의 Event Handler 구조를 활용하여 'Heartbeat' 이벤트 발생 및 수신 스크립트를 작성할 수 있음에도 불가능하다고 답해 질문자 요구를 충족하지 못함. [source_doc] | 모든 서비스의 부모 서비스입니다. 서비스의 기본 기능들을 제공합니다. # Methods - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | errorCode 가 0 이 아닌 경우를 확인하고 return 하는 로직이 있는데, 이때 오류 코드가 어떤 의미를 가지는지 알 수 있는 곳이 있나요? [answer] | 제공된 문서에는 `errorCode`의 구체적인 수치별 의미나 오류 코드 상수 정의에 대한 정보가 포함되어 있지 않습니다. 문서에서 확인할 수 있는 내용은 `errorCode ~= 0`일 경우 예외가 발생했음을 의미하며, 이때는 함수를 중단하기 위해 `return`하는 패턴만입니다. 따라서 오류 코드의 정확한 의미를 파악할 방법은 주어진 자료로는 알 수 없습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 오류 코드 정의가 없음을 정확히 지적하고, 주어진 범위 내에서 적절한 답변을 제공했습니다. [source_doc] | # Examples #### GetGlobalDataStorage DataStorageService를 활용해서 GlobalDataStorage를 가져오는 예제입니다. ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") ``` #### GetGlobalDataStoragePagesAsync DataStorageService를 활용해서 모든 GlobalDataStorage를 제거하는 예제입니다. ```lua _DataSto
[task] | single_turn [pass] | ❌ 탈락 [title] | DataStorageService [question] | 문서에서 GetAndWait 와 GetAsync 함수가 Deprecated 상태라고 하는데, 이 대신에 각 DataStorage의 어떤 함수를 사용해야 하는지 정확히 알려주실 수 있나요? [answer] | 참고 문서에는 `DataStorageService`의 `GetAndWait`와 `GetAsync` 함수가 Deprecated 상태이며, 대신 **각 DataStorage 객체 자체의 `GetAndWait()` 함수**를 사용해야 한다고 명시되어 있습니다. 문서에 따르면 `DataStorageService` 레벨의 함수가 아닌, `GetUserDataStorage` 등으로 획득한 DataStorage 객체를 직접 호출하는 방식이 권장됩니다. 실제 사용 예제 코드에서도 이를 확인할 수 있습니다. ```lua Property: [Sy [followup] | [followup_answer] | [scores] | helpfulness=2 correctness=1 coherence=3 complexity=2 verbosity=2 [judge_reason] | 문서에 없는 `GetUserDataStorage` 메서드와 잘못된 코드 예제를 지어내어 정확도가 낮고, 문서에 명시된 대안 함수명(`GetAndWait`)만 언급하여 질문의 핵심을 정확히 충족하지 못함 [source_doc] | 다양한 DataStorage 접근 기능을 제공합니다. # Methods - **int32 DeleteCreatorDataStorageAndWait() [ServerOnly] [Yield]** CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **int32 DeleteCreatorDataStorageAndWait(string name) [ServerOnly] [Yield]** 특정 이름의 CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다
[task] | instruction_following [pass] | ✅ 통과 [title] | UserService [question] | KickUser 메서드의 실행 공간 제약과 매개변수 타입을 코드 주석으로만 설명하세요. [answer] | ```lua -- KickUser 메서드 실행 공간 제약: [ServerOnly] (서버에서만 실행 가능) -- 매개변수 1: string userId (추방할 유저의 ID) -- 매개변수 2: KickReason kickReason (추방 사유) ``` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서의 KickUser 메서드 시그니처 및 제약 사항을 정확하고 간결하게 주석으로 설명했습니다. [source_doc] | 유저 관련 기능을 제공합니다. # Properties - **Entity LocalPlayer [ReadOnly]** 내 유저 엔티티입니다. 클라이언트에서만 사용 가능합니다. - **ReadOnlyDictionary<string, Entity> UserEntities [ReadOnly]** 모든 유저 엔티티 목록입니다. key는 유저 Id, value는 유저 엔티티입니다. - **ReadOnlyDictionary<string, User> Users [ReadOnly]** 모든 유저 정보 목록입니다. key는 유저 Id
[task] | code [pass] | ✅ 통과 [title] | ItemService [question] | InventoryComponent 과 _ItemService 를 이용해 "Get Item" 오브젝트 충돌 시 아이템 3개 추가, "Give Item" 충돌 시 1개 차감 후 0이 되면 제거, "Trash Can" 충돌 시 아이템을 완전히 제거하는 HandleTriggerEnterEvent 스크립트를 작성해줘 [answer] | 요청하신 동작을 수행하는 스크립트입니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters local TriggerBodyEntity = event.TriggerBodyEntity -------------------------------------------------------- if self:IsClient() then return end local inventory = self.Entit [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 예제 코드를 정확히 재현하여 질문에 대한 요구사항을 완벽히 충족하며, 불필요한 설명 없이 간결하고 명확하게 답변했습니다. [source_doc] | 플레이어의 인벤토리에 아이템을 추가하고, 개수를 변경하고, 제거하는 예제입니다. 이름이 `Get Item`인 오브젝트에 충돌하면 아이템을 3개 획득합니다. 이름이 `Give Item`인 오브젝트에 충돌하면 아이템 개수가 1 감소합니다. 아이템 개수가 0이 되면 제거합니다. 이름이 `Trash Can`인 오브젝트에 충돌하면 아이템을 제거합니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters lo
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | while true 루프에서 pages.IsLastPage 를 확인하여 break 하는 방식이 아닌 다른 페이지 처리 방법이 있나요? [answer] | 제시된 참고 문서에 따르면, `while true` 루프와 `pages.IsLastPage` 확인을 통한 페이지 처리 방식 외에 다른 페이지 처리 방법은 명시되어 있지 않습니다. 문서에 포함된 모든 페이지 처리 예제(전체 GlobalDataStorage 삭제, 버전 목록 가져오기, 배지 정보 검색 등)는 동일한 패턴을 따릅니다: 1. `while true` 루프 시작 2. `pages:GetCurrentPageDatas()`로 현재 페이지 데이터 가져오기 3. 데이터 처리 4. `if pages.IsLastPage == true [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에는 while true 루프와 IsLastPage 확인 방식만 명시되어 있으므로, 다른 방법이 없다는 응답은 문서와 일치하며 질문에 대한 적절한 제한적 답변으로 보입니다. [source_doc] | # Examples #### GetGlobalDataStorage DataStorageService를 활용해서 GlobalDataStorage를 가져오는 예제입니다. ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") ``` #### GetGlobalDataStoragePagesAsync DataStorageService를 활용해서 모든 GlobalDataStorage를 제거하는 예제입니다. ```lua _DataSto
[task] | instruction_following [pass] | ✅ 통과 [title] | UserService [question] | 문서에 명시된 [ServerOnly] 속성이 붙은 메서드 3개를 단계별 번호 목록으로 제시하세요. [answer] | 문서에 명시된 [ServerOnly] 속성이 붙은 메서드 3개는 다음과 같습니다. 1. `string GetUserBanReason(string profileCode) [ServerOnly] [ReleaseOnly]` 2. `boolean IsUserBanned(string profileCode) [ServerOnly] [ReleaseOnly]` 3. `void KickUser(string userId, KickReason kickReason) [ServerOnly]` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 [ServerOnly] 속성을 가진 메서드 3개를 정확하고 간결하게 단계별 번호 목록으로 제시하여 질문에 완벽하게 부합합니다. [source_doc] | 유저 관련 기능을 제공합니다. # Properties - **Entity LocalPlayer [ReadOnly]** 내 유저 엔티티입니다. 클라이언트에서만 사용 가능합니다. - **ReadOnlyDictionary<string, Entity> UserEntities [ReadOnly]** 모든 유저 엔티티 목록입니다. key는 유저 Id, value는 유저 엔티티입니다. - **ReadOnlyDictionary<string, User> Users [ReadOnly]** 모든 유저 정보 목록입니다. key는 유저 Id
[task] | instruction_following [pass] | ✅ 통과 [title] | UserService [question] | UserService의 Properties만 나열하고 각 프로퍼티의 접근 권한을 표로 정리하세요. [answer] | UserService의 프로퍼티와 각 프로퍼티의 접근 권한은 다음과 같습니다. | 프로퍼티 이름 | 접근 권한 | 설명 | | :--- | :--- | :--- | | `LocalPlayer` | `[ReadOnly]` | 내 유저 엔티티입니다. 클라이언트에서만 사용 가능합니다. | | `UserEntities` | `[ReadOnly]` | 모든 유저 엔티티 목록입니다. key는 유저 Id, value는 유저 엔티티입니다. | | `Users` | `[ReadOnly]` | 모든 유저 정보 목록입니다. key는 유저 Id, va [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서에 명시된 UserService의 3개 프로퍼티와 접근 권한([ReadOnly])을 정확하고 간결한 표로 정리하여 질문을 완벽히 충족했습니다. [source_doc] | 유저 관련 기능을 제공합니다. # Properties - **Entity LocalPlayer [ReadOnly]** 내 유저 엔티티입니다. 클라이언트에서만 사용 가능합니다. - **ReadOnlyDictionary<string, Entity> UserEntities [ReadOnly]** 모든 유저 엔티티 목록입니다. key는 유저 Id, value는 유저 엔티티입니다. - **ReadOnlyDictionary<string, User> Users [ReadOnly]** 모든 유저 정보 목록입니다. key는 유저 Id
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | DeleteCreatorDataStorageAsync 를 호출할 때 callbackFunction 에 전달되는 인자 중 에러 코드와 이름 외에 추가로 받는 값이 있는지, 그리고 그 값을 어떻게 처리해야 하는지 궁금합니다. [answer] | 제공된 문서의 `DataStorageService` 메서드 시그니처를 확인한 결과, `DeleteCreatorDataStorageAsync` 함수는 두 가지 오버로드(버전)가 존재하며, 각각의 콜백 함수가 받는 인자가 다릅니다. 1. **전체 삭제용 (이름 미지정):** `void DeleteCreatorDataStorageAsync(func<int32> callbackFunction)` - 콜백 함수는 **`int32` 타입의 에러 코드 1개**만 인자로 받습니다. - 이름을 추가로 받지 않습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 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] | DataStorageService [question] | DeleteCreatorDataStorageAndWait 와 DeleteCreatorDataStorageAsync 의 가장 큰 차이점은 무엇이며, 어떤 상황에서 비동기 방식을 선택해야 하는지 궁금합니다. [answer] | `DeleteCreatorDataStorageAndWait`와 `DeleteCreatorDataStorageAsync`의 가장 큰 차이점은 **스크립트 실행 방식(동기 vs 비동기)**입니다. 1. **DeleteCreatorDataStorageAndWait (동기)** * **특징:** CreatorDataStorage를 삭제하는 작업이 완료될 때까지 **스크립트 실행을 중단(블로킹)**합니다. * **반환값:** 작업이 끝나면 에러 코드(`int32`)를 직접 반환합니다. * **사용 상황:* [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서와 일치하여 동기/비동기 함수의 차이점과 선택 기준을 명확히 설명하고, mLua 문법 규칙에 부합하는 올바른 코드 예시를 제공했습니다. [source_doc] | 다양한 DataStorage 접근 기능을 제공합니다. # Methods - **int32 DeleteCreatorDataStorageAndWait() [ServerOnly] [Yield]** CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **int32 DeleteCreatorDataStorageAndWait(string name) [ServerOnly] [Yield]** 특정 이름의 CreatorDataStorage를 삭제하고, 에러 코드를 반환합니다
[task] | instruction_following [pass] | ✅ 통과 [title] | ItemService [question] | `HandleTriggerEnterEvent`에서 충돌 대상 이름에 따라 실행되는 분기 로직을 표로 정리하세요. [answer] | `HandleTriggerEnterEvent`에서 `TriggerBodyEntity.Name` 값에 따라 실행되는 로직은 다음과 같습니다. | 충돌 대상 이름 | 실행되는 로직 | | :--- | :--- | | `Get Item` | `_ItemService:CreateItem`을 호출하여 `TestItem`을 인벤토리에 생성하고, 생성된 아이템의 `ItemCount`를 3으로 설정합니다. | | `Give Item` | 인벤토리에 아이템이 존재하면(`#items > 0`), 첫 번째 아이템(`items[1]`)의 `ItemCo [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 코드 로직을 표로 정확하고 명확하게 정리했으며, 서버 사이드 실행 조건도 올바르게 언급했습니다. [source_doc] | 플레이어의 인벤토리에 아이템을 추가하고, 개수를 변경하고, 제거하는 예제입니다. 이름이 `Get Item`인 오브젝트에 충돌하면 아이템을 3개 획득합니다. 이름이 `Give Item`인 오브젝트에 충돌하면 아이템 개수가 1 감소합니다. 아이템 개수가 0이 되면 제거합니다. 이름이 `Trash Can`인 오브젝트에 충돌하면 아이템을 제거합니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters lo
[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | GetGlobalDataStorage 메서드에 "sampleStorage" 같은 문자열 인자를 전달하는 것이 데이터베이스 테이블 이름처럼 동작하나요? [answer] | 네, `GetGlobalDataStorage` 메서드에 전달하는 문자열 인자(예: `"sampleStorage"`)는 전역 데이터 스토리지의 **이름(Name)** 또는 **식별자**로 동작합니다. 문서 내 예제 코드를 보면 다음과 같이 특정 이름을 가진 `GlobalDataStorage` 객체를 가져오는 용도로 사용됩니다. ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") ``` 또한, 모든 전역 데이터 스토리지를 페이지 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=3 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 없는 '데이터베이스 테이블 이름' 비유와 '키(Key)'라는 정확한 용어 사용으로 개념이 다소 모호하지만, 문서 예제를 근거로 한 설명은 정확하고 일관성이 있다. [source_doc] | # Examples #### GetGlobalDataStorage DataStorageService를 활용해서 GlobalDataStorage를 가져오는 예제입니다. ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") ``` #### GetGlobalDataStoragePagesAsync DataStorageService를 활용해서 모든 GlobalDataStorage를 제거하는 예제입니다. ```lua _DataSto
[task] | instruction_following [pass] | ✅ 통과 [title] | ItemService [question] | 코드 블록만 출력하고 로직 설명은 주석으로만 작성하세요. [answer] | ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters local TriggerBodyEntity = event.TriggerBodyEntity -------------------------------------------------------- if self:IsClient() then return end local inventory = self.Entity.InventoryComponent lo [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=1 [judge_reason] | 요구사항에 따라 코드만 출력하고 로직 설명을 주석으로만 작성하였으며, 참고 문서의 API 및 로직과 정확히 일치합니다. [source_doc] | 플레이어의 인벤토리에 아이템을 추가하고, 개수를 변경하고, 제거하는 예제입니다. 이름이 `Get Item`인 오브젝트에 충돌하면 아이템을 3개 획득합니다. 이름이 `Give Item`인 오브젝트에 충돌하면 아이템 개수가 1 감소합니다. 아이템 개수가 0이 되면 제거합니다. 이름이 `Trash Can`인 오브젝트에 충돌하면 아이템을 제거합니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters lo
[task] | code [pass] | ❌ 탈락 [title] | Service [question] | `_Service`의 `ConnectEvent(Type eventType, IScriptFunction eventHandler)` 오버로드를 활용하여 특정 이벤트 타입을 연결하고, 해당 이벤트가 수신되면 `self.Entity.TransformComponent.Position`을 로그로 출력하는 스크립트를 작성해줘. [answer] | `_Service`의 `ConnectEvent` 메서드를 사용하여 이벤트 타입과 핸들러 함수를 연결할 수 있습니다. 요청하신 `ConnectEvent(Type eventType, IScriptFunction eventHandler)` 오버로드를 활용하여 특정 이벤트가 발생하면 엔티티의 현재 위치(`self.Entity.TransformComponent.Position`)를 로그로 출력하는 스크립트는 다음과 같습니다. 참고로, 실제 적용 시에는 연결하려는 구체적인 이벤트 타입(예: `DeadEvent`, `KeyDownEvent` [followup] | [followup_answer] | [scores] | helpfulness=0 correctness=0 coherence=3 complexity=2 verbosity=2 [judge_reason] | 응답은 self.Entity에 ConnectEvent를 호출하는 등 문서와 규칙에 없는 API를 지어내어 정답이 아니므로 도움도 정확성도 0점입니다. [source_doc] | 모든 서비스의 부모 서비스입니다. 서비스의 기본 기능들을 제공합니다. # Methods - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤
[task] | single_turn [pass] | ✅ 통과 [title] | ItemService [question] | ItemService:CreateItem 함수의 두 번째 인자로 전달하는 문자열의 역할은 무엇인가요? [answer] | `_ItemService:CreateItem` 함수의 두 번째 인자로 전달하는 문자열은 생성되는 아이템의 **이름**입니다. 제공된 예제 코드에서 `_ItemService:CreateItem(TestItem, "Test Item", inventory)`를 호출할 때, 첫 번째 인자인 `TestItem`은 아이템 모델 ID로 추정되며, 두 번째 인자인 `"Test Item"`은 해당 아이템이 인벤토리에 표시될 때 사용되는 이름으로 사용됩니다. [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=3 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 명시되지 않은 '이름'이라는 역할을 추측하여 서술했으나, 코드 맥락상 합리적이며 오해의 소지가 적습니다. [source_doc] | 플레이어의 인벤토리에 아이템을 추가하고, 개수를 변경하고, 제거하는 예제입니다. 이름이 `Get Item`인 오브젝트에 충돌하면 아이템을 3개 획득합니다. 이름이 `Give Item`인 오브젝트에 충돌하면 아이템 개수가 1 감소합니다. 아이템 개수가 0이 되면 제거합니다. 이름이 `Trash Can`인 오브젝트에 충돌하면 아이템을 제거합니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters lo
[task] | single_turn [pass] | ❌ 탈락 [title] | ItemService [question] | HandleTriggerEnterEvent 내에서 self:IsClient() 체크 후 return을 하지 않으면 어떤 문제가 발생하나요? [answer] | 제공된 참고 문서에는 `HandleTriggerEnterEvent` 내에서 `self:IsClient()` 체크 후 `return`을 수행하지 않을 경우 발생하는 구체적인 문제나 오류에 대한 설명이 포함되어 있지 않습니다. 문서에는 해당 예제 코드에서 클라이언트 측에서 처리를 중단시키기 위해 `if self:IsClient() then return end` 구문이 사용되고 있는 것만 확인할 수 있으며, 이를 생략했을 때의 결과나 원인에 대한 정보는 없습니다. [followup] | [followup_answer] | [scores] | helpfulness=1 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서에 해당 구문의 생략 시 문제점에 대한 설명이 없음을 정확히 지적했으나, 질문의 의도(문제점 파악)에 직접적인 답을 주지 못해 유용성이 낮음 [source_doc] | 플레이어의 인벤토리에 아이템을 추가하고, 개수를 변경하고, 제거하는 예제입니다. 이름이 `Get Item`인 오브젝트에 충돌하면 아이템을 3개 획득합니다. 이름이 `Give Item`인 오브젝트에 충돌하면 아이템 개수가 1 감소합니다. 아이템 개수가 0이 되면 제거합니다. 이름이 `Trash Can`인 오브젝트에 충돌하면 아이템을 제거합니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters lo
[task] | two_turn [pass] | ✅ 통과 [title] | UserService [question] | UserDisconnectEvent 와 UserReconnectEvent 가 발생하는 시점과 차이는 무엇인가요? [answer] | `UserDisconnectEvent`와 `UserReconnectEvent`는 유저의 네트워크 연결 상태 변화에 따라 발생하는 이벤트로, 발생 시점과 상황이 다음과 같이 다릅니다. **1. UserDisconnectEvent** * **발생 시점:** 유저의 네트워크 접속이 불안정하여 연결이 끊겼을 때 발생합니다. * **특징:** 네트워크 문제로 인해 유저가 일시적으로 접속이 끊긴 상황을 의미합니다. **2. UserReconnectEvent** * **발생 시점:** 유저가 재접속되었을 때 발생합니다. * * [followup] | UserLeaveEvent 핸들러가 실행되는 동안 유저 엔티티 삭제가 지연되는 경우의 예외 상황과 코드 작성 방법은 무엇인가요? [followup_answer] | `UserLeaveEvent` 핸들러 실행과 유저 엔티티 삭제 간의 관계에 대한 예외 상황과 대응 방법은 다음과 같습니다. ### 1. 예외 상황 일반적으로 `UserLeaveEvent` 핸들러가 실행을 완료한 이후에 유저 엔티티 삭제가 진행됩니다. 하지만 **핸들러 실행이 오래 걸리면서 일정 시간 이상**이 소요되는 경우, 핸들러가 완료되기 전에 유저 엔티티 삭제가 강제로 진행될 수 있습니다. 이 경우 핸들러 내부에서 유저 엔티티를 참조하거나 조작하는 로직이 실행 중인데, 엔티티가 이미 삭제되어 버리면 예외나 비정상적인 동작이 [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 두 이벤트의 정의와 발생 시점을 정확하고 명확하게 비교하여 설명했습니다. [source_doc] | - **UserDisconnectEvent** 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. - **UserEnterEvent** 유저가 입장할 때 UserService에서 발생하는 이벤트입니다. - **UserKickEvent** 유저가 추방되었을 때 발생하는 이벤트입니다. 서버에서만 발생합니다. - **UserLeaveEvent** 유저가 떠날 때 UserService에서 발생하는 이벤트입니다.\nUserLeaveEvent 핸들러 실행이 완료된 뒤 유저 엔티티 삭제가 진행됩니다.\nUserLe
[task] | two_turn [pass] | ❌ 탈락 [title] | DataStorageService [question] | 데이터 저장소 종류별(Global/Creator/User/Sortable) 접근 함수와 페이지 조회 메서드(AndWait/Async)의 차이점을 설명해 주세요. [answer] | 메이플스토리 월드의 `DataStorageService`는 데이터 저장소의 종류에 따라 접근 함수와 페이지 조회 메서드가 나뉩니다. 각 저장소 유형별 접근 방법과 비동기/동기 조회 방식의 차이는 다음과 같습니다. ### 1. 데이터 저장소 종류별 접근 함수 모든 접근 함수는 **서버에서만 실행**(`[ServerOnly]`)될 수 있습니다. * **GlobalDataStorage (전역 데이터)** * **접근 함수:** `GetGlobalDataStorage(string name)` * 특정 이름의 [followup] | GetUserDataStoragePagesAndWait()의 Yield 속성이 스크립트 실행 중단에 미치는 영향과, 이를 대체하는 GetUserDataStoragePagesAsync()의 콜백 구현 예제를 요청합니다. [followup_answer] | `GetUserDataStoragePagesAndWait()`의 `[Yield]` 속성과 `GetUserDataStoragePagesAsync()`의 차이점 및 구현 예제는 다음과 같습니다. ### 1. Yield 속성과 스크립트 실행 중단 영향 `GetUserDataStoragePagesAndWait()` 함수는 **`[Yield]`** 속성을 가집니다. 이는 해당 함수가 호출되면 **작업이 완료될 때까지 현재 스크립트의 실행 흐름이 중단(블로킹)됨**을 의미합니다. * **동작 방식:** 서버가 유저 데이터 페이지 조회 [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서상 페이지 조회 메서드가 DataStorageService 레벨에 존재함에도, 응답이 인스턴스 메서드처럼 잘못 기술하고 'pages.Count' 같은 문서에 없는 속성을 지어내어 정확도가 낮음 [source_doc] | tAsync() 함수를 사용하세요. - **CreatorDataStorage GetCreatorDataStorage() [ServerOnly]** CreatorDataStorage를 얻어옵니다. - **CreatorDataStorage GetCreatorDataStorage(string name) [ServerOnly]** 특정 이름의 CreatorDataStorage를 얻어옵니다. - **int32, CreatorDataStoragePages GetCreatorDataStoragePagesAndWait() [ServerOn
[task] | single_turn [pass] | ✅ 통과 [title] | ItemService [question] | 아이템 개수가 0이 되었을 때 ItemService:RemoveItem을 호출해야 하는 이유는 무엇인가요? [answer] | 아이템 개수가 0이 되었을 때 `ItemService:RemoveItem`을 호출하는 이유는 인벤토리에서 개수가 0인 아이템 항목을 완전히 제거하기 위해서입니다. 참고 문서의 예제 코드를 보면, `Give Item` 오브젝트에 충돌하여 아이템 개수를 1 감소시킨 후 `items[1].ItemCount == 0` 조건을 확인합니다. 이 조건이 참일 경우에만 `_ItemService:RemoveItem(items[1])`을 호출하여 해당 아이템을 인벤토리에서 삭제합니다. 이를 통해 개수가 0인 아이템이 인벤토리에 남아있지 않도록 정리 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 코드 로직을 정확히 인용하여 개수가 0이 될 때 아이템을 제거하는 이유를 명확하게 설명했습니다. [source_doc] | 플레이어의 인벤토리에 아이템을 추가하고, 개수를 변경하고, 제거하는 예제입니다. 이름이 `Get Item`인 오브젝트에 충돌하면 아이템을 3개 획득합니다. 이름이 `Give Item`인 오브젝트에 충돌하면 아이템 개수가 1 감소합니다. 아이템 개수가 0이 되면 제거합니다. 이름이 `Trash Can`인 오브젝트에 충돌하면 아이템을 제거합니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters lo
[task] | single_turn [pass] | ❌ 탈락 [title] | DataStorageService [question] | DataStoragePagesAsync 함수에서 callbackFunction이 실행될 때 전달되는 매개변수의 구체적인 형태나 에러 코드 확인 방법이 궁금합니다. [answer] | `DataStoragePagesAsync` 함수의 `callbackFunction`은 두 개의 매개변수를 전달받습니다. 문서에 명시된 시그니처 `func<int32, UserDataStoragePages>`에 따라 첫 번째 매개변수는 **int32 타입의 에러 코드**이고, 두 번째 매개변수는 **UserDataStoragePages 타입의 객체**입니다. 에러 코드는 함수 호출 시 `int32` (32-bit 정수) 형태로 전달되므로, 콜백 함수 내에서 첫 번째 인자로 직접 받을 수 있습니다. 구체적인 에러 코드 값의 의미(예: [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 없는 GetUserDataStorage API를 지어내고 에러 코드 0이 성공이라는 미확인 사실을 예시 코드에 포함시켜 정확도가 떨어졌으나, 시그니처 해석과 문서 제한 사항 설명은 유용하고 일관성이 있음. [source_doc] | taStoragePagesAsync(func<int32, UserDataStoragePages> callbackFunction) [ServerOnly]** UserDataStorage를 페이지 단위로 조회합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **boolean SetAndWait(string storageName, string key, string value) [Deprecated] [ServerOnly] [Yield