[task] | single_turn [pass] | ✅ 통과 [title] | DataStorageService [question] | GetGlobalDataStoragePagesAsync 콜백 안에서 pages:GetCurrentPageDatas() 로 가져온 데이터를 삭제할 때, 페이지 이동 전에 데이터를 수정하면 다음 페이지 조회에 영향이 있나요? [answer] | 제공된 문서의 예제 코드와 설명을 보면, `GetGlobalDataStoragePagesAsync` 콜백 내에서 `pages:GetCurrentPageDatas()`로 데이터를 가져와 삭제(`DeleteGlobalDataStorageAndWait`)한 후, `pages:MoveToNextPageAndWait()`를 호출하는 흐름이 표준적인 패턴으로 제시되어 있습니다. 문서에는 페이지 이동 전에 데이터를 수정(삭제 포함)했을 때 **다음 페이지 조회에 영향을 미치는지에 대한 기술적 설명이나 경고가 없습니다.** 다만, 문서의 예제 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 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] | ItemService [question] | CreateItem 메서드에서 itemDataTableName 인자로 UserItemDataSet 이름을 전달할 때, 반드시 포함되어야 하는 기본 열은 무엇인가요? [answer] | `CreateItem` 메서드에서 `itemDataTableName` 인자로 UserItemDataSet 이름을 전달할 때, 반드시 포함되어야 하는 기본 열은 다음과 같습니다. * **Name** * **IconRUID** * **Description** 이 세 가지 열을 기본으로 작성해야 하며, 필요에 따라 추가 열을 사용할 수도 있습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서에 명시된 UserItemDataSet의 기본 열(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] | DataStorageService [question] | ConnectEvent 메서드를 사용할 때 string 형태의 key와 Type 형태의 eventType 중 어떤 것을 선택해야 하며, 두 방식의 동작 차이점은 무엇인가요? [answer] | `ConnectEvent` 메서드는 이벤트의 식별 방식에 따라 두 가지 시그니처를 제공합니다. 선택 시 고려해야 할 사항과 두 방식의 차이는 다음과 같습니다. ### 1. 선택 기준 * **`string key` 사용 시**: 이벤트의 **이름(String)** 을 알고 있을 때 사용합니다. 문자열 값으로 이벤트 식별자를 직접 전달합니다. * **`Type eventType` 사용 시**: 이벤트의 **타입(Type)** 객체를 알고 있을 때 사용합니다. 컴파일 타임이나 런타임에서 타입 정보를 직접 전달하여 연결합니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 ConnectEvent/DisconnectEvent 시그니처와 설명을 정확히 인용하여 두 방식의 매칭 기준(이름 vs 타입) 차이를 명확히 설명했고, 지어낸 API 없이 문서 기반 답변을 제공했습니다. [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] | ItemService [question] | InventoryComponent가 소유한 아이템 목록을 가져올 때 GetMODItemsByOwner 메서드의 반환 타입은 무엇이며, 이 메서드는 서버 전용인가요? [answer] | `GetMODItemsByOwner` 메서드의 반환 타입은 `table<Item>`입니다. 이 메서드는 서버 전용(ServerOnly)이 아닙니다. API 목록에서 `GetMODItemsByOwner` 항목에는 `[ServerOnly]` 태그가 붙어 있지 않으며, 이는 다른 서버 전용 메서드들(예: `ChangeOwner`, `CreateItem`, `RemoveItem`)과 대비됩니다. 따라서 클라이언트와 서버 모두에서 호출할 수 있습니다. 참고로, `InventoryComponent`가 소유한 아이템 목록을 가져올 때 `Ge [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=3 complexity=2 verbosity=2 [judge_reason] | '서버 전용이 아님'이라는 판단은 문서와 일치하지만, 문서에 존재하지 않는 'InventoryComponent:GetItemList()' 메서드를 지어내어 정확도에서 감점됩니다. [source_doc] | 아이템 관련 기능을 제공합니다. # Methods - **void ChangeOwner(Item item, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **void ChangeOwner(string itemGUID, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **Item CreateItem(Type itemType,
[task] | two_turn [pass] | ❌ 탈락 [title] | ItemService [question] | _InventoryService 를 사용하여 특정 인벤토리에 아이템을 생성하고 소유권을 설정하는 방법을 알려주세요. [answer] | `_InventoryService` API는 제공된 문서에 포함되어 있지 않습니다. 제공된 문서에는 `_ItemService`와 `InventoryComponent`에 대한 정보만 있습니다. 따라서 `_ItemService`와 `InventoryComponent`를 사용하여 특정 인벤토리에 아이템을 생성하고 소유권을 설정하는 방법을 안내해 드립니다. ### 1. 아이템 생성 및 소유권 설정 `_ItemService:CreateItem()` 메서드를 사용하면 아이템을 생성하면서 동시에 소유권을 설정할 수 있습니다. * ** [followup] | CreateItem 메서드에서 itemDataTableName 을 생략할 경우와 UserItemDataSet 의 필수 열(Name, IconRUID, Description)이 부족할 때 발생하는 예외 및 에러 처리 코드를 작성해 주세요. [followup_answer] | 제공된 문서에 따르면, `_ItemService:CreateItem` 메서드의 `itemDataTableName` 파라미터는 필수 파라미터로 명시되어 있으며, 생략 시 발생하는 특정 예외나 에러 코드에 대한 설명은 문서에 포함되어 있지 않습니다. 또한, `UserItemDataSet`의 필수 열(`Name`, `IconRUID`, `Description`)이 부족할 때 발생하는 구체적인 예외 유형이나 에러 처리 절차에 대한 정보도 문서에 없습니다. 따라서 문서에 근거하여 해당 상황에서 발생하는 예외나 에러 처리 코드를 작성할 수 [scores] | helpfulness=3 correctness=1 coherence=4 complexity=3 verbosity=3 [judge_reason] | 존재하지 않는 _InventoryService가 없다고 단정하고, 문서에 없는 newItem.ItemCount 프로퍼티와 GetItemList() 메서드를 지어내어 정확도가 낮음 [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] | GetCreatorDataStoragePagesAndWait와 GetCreatorDataStoragePagesAsync의 가장 큰 차이점과 각각 언제 써야 하는지 설명해 주세요. [answer] | `GetCreatorDataStoragePagesAndWait`와 `GetCreatorDataStoragePagesAsync`의 가장 큰 차이점은 **스크립트 실행이 중단되는 방식**과 **결과 처리 방법**입니다. ### 1. 가장 큰 차이점 | 구분 | GetCreatorDataStoragePagesAndWait | GetCreatorDataStoragePagesAsync | | :--- | :--- | :--- | | **실행 방식** | **동기(Synchronous)** | **비동기(Asynchronous)** | | [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=3 coherence=4 complexity=4 verbosity=3 [judge_reason] | API의 차이점과 사용 시점을 정확히 설명했으나, mLua가 Lua 5.3 기반임에도 C# 스타일의 다중 반환값(local a, b = ...) 문법을 코드 예제에 사용하여 문법적 정확도가 떨어집니다. [source_doc] | tAsync() 함수를 사용하세요. - **CreatorDataStorage GetCreatorDataStorage() [ServerOnly]** CreatorDataStorage를 얻어옵니다. - **CreatorDataStorage GetCreatorDataStorage(string name) [ServerOnly]** 특정 이름의 CreatorDataStorage를 얻어옵니다. - **int32, CreatorDataStoragePages GetCreatorDataStoragePagesAndWait() [ServerOn
[task] | instruction_following [pass] | ✅ 통과 [title] | ItemService [question] | `_ItemService`를 사용하여 인벤토리에 아이템을 추가, 개수 변경, 제거하는 로직을 단계별 번호 목록으로 정리하세요. [answer] | `_ItemService`를 사용하여 인벤토리에서 아이템을 관리하는 로직은 다음과 같은 단계로 수행됩니다. 1. **인벤토리 컴포넌트 접근**: `self.Entity.InventoryComponent`를 통해 현재 엔티티의 인벤토리에 접근합니다. 2. **아이템 목록 조회**: `inventory:GetItemList()`을 호출하여 현재 인벤토리에 있는 아이템 목록을 가져옵니다. 3. **아이템 추가**: `_ItemService:CreateItem(아이템ID, "아이템이름", inventory)`를 호출하여 새 아이템을 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 예제 코드와 API 사용법을 정확히 단계별로 정리하고 원문 코드를 포함하여 질문에 완벽하게 부합합니다. [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] | GlobalDataStorage 를 개별적으로 가져오는 GetGlobalDataStorage 와 전체 목록을 페이지 단위로 가져오는 GetGlobalDataStoragePagesAsync 의 차이점이 무엇인가요? [answer] | `GetGlobalDataStorage`와 `GetGlobalDataStoragePagesAsync`는 목적과 반환 방식에서 명확한 차이가 있습니다. **1. GetGlobalDataStorage** * **목적:** 이름이 지정된 **특정** `GlobalDataStorage` 객체 하나를 가져오는 것입니다. * **방식:** 동기적으로 실행되어 즉시 대상 저장소를 반환합니다. * **사용 예시:** 이미 저장소의 이름(`"sampleStorage"`)을 알고 있을 때, 해당 저장소에 접근하여 데이터를 읽거나 수정하기 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 예제와 API 명세를 정확히 인용하여 두 메서드의 목적과 사용법을 명확하게 비교 설명했습니다. [source_doc] | # Examples #### GetGlobalDataStorage DataStorageService를 활용해서 GlobalDataStorage를 가져오는 예제입니다. ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") ``` #### GetGlobalDataStoragePagesAsync DataStorageService를 활용해서 모든 GlobalDataStorage를 제거하는 예제입니다. ```lua _DataSto
[task] | code [pass] | ✅ 통과 [title] | Service [question] | `_Service`의 `DisconnectEvent(string key, EventHandlerBase eventHandler)` 메서드를 사용하여 OnEndPlay 시점에 "PlayerMove" 이벤트 연결을 해제하는 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 `_Service`의 `ConnectEvent`와 `DisconnectEvent` 메서드 시그니처가 명시되어 있으나, **"PlayerMove"라는 이름의 이벤트가 실제 존재하는지, 해당 이벤트의 타입(Type)은 무엇인지, 그리고 `ConnectEvent` 시 반환되는 `EventHandlerBase` 객체를 저장하기 위한 구체적인 Property 선언 예시**가 포함되어 있지 않습니다. mLua에서는 `DisconnectEvent`를 호출하기 위해 이전에 `ConnectEvent`를 호출할 때 반환된 `E [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 질문한 'PlayerMove' 이벤트가 문서에 없어 실제 코드 작성 불가임을 정확히 지적하고, 문서에 존재하는 UserEnterEvent를 활용해 ConnectEvent/DisconnectEvent의 올바른 사용 패턴(EventHandlerBase 저장 및 해제)을 명확히 제시하여 도움을 주었음. [source_doc] | 모든 서비스의 부모 서비스입니다. 서비스의 기본 기능들을 제공합니다. # Methods - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤
[task] | single_turn [pass] | ✅ 통과 [title] | ItemService [question] | 인벤토리에 아이템이 여러 개 들어 있을 때 items[1]을 수정하면 특정 아이템만 개수가 줄어드는 이유가 있나요? [answer] | 네, `items[1]`은 인벤토리에 있는 아이템 목록에서 **첫 번째 인덱스(0번째가 아닌 1번째)에 위치한 아이템**만을 가리키기 때문입니다. Lua의 배열(테이블)은 1부터 인덱스가 시작하므로, `GetItemList()`로 가져온 목록에서 `items[1]`은 항상 목록의 첫 번째 아이템을 의미합니다. 따라서 인벤토리에 다른 종류의 아이템이 여러 개 있어도, `items[1].ItemCount`를 수정하거나 `items[1]`을 삭제하는 코드는 **항상 목록의 첫 번째 아이템에만** 영향을 미칩니다. 참고 문서의 예제에서 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | Lua 배열 인덱싱 원리와 문서 예제 코드의 동작 방식을 정확히 설명했으며, 문서에 없는 API를 지어내지 않고 한계를 명시했습니다. [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] | ItemService의 ChangeOwner 메서드는 서버에서만 실행되는데, 클라이언트 스크립트에서 호출하면 어떤 문제가 발생하나요? [answer] | `ItemService`의 `ChangeOwner` 메서드는 `[ServerOnly]` 속성을 가지고 있어 서버 환경에서만 실행되도록 설계되어 있습니다. 클라이언트 스크립트에서 이 메서드를 호출하면 아이템 소유권 변경 로직이 수행되지 않아 의도한대로 아이템의 소유주가 바뀌지 않는 문제가 발생합니다. 메이플스토리 월드의 스크립트 환경에서는 서버와 클라이언트가 각각 독립적으로 실행되며, `[ServerOnly]`로 지정된 서비스 메서드는 클라이언트 사이드에서 유효한 영향을 미치지 못합니다. 따라서 아이템 소유권과 같이 게임 상태(St [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=3 complexity=3 verbosity=2 [judge_reason] | 서버/클라이언트 실행 공간 개념 설명은 적절하나, 참고 문서에 없는 'self:IsClient()' API를 지어내고, 문서에 없는 예제 코드를 언급하며, 실제 mLua의 [server only] 속성 메커니즘(클라이언트에서 무시 또는 에러)보다 '로직이 수행되지 않아'라는 모호한 설명을 하여 정확성이 낮음. [source_doc] | 아이템 관련 기능을 제공합니다. # Methods - **void ChangeOwner(Item item, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **void ChangeOwner(string itemGUID, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **Item CreateItem(Type itemType,
[task] | code [pass] | ❌ 탈락 [title] | ItemService [question] | _ItemService의 CreateItem과 RemoveItem 메서드를 조합해, 터치 이벤트 발생 시 임시 아이템을 생성하고 3초 후 자동으로 삭제하는 스크립트를 작성해줘 [answer] | `ItemService`의 `CreateItem` 메서드로 아이템을 생성하고, `_TimerService`의 `SetTimerOnce`를 활용해 3초 후 `RemoveItem` 메서드로 삭제하는 스크립트입니다. ```lua Event Handler: [self] HandleTouchEvent(TouchEvent event) { if self:IsClient() then return end local inventory = self.Entity.InventoryComponent -- 임시 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=3 complexity=2 verbosity=2 [judge_reason] | 문서에 없는 TestItem 타입과 IsClient() 메서드를 지어냈으며, CreateItem의 두 번째 인자가 string 타입인 DataSets 이름임에도 불구하고 'Test Item'이라는 일반적인 문자열을 사용하여 제약과 어긋납니다. [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] | UserService [question] | 유저를 추방할 때 KickReason을 지정하면 상대방에게 어떤 정보가 전달되나요? [answer] | `KickUser` 메서드를 호출할 때 `kickReason` 매개변수에 `KickReason` 값을 지정하면, 추방되는 유저는 해당 `kickReason`에 해당하는 사유로 추방되었음을 안내받습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 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] | two_turn [pass] | ✅ 통과 [title] | ItemService [question] | `ItemService`를 사용하여 플레이어 인벤토리의 아이템을 추가, 개수 변경 및 제거하는 기본 동작 방식을 설명해 주세요 [answer] | `ItemService`는 플레이어의 인벤토리에 아이템을 관리하기 위해 사용됩니다. 주요 기능은 아이템 생성(추가), 개수 변경, 그리고 아이템 제거입니다. ### 1. 아이템 추가 `_ItemService:CreateItem` 메서드를 사용하여 인벤토리에 새로운 아이템을 추가합니다. * **인수**: 1. 아이템 ID (예: `TestItem`) 2. 아이템 이름 (예: `"Test Item"`) 3. 대상 인벤토리 컴포넌트 (`self.Entity.InventoryComponent`) * ** [followup] | `Get Item` 오브젝트 충돌 시 아이템 3개를 획득하는 코드 예시와, `Give Item` 충돌 시 개수가 0이 되면 아이템이 완전히 제거되는 로직을 자세히 보여주세요 [followup_answer] | `Get Item` 오브젝트 충돌 시 아이템 3개를 획득하고, `Give Item` 충돌 시 개수가 0이 되면 아이템을 완전히 제거하는 로직은 `HandleTriggerEnterEvent` 이벤트 핸들러 내에서 구현됩니다. 1. **아이템 획득 (`Get Item`)**: * `_ItemService:CreateItem(TestItem, "Test Item", inventory)`를 호출하여 인벤토리에 새 아이템을 생성합니다. * 반환된 `newItem` 객체의 `ItemCount` 프로퍼티를 `3`으로 설 [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 API와 코드 예제를 정확히 반영하여 질문에 대한 설명을 명확하고 일관되게 제공했습니다. [source_doc] | 플레이어의 인벤토리에 아이템을 추가하고, 개수를 변경하고, 제거하는 예제입니다. 이름이 `Get Item`인 오브젝트에 충돌하면 아이템을 3개 획득합니다. 이름이 `Give Item`인 오브젝트에 충돌하면 아이템 개수가 1 감소합니다. 아이템 개수가 0이 되면 제거합니다. 이름이 `Trash Can`인 오브젝트에 충돌하면 아이템을 제거합니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Parameters lo
[task] | instruction_following [pass] | ✅ 통과 [title] | UserService [question] | UserLeaveEvent 핸들러가 일정 시간 이상 지연될 때 발생하는 유저 엔티티 삭제 관련 문제를 3문장 이내로 설명하세요. [answer] | UserLeaveEvent 핸들러 실행이 일정 시간 이상 지연되면 유저 엔티티 삭제가 실행 완료 전에 진행됩니다. 이로 인해 핸들러가 끝나기 전에 엔티티가 삭제되는 문제가 발생할 수 있습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 UserLeaveEvent 핸들러 지연 시 엔티티 삭제 관련 문제를 3문장 이내로 정확하고 간결하게 설명했습니다. [source_doc] | - **UserDisconnectEvent** 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. - **UserEnterEvent** 유저가 입장할 때 UserService에서 발생하는 이벤트입니다. - **UserKickEvent** 유저가 추방되었을 때 발생하는 이벤트입니다. 서버에서만 발생합니다. - **UserLeaveEvent** 유저가 떠날 때 UserService에서 발생하는 이벤트입니다.\nUserLeaveEvent 핸들러 실행이 완료된 뒤 유저 엔티티 삭제가 진행됩니다.\nUserLe
[task] | instruction_following [pass] | ✅ 통과 [title] | EditorService [question] | EditorService의 SetSelectedModel 메서드와 SetSelectedTile 메서드의 파라미터 타입 차이점을 3문장 이내로 설명하세요. [answer] | `SetSelectedModel`은 `string` 타입의 `modelId`를, `SetSelectedTile`은 `string` 타입의 `tileRUID`를 파라미터로 받습니다. 두 메서드의 파라미터 데이터 타입은 모두 문자열(string)로 동일합니다. 다만, 각 메서드가 선택하는 대상이 모델인지 타일인지에 따라 전달해야 하는 식별자 값의 의미가 다릅니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 기재된 두 메서드의 파라미터 타입(string)과 이름을 정확히 인용하여, 데이터 타입은 동일하나 식별자 의미만 다르다는 점을 명확히 설명했습니다. [source_doc] | - **void SetSelectedModel(string modelId)** 해당하는 modelId의 모델을 선택합니다. - **void SetSelectedTile(string tileRUID)** 지정한 RUID의 타일을 선택합니다. 타일을 지정하지 않으면 현재 레이어의 타일이 선택됩니다. - **void SetSiblingIndex(Entity entity, int32 index)** 같은 부모를 가진 엔티티들의 계층 순서를 변경합니다. - **void SetStartingMap(string mapId)** 해
[task] | code [pass] | ❌ 탈락 [title] | ItemService [question] | _ItemService의 ChangeOwner 메서드를 사용해 서버에서 다른 플레이어의 InventoryComponent에 GUID로 지정한 아이템의 소유권을 이전하는 스크립트를 작성해줘 [answer] | `_ItemService:ChangeOwner`의 두 번째 오버로드(`void ChangeOwner(string itemGUID, InventoryComponent owner)`)를 사용하면, 서버에서 특정 GUID를 가진 아이템의 소유권을 다른 플레이어의 `InventoryComponent`로 이전할 수 있습니다. 아래 예제는 트리거 영역에 들어온 엔티티가 "Transfer Item"이라는 이름일 때, 지정된 GUID의 아이템을 해당 엔티티의 인벤토리로 소유권을 이전하는 스크립트입니다. ```lua Event Handler: [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=1 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서에 없는 HandleTriggerEnterEvent, TriggerBodyEntity, self:IsClient() API를 지어내어 정확도가 낮음 [source_doc] | 아이템 관련 기능을 제공합니다. # Methods - **void ChangeOwner(Item item, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **void ChangeOwner(string itemGUID, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **Item CreateItem(Type itemType,
[task] | instruction_following [pass] | ✅ 통과 [title] | EditorService [question] | SetSiblingIndex 메서드의 기능과 파라미터를 2단 표로 정리하세요. [answer] | `SetSiblingIndex` 메서드는 동일한 부모를 가진 엔티티들 사이의 계층 순서(시스터 인덱스)를 변경하는 기능입니다. | 항목 | 내용 | | :--- | :--- | | **기능** | 같은 부모를 가진 엔티티들의 계층 순서를 변경합니다. | | **파라미터** | `Entity entity`: 순서를 변경할 대상 엔티티<br>`int32 index`: 설정할 새로운 계층 순서(인덱스) | [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 SetSiblingIndex 정의와 일치하며 요청된 2단 표 형식으로 정확하고 간결하게 정리했습니다. [source_doc] | - **void SetSelectedModel(string modelId)** 해당하는 modelId의 모델을 선택합니다. - **void SetSelectedTile(string tileRUID)** 지정한 RUID의 타일을 선택합니다. 타일을 지정하지 않으면 현재 레이어의 타일이 선택됩니다. - **void SetSiblingIndex(Entity entity, int32 index)** 같은 부모를 가진 엔티티들의 계층 순서를 변경합니다. - **void SetStartingMap(string mapId)** 해
[task] | instruction_following [pass] | ✅ 통과 [title] | UserService [question] | UserService의 5가지 이벤트(UserDisconnectEvent, UserEnterEvent, UserKickEvent, UserLeaveEvent, UserReconnectEvent)와 각 이벤트의 발생 시점을 2열 표로 정리하세요. [answer] | | 이벤트 | 발생 시점 | | :--- | :--- | | `UserDisconnectEvent` | 유저의 네트워크 접속이 불안정하여 끊겼을 때 | | `UserEnterEvent` | 유저가 입장할 때 | | `UserKickEvent` | 유저가 추방되었을 때 (서버에서만 발생) | | `UserLeaveEvent` | 유저가 떠날 때 | | `UserReconnectEvent` | 유저가 재접속되었을 때 | [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서에 명시된 5가지 이벤트의 발생 시점을 정확하고 간결하게 표로 정리하여 질문에 완벽하게 부합합니다. [source_doc] | - **UserDisconnectEvent** 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. - **UserEnterEvent** 유저가 입장할 때 UserService에서 발생하는 이벤트입니다. - **UserKickEvent** 유저가 추방되었을 때 발생하는 이벤트입니다. 서버에서만 발생합니다. - **UserLeaveEvent** 유저가 떠날 때 UserService에서 발생하는 이벤트입니다.\nUserLeaveEvent 핸들러 실행이 완료된 뒤 유저 엔티티 삭제가 진행됩니다.\nUserLe
[task] | single_turn [pass] | ✅ 통과 [title] | UserService [question] | 개발 환경에서 IsUserBanned를 호출해도 반응이 없는데, 제재 확인 기능이 정상 동작하려면 어떤 조건이 필요할까요? [answer] | `IsUserBanned` 메서드는 출시 환경(Release)에서만 동작하도록 설계되어 있습니다. 따라서 개발 환경에서는 이 메서드를 호출하더라도 제재 여부 확인 기능이 정상적으로 동작하지 않으며, 반응이 없는 것은 정상적인 동작입니다. 제재 확인 기능이 정상적으로 동작하려면 다음 조건이 충족되어야 합니다. 1. **실행 환경**: 반드시 출시 환경(Release)에서 실행되어야 합니다. 2. **실행 공간**: 서버 측(ServerOnly)에서만 호출되어야 합니다. 3. **유효한 파라미터**: 존재하는 유저의 `profileC [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 [ServerOnly] [ReleaseOnly] 속성과 메서드 설명을 정확히 인용하여 개발 환경에서 동작하지 않는 이유와 정상 동작 조건을 명확히 설명했습니다. [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] | DataStorageService [question] | DataStorageService의 SetAsync를 사용하여 서버에서 지정된 storageName과 key에 value를 비동기적으로 저장하고, 저장 작업 완료 시 에러 코드와 결과를 전달받는 콜백 함수를 등록하는 스크립트를 작성해줘 [answer] | DataStorageService의 `SetAsync`는 더 이상 사용하지 않는(Deprecated) 함수입니다. 대신 `UserDataStorage` 객체를 통해 제공되는 `SetAsync` 메서드를 사용해야 합니다. 문서에 따르면 `UserDataStorage`의 `SetAsync`는 `storageName`, `key`, `value` 파라미터와 저장 완료 시 호출될 콜백 함수를 받습니다. 콜백 함수는 저장 작업 완료 후 에러 코드와 결과를 전달받습니다. 아래는 `_DataStorageService:GetUserDataSt [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | SetAsync가 Deprecated임을 지적한 점은 좋으나, 문서에 없는 GetUserDataStorage API와 UserDataStorage의 SetAsync 시그니처를 지어내어 정확성이 낮음. [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`의 `ConnectEvent(string key, IScriptFunction eventHandler)` 메서드를 사용하여 "PlayerMove"라는 키의 이벤트를 연결하고, 이벤트 발생 시 `log`로 "이동 이벤트 수신"을 출력하는 스크립트를 작성해줘. [answer] | `_Service`의 `ConnectEvent` 메서드를 사용하여 특정 키의 이벤트를 연결하려면, 해당 이벤트가 실제로 존재하는 특정 서비스(예: `_UserService`, `_EntityService` 등)를 통해 호출해야 합니다. 제공된 문서에는 `_Service`의 기본 메서드 정의만 있고, "PlayerMove"라는 이름의 이벤트가 실제로 존재하는지 또는 어떤 서비스에 속하는지에 대한 정보가 없습니다. 따라서 **"PlayerMove"라는 이벤트 키가 실제로 존재하는지 확인이 필요합니다.** 만약 특정 서비스(예: 가상의 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=3 verbosity=3 [judge_reason] | 'PlayerMove' 이벤트가 문서에 없는 점을 정확히 지적하고, 존재하는 이벤트 예시를 통해 ConnectEvent 사용법을 올바르게 안내했으나, 실제 mLua에서는 Event Handler 블록을 주로 사용하므로 ConnectEvent 기반 예시가 다소 부자연스럽고 설명이 길다. [source_doc] | 모든 서비스의 부모 서비스입니다. 서비스의 기본 기능들을 제공합니다. # Methods - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤
[task] | code [pass] | ❌ 탈락 [title] | InputService [question] | KeyHoldEvent 와 KeyReleaseEvent 를 처리하여 W 키를 누르고 있는 동안 RigidbodyComponent 의 속도를 증가시키고, 키를 놓으면 속도를 0 으로 초기화하는 스크립트를 작성해줘 [answer] | 제공된 문서에는 `KeyHoldEvent` 처리 예시가 포함되어 있으나, `KeyReleaseEvent`의 구체적인 파라미터나 처리 방식에 대한 설명이 없으며, `RigidbodyComponent`의 속도를 직접 제어하는 메서드(예: `SetVelocity`)도 문서에 명시되어 있지 않습니다. 문서에 있는 예제는 `SetForce`를 사용하고 있습니다. 또한, `KeyHoldEvent`는 키를 누르고 있는 동안 반복적으로 발생하는 이벤트로, 매 프레임마다 속도를 "증가"시키도록 구현할 경우 물리적으로 비현실적인 가속이 발생할 수 [followup] | [followup_answer] | [scores] | helpfulness=2 correctness=1 coherence=2 complexity=3 verbosity=4 [judge_reason] | RigidbodyComponent에 SetVelocity API가 존재함에도 문서에만 명시된 SetForce만 있다고 단정하며, 질문의 핵심인 '속도 초기화'를 '힘 제거'로 대체하여 잘못된 해결책을 제시했음. [source_doc] | * BasicParticleComponent * RigidbodyComponent * StateComponent * TransformComponent * KeyboardKey * KeyDownEvent * KeyHoldEvent * KeyReleaseEvent * KeyUpEvent * ScreenTouchEvent * ScreenTouchReleaseEvent * UILogic * UtilLogic * Vector3 * EntityService * [InputService를 활용한 입력과 액션](/docs?postId=209)
[task] | instruction_following [pass] | ✅ 통과 [title] | UserService [question] | 제공된 예제 코드를 그대로 출력하되, 로직 설명은 전부 Lua 주석(-- )으로 변환하여 코드만 출력하세요. [answer] | ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId -------------------------------------------------------- local userEntity = _UserService:GetUserEntityByUserId(UserId) local nametag = userEntity [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 질문에서 요청한 예제 코드를 그대로 출력하되, 로직 설명을 Lua 주석으로 변환하라는 조건을 정확히 준수하여 문서의 예제 코드를 오류 없이 제시했습니다. [source_doc] | - **UserDisconnectEvent** 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. - **UserEnterEvent** 유저가 입장할 때 UserService에서 발생하는 이벤트입니다. - **UserKickEvent** 유저가 추방되었을 때 발생하는 이벤트입니다. 서버에서만 발생합니다. - **UserLeaveEvent** 유저가 떠날 때 UserService에서 발생하는 이벤트입니다.\nUserLeaveEvent 핸들러 실행이 완료된 뒤 유저 엔티티 삭제가 진행됩니다.\nUserLe
[task] | single_turn [pass] | ✅ 통과 [title] | UserService [question] | 유저가 떠날 때 엔티티 삭제가 지연되거나 중간에 끊기는 현상이 발생하는 원인은 무엇인가요? [answer] | 유저가 떠날 때 발생하는 `UserLeaveEvent` 핸들러의 실행 시간이 길어지면 엔티티 삭제가 지연되거나 중간에 끊기는 현상이 발생할 수 있습니다. `UserLeaveEvent` 핸들러 실행이 완료된 뒤에는 해당 유저의 엔티티 삭제가 진행됩니다. 하지만 핸들러 내에서 처리해야 할 로직이 많아 실행에 일정 시간 이상이 소요되면, 정해진 시간 내에 삭제가 완료되지 못하고 엔티티 삭제가 제대로 처리되지 않는 문제가 생길 수 있습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 UserLeaveEvent 핸들러 지연 시 엔티티 삭제 실패 원인을 정확하고 간결하게 설명했습니다. [source_doc] | - **UserDisconnectEvent** 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. - **UserEnterEvent** 유저가 입장할 때 UserService에서 발생하는 이벤트입니다. - **UserKickEvent** 유저가 추방되었을 때 발생하는 이벤트입니다. 서버에서만 발생합니다. - **UserLeaveEvent** 유저가 떠날 때 UserService에서 발생하는 이벤트입니다.\nUserLeaveEvent 핸들러 실행이 완료된 뒤 유저 엔티티 삭제가 진행됩니다.\nUserLe
[task] | single_turn [pass] | ✅ 통과 [title] | UserService [question] | UserEnterEvent 핸들러에서 유저 엔티티를 가져오는 정확한 메서드 이름이 무엇인가요? [answer] | `UserEnterEvent` 핸들러에서 유저 엔티티를 가져오는 정확한 메서드 이름은 `_UserService:GetUserEntityByUserId(UserId)` 입니다. 이 메서드는 `UserService` 서비스 객체인 `_UserService` 를 통해 호출하며, 파라미터로 `UserEnterEvent` 에서 제공하는 `event.UserId` 를 전달하여 해당 유저의 엔티티(`Entity`)를 반환합니다. ```lua Event Handler: [server only] [service: UserService] Hand [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서 예제와 일치하는 정확한 메서드 이름을 명확히 제시하여 질문에 완벽히 부응했습니다. [source_doc] | - **UserDisconnectEvent** 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. - **UserEnterEvent** 유저가 입장할 때 UserService에서 발생하는 이벤트입니다. - **UserKickEvent** 유저가 추방되었을 때 발생하는 이벤트입니다. 서버에서만 발생합니다. - **UserLeaveEvent** 유저가 떠날 때 UserService에서 발생하는 이벤트입니다.\nUserLeaveEvent 핸들러 실행이 완료된 뒤 유저 엔티티 삭제가 진행됩니다.\nUserLe
[task] | code [pass] | ❌ 탈락 [title] | ItemService [question] | _InventoryComponent와 _ItemService를 사용해 스크립트 시작 시 UserItemDataSet에서 'Sword' 데이터를 불러와 현재 엔티티에 아이템을 생성하고, 5초 후 해당 아이템을 삭제하는 스크립트를 작성해줘 [answer] | 요청하신 기능을 구현하는 mLua 스크립트입니다. 1. `OnBeginPlay()` 생명주기 메서드에서 초기 아이템 생성을 수행합니다. 2. `_ItemService:CreateItem` 호출 시 `itemDataTableName` 인자로 `"Sword"`를 전달하여 `UserItemDataSet`에서 해당 데이터를 불러옵니다. (이때 `itemType` 인자로는 데이터셋에 정의된 타입 또는 기본 타입을 지정해야 하며, 문서 예제에서는 `TestItem` 같은 타입 식별자를 사용하므로 여기서는 `SwordType`이라고 가정하여 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | CreateItem의 첫 번째 인자 itemType은 Type 타입이지만, 존재하지 않는 'SwordType' 식별자를 코드에 직접 하드코딩하여 사용하도록 지시했으므로 문서 및 규칙에 없는 API/타입을 지어낸 오류가 있습니다. [source_doc] | 아이템 관련 기능을 제공합니다. # Methods - **void ChangeOwner(Item item, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **void ChangeOwner(string itemGUID, InventoryComponent owner) [ServerOnly]** 아이템의 소유권을 해당 InventoryComponent로 이전합니다. - **Item CreateItem(Type itemType,
[task] | code [pass] | ✅ 통과 [title] | UserService [question] | UserService.GetUserEntityByUserId(userId)로 유저 엔티티를 찾고, 해당 엔티티의 TransformComponent 를 수정하여 위치를 이동시키는 스크립트를 작성해줘 [answer] | ```lua Property: [None] Vector3 TargetPosition = Vector3(0, 0, 0) string TargetUserId = "000000" Method: [server only] void MoveUserToTarget() { local userEntity = _UserService:GetUserEntityByUserId(TargetUserId) if userEntity then userEntity.TransformComponent.Position = Targe [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서와 규칙에 기반하여 요청한 기능을 정확하고 간결하게 구현했습니다. [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] | DataStorageService [question] | DataStorageService의 ConnectEvent를 사용하여 특정 이름의 이벤트가 발생하면 핸들러 함수가 호출되도록 연결하고, DisconnectEvent를 통해 해당 연결을 해제하는 로직을 포함하는 스크립트를 작성해줘 [answer] | 제공된 문서에 따르면, `DataStorageService`는 `Service`에서 상속된 `ConnectEvent`와 `DisconnectEvent` 메서드를 사용할 수 있습니다. `ConnectEvent`는 두 가지 오버로드를 제공합니다: 1. `ConnectEvent(string key, IScriptFunction eventHandler)`: 이벤트 이름(키)으로 연결합니다. 2. `ConnectEvent(Type eventType, IScriptFunction eventHandler)`: 이벤트 타입으로 연결합니다. ` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=4 verbosity=2 [judge_reason] | 문서의 API 서명(ConnectEvent/DisconnectEvent)과 반환 타입(EventHandlerBase)을 정확히 파악하여, mLua 스크립트 규칙에 부합하는 Property/Method 구조와 서버 전용 태그를 올바르게 적용한 예시를 제공했습니다. [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] | DataStorageService [question] | `_DataStorageService:GetGlobalDataStorage("sampleStorage")` 를 호출하여 GlobalDataStorage 객체를 가져오고, 특정 키에 저장된 값을 확인하는 스크립트를 작성해줘. [answer] | ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") -- 특정 키에 저장된 값을 확인합니다. local key = "sampleKey" local value = sampleStorage:GetValue(key) log("Key: " .. key .. " Value: " .. tostring(value)) ``` [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=1 coherence=4 complexity=None verbosity=2 [judge_reason] | 문서와 규칙에 없는 `GetValue` API를 지어내어 정확도가 낮지만, 질문 의도는 이해하고 구조적으로 작성함 [source_doc] | # Examples #### GetGlobalDataStorage DataStorageService를 활용해서 GlobalDataStorage를 가져오는 예제입니다. ```lua local sampleStorage = _DataStorageService:GetGlobalDataStorage("sampleStorage") ``` #### GetGlobalDataStoragePagesAsync DataStorageService를 활용해서 모든 GlobalDataStorage를 제거하는 예제입니다. ```lua _DataSto