[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | `WorldShopService`의 상품 지급 콜백 등록 코드만 출력하고, 모든 설명은 `--` 주석으로 작성하세요. [answer] | ```lua Method: [server only] void OnBeginPlay() { -- 월드가 생성될 때 상품 지급 콜백을 서버에 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPurchase) } [server only] boolean ProcessPurchase(any purchaseInfo) { -- 구매 정보에서 User ID를 기반으로 해당 사용자의 엔티티를 조회합니다. local userEntity = _UserSer [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 구매가 발생했을 때 상품 지급을 실행할 함수와 이 함수를 `WorldShopService`에 등록하는 예제입니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 Logic으로 작성하는 것을 권장합니다. 상품 지급은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPur
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | CaptureFullScreenAsPixelDataAndWait 호출 후 screenshotError 값이 ScreenshotError.Success와 다를 경우, 스크립트 흐름상 어떤 처리를 수행하도록 예제에서 권장하고 있습니까? [answer] | 예제에서는 `CaptureFullScreenAsPixelDataAndWait` 호출 후 반환된 `screenshotError` 값이 `ScreenshotError.Success`와 다른 경우, 스크립트 흐름을 즉시 중단하도록 권장합니다. 구체적인 처리 절차는 다음과 같습니다. 1. **오류 로그 기록**: `log_error` 함수를 사용하여 "Failed to capture screenshot. error: " 메시지 뒤에 `tostring(screenshotError)`를 연결한 문자열을 출력하여 오류 내용을 기록합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | LoadSpriteAndWait와 PreloadAsync를 사용할 때 스크립트 실행이 중단되는 차이점과 비동기 처리 방식의 구별은 무엇인가요? [answer] | `LoadSpriteAndWait`와 `PreloadAsync`의 가장 큰 차이점은 **스마트 실행 방식(동기/비동기)**과 **리소스 타입**에 있습니다. ### 1. 실행 중단 여부 (동기 vs 비동기) * **`LoadSpriteAndWait` (동기/Synchronous):** * 이 함수를 호출하면 **스마트 실행이 즉시 중단**됩니다. * 리소스가 완전히 로드될 때까지 해당 스마트의 나머지 코드는 진행되지 않습니다. * `[Yield]` 태그가 붙어 있어, 코드가 이 지점에서 멈췄다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | two_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | mLua에서 리소스를 메모리에서 완전히 해제하려면 어떤 순서로 API를 호출해야 하는가? [answer] | mLua에서 리소스를 메모리에서 완전히 해제하려면 다음 두 단계의 API를 순서대로 호출해야 합니다. 1. **캐시 제거**: `ClearCaches()` 또는 `RemoveCaches(ruidList)`를 호출하여 리소스를 캐시에서 제거합니다. * 모든 리소스를 해제하려면 `_ResourceService:ClearCaches()` * 특정 리소스만 해제하려면 `_ResourceService:RemoveCaches(ruidList)` 2. **메모리 해제**: `UnloadUnusedResources(pe [followup] | `ClearCaches()`와 `UnloadUnusedResources()`를 호출할 때 `pendingTimeSeconds` 값은 어떻게 설정해야 하며, 캐시에서 제거되지 않은 리소스가 해제 대상에 포함되는지 확인해 주세요. [followup_answer] | `UnloadUnusedResources(pendingTimeSeconds)`의 `pendingTimeSeconds` 값은 해제 대상이 되는 리소스가 **사용되지 않은 시간(초)**을 나타냅니다. * **즉시 해제**: `0`을 전달하면 캐시에서 제거된 리소스를 즉시 메모리에서 해제합니다. * **지연 해제**: `0` 이상의 값을 전달하면, 해당 시간만큼 사용되지 않은 리소스만 해제 대상이 됩니다. 예를 들어 `1.0`을 전달하면 1초 동안 사용되지 않은 리소스가 해제됩니다. 캐시에서 제거되지 않은 리소스는 `Unloa [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | `GiveCoin1000` 메서드가 `false`를 반환하는 조건을 1문장으로 서술하세요. [answer] | `userEntity`의 `WalletComponent`가 `nil`인 경우 `GiveCoin1000` 메서드는 `false`를 반환합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [server only] boolean GiveCoin1000 (EntityRef userEntity) { local walletComponent = userEntity.WalletComponent if walletComponent == nil then return false end -- 유저에게 1000 코인 지급 walletComponent:AddCoin(1000) -- 상품 지급 성공 return true } ```
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopService [question] | WorldShopService의 GetProductAndWait 메서드를 통해 특정 상품 ID의 정보를 조회하여 로그에 출력하는 클라이언트 스크립트를 작성해줘 [answer] | WorldShopService의 `GetProductAndWait` 메서드를 사용하여 특정 상품 ID의 정보를 조회하고, 조회된 상품 ID, 이름, 가격을 로그에 출력하는 클라이언트 스크립트입니다. 참고로 `GetProductAndWait`는 `[Yield]` 메서드이므로 실행이 중단될 수 있으며, 이 메서드는 상품 정보를 얻기 위해 서버와 통신하는 과정이 포함됩니다. ```lua Property: [None] string TargetProductId = "target_product_id_123" Method: [client [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | two_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | _ResourceService의 리소스 타입 확인과 캐시 관리에 대해 궁금합니다. [answer] | `_ResourceService`는 리소스의 타입을 확인하고, 메모리 및 캐시에 저장된 리소스를 관리하는 데 사용됩니다. 주요 기능은 리소스 타입 조회, 특정 리소스 캐시 제거, 전체 캐시 비우기, 그리고 리소스 사전 로드입니다. ### 1. 리소스 타입 확인: `GetTypeAndWait` `_ResourceService:GetTypeAndWait(ruid)` 메서드는 특정 리소스 ID(`ruid`)에 해당하는 리소스의 타입을 동기적으로 확인합니다. 이 메서드는 `OnBeginPlay()`와 같은 생명주기 메서드에서 사용할 수 [followup] | GetRuids 메서드에서 self.cachedRuidsById가 nil일 때 InitializeRuids를 호출하는 로직이 구체적으로 어떻게 동작하며, self.currentRuids와 self.currentId의 상태 변경 순서가 왜 중요한지 코드 예시를 보여주세요. [followup_answer] | 참고 문서에 `InitializeRuids` 메서드의 내부 구현이나 `self.cachedRuidsById` 테이블의 구조에 대한 구체적인 설명이 포함되어 있지 않습니다. 따라서 `InitializeRuids`가 정확히 어떤 방식으로 데이터를 초기화하는지는 알 수 없습니다. 다만, 문서의 `UpgradeSkill` 예제를 근거로 `self.currentRuids`와 `self.currentId`의 상태 변경 순서가 중요한 이유를 설명할 수 있습니다. ### 상태 변경 순서의 중요성 `UpgradeSkill` 메서드에서 상태 변 [scores] | [judge_reason] | [source_doc] | #### GetTypeAndWait 리소스 타입을 확인하는 예제입니다. ```lua Method: void OnBeginPlay() { -- sprite local type = _ResourceService:GetTypeAndWait('f55cd1b715c14593a97caff8b147d544') log(type) -- animationclip local type2 = _ResourceService:GetTypeAndWait('235ede11f6a24ecb85f6271833d06ba0') log(type2) }
[task] | instruction_following [pass] | ⏳ 미판정 [title] | FaceActionStateChangeEvent [question] | FaceActionStateChangeEvent를 초기화하는 생성자 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua -- FaceActionStateChangeEvent를 기본값으로 초기화합니다. local event = FaceActionStateChangeEvent() ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Face Action의 상태가 변경되었을 때 발생하는 이벤트입니다. # Properties - **MapleAvatarFaceActionState ActionState** 변경된 상태입니다. # Constructors - **FaceActionStateChangeEvent()** 기본값으로 FaceActionStateChangeEvent를 초기화합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | FaceActionStateChangeEvent [question] | FaceActionStateChangeEvent의 프로퍼티와 생성자를 2문장 이내로 요약하세요. [answer] | FaceActionStateChangeEvent는 변경된 상태를 나타내는 `MapleAvatarFaceActionState ActionState` 프로퍼티를 가집니다. 기본값으로 초기화하는 `FaceActionStateChangeEvent()` 생성자를 제공합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Face Action의 상태가 변경되었을 때 발생하는 이벤트입니다. # Properties - **MapleAvatarFaceActionState ActionState** 변경된 상태입니다. # Constructors - **FaceActionStateChangeEvent()** 기본값으로 FaceActionStateChangeEvent를 초기화합니다.
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | _ResourcesService:PreloadAsync 를 호출하여 특정 리소스 ID 목록을 로드하고, 로드 완료 콜백에서 로딩 UI 컴포넌트의 가시성을 숨기는 [client only] 메서드를 작성해줘 [answer] | `_ResourceService:PreloadAsync(ruids, callback)`를 사용해 리소스 ID 목록을 비동기 로드하고, 콜백에서 로딩 UI 컴포넌트의 가시성을 `false`로 설정하는 `[client only]` 메서드입니다. ```lua Method: [client only] void LoadResourcesAndHideLoadingUI() { -- 로드할 리소스 ID 목록 local ruids = { "6d1a308b27164b02921d812b05c78cba", "05 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | instruction_following [pass] | ⏳ 미판정 [title] | FaceActionStateChangeEvent [question] | FaceActionStateChangeEvent의 속성을 이름, 타입, 설명 3열로 표로 정리하세요. [answer] | FaceActionStateChangeEvent의 속성은 다음과 같습니다. | 이름 | 타입 | 설명 | | :--- | :--- | :--- | | ActionState | MapleAvatarFaceActionState | 변경된 상태입니다. | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Face Action의 상태가 변경되었을 때 발생하는 이벤트입니다. # Properties - **MapleAvatarFaceActionState ActionState** 변경된 상태입니다. # Constructors - **FaceActionStateChangeEvent()** 기본값으로 FaceActionStateChangeEvent를 초기화합니다.
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | ResourceService의 PreloadTileSetAsync를 사용하여 지정된 tileSetId의 타일셋을 비동기로 미리 로드하고, 완료 콜백에서 PreloadResultStatus를 확인하여 로드 성공 여부에 따라 로그를 기록하는 스크립트를 작성해줘 [answer] | `ResourceService`의 `PreloadTileSetAsync` 메서드를 사용하여 타일셋을 비동기로 미리 로드하고, 완료 콜백에서 `PreloadResultStatus`를 확인하여 로그를 기록하는 스크립트는 다음과 같습니다. ```lua Method: [client only] void PreloadTileSet(string tileSetId) { -- 지정된 tileSetId의 타일셋에 속한 모든 Sprite 리소스를 비동기로 미리 로드합니다. _ResourceService:PreloadTileSetAsync(tile [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | two_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | _ResourceService 를 이용해 스크린샷을 스프라이트 리소스로 업로드하는 기본 구조와 서버/클라이언트 역할 분담이 어떻게 되나요? [answer] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 업로드하는 과정은 서버와 클라이언트가 명확한 역할을 나눠 수행합니다. **1. 서버 역할: 업로드 허용 여부 검증** 서버는 어떤 유저가 스프라이트를 업로드할 수 있는지 판단하는 로직을 담당합니다. * 월드가 생성될 때(`OnBeginPlay`) `_ResourceService:SetSpriteUploadValidationCallback`을 통해 검증 함수를 등록해야 합니다. * 이 검증 함수는 서버에서 실행되며(`[server only]`), 업로드를 [followup] | SetSpriteUploadValidationCallback 을 Logic 함수로 작성해야 하는 이유와, ValidateSpriteUpload 가 서버에서 실행되는 이유를 설명해 주세요. [followup_answer] | `SetSpriteUploadValidationCallback`을 Logic 함수로 작성해야 하는 이유와 `ValidateSpriteUpload`가 서버에서 실행되는 이유는 다음과 같습니다. **1. Logic 함수로 작성해야 하는 이유** * **지속적 유지 필요:** 업로드 허용 결정 함수는 월드가 생성될 때 한 번만 등록되면 이후에도 계속해서 유지되어야 합니다. * **월드 생성 시점 등록:** 월드가 생성되는 시점에 콜백이 등록되어야 하므로, 월드 라이프사이클을 관리하는 Logic 스크립트의 `OnBeginPlay` [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | code [pass] | ⏳ 미판정 [title] | FaceActionStateChangeEvent [question] | FaceActionStateChangeEvent의 ActionState 프로퍼티를 확인하여 특정 얼굴 동작 상태가 변경되었을 때 로그를 출력하는 이벤트 핸들러를 작성해줘 [answer] | `FaceActionStateChangeEvent`의 `ActionState` 프로퍼티는 `MapleAvatarFaceActionState` 타입으로, Face Action의 상태가 변경된 후의 값을 포함합니다. 사용자가 특정 얼굴 동작 상태 변경 시 로그를 출력하도록 요청하였으므로, 해당 이벤트 핸들러를 작성합니다. 제공된 문서에는 `MapleAvatarFaceActionState`의 구체적인 열거형 값(Enum values)이 명시되어 있지 않으므로, 구체적인 상태 값(예: `Happy`, `Angry` 등)을 지어내지 않고, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Face Action의 상태가 변경되었을 때 발생하는 이벤트입니다. # Properties - **MapleAvatarFaceActionState ActionState** 변경된 상태입니다. # Constructors - **FaceActionStateChangeEvent()** 기본값으로 FaceActionStateChangeEvent를 초기화합니다.
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopService [question] | WorldShopService의 PromptPurchase 메서드를 호출하여 지정된 상품 ID에 대한 구매 창을 표시하는 클라이언트 스크립트를 작성해줘 [answer] | WorldShopService의 `PromptPurchase` 메서드는 클라이언트 공간에서만 실행할 수 있으며, 특정 상품 ID에 대한 구매 창을 출력합니다. 아래는 지정된 상품 ID에 대해 구매 창을 표시하는 mLua 스크립트 예시입니다. ```lua Property: [None] string TargetProductId = "YOUR_PRODUCT_ID" Method: [client only] void OnBeginPlay() { -- OnBeginPlay에서 즉시 구매 창을 띄우는 경우 -- _WorldSh [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | two_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | WorldShopService의 GiveCoin1000 메서드에서 반환 값이 false가 되는 조건은 무엇이며, 이 메서드를 호출할 때 반드시 확인해야 할 전제 조건은 무엇인가요? [answer] | `WorldShopService`의 `GiveCoin1000` 메서드에서 반환 값이 `false`가 되는 조건은 대상 엔티티(`userEntity`)의 `WalletComponent`가 존재하지 않는 경우, 즉 `nil`인 경우입니다. 이 메서드를 호출할 때 반드시 확인해야 할 전제 조건은 다음과 같습니다. 1. **서버에서만 실행 가능해야 함**: 해당 메서드는 `[server only]`로 지정되어 있으므로 클라이언트 측에서 직접 호출할 수 없습니다. 2. **WalletComponent 존재 확인**: 코인 지급을 수행하기 [followup] | userEntity.WalletComponent가 nil인 경우에만 false를 반환하는지, 아니면 코인 추가 과정에서 다른 오류 발생 시에도 false를 반환하는지 구체적인 예외 처리 로직과 함께 설명해 주세요. [followup_answer] | 제공된 `WorldShopService`의 `GiveCoin1000` 메서드 구현 코드를 보면, `false`를 반환하는 조건은 **`userEntity.WalletComponent`가 `nil`인 경우에만** 한정됩니다. 구체적인 예외 처리 로직은 다음과 같습니다: 1. **WalletComponent 존재 확인**: * `local walletComponent = userEntity.WalletComponent`를 통해 컴포넌트를 가져옵니다. * `if walletComponent == nil then [scores] | [judge_reason] | [source_doc] | [server only] boolean GiveCoin1000 (EntityRef userEntity) { local walletComponent = userEntity.WalletComponent if walletComponent == nil then return false end -- 유저에게 1000 코인 지급 walletComponent:AddCoin(1000) -- 상품 지급 성공 return true } ```
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | `GiveCoin1000` 함수를 호출하여 1000 코인을 지급하는 mLua 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void GiveUserCoin() { -- WorldShopService의 GiveCoin1000 함수를 호출하여 1000 코인을 지급합니다. -- self.EntityRefProperty는 지급 대상 유저를 나타내는 EntityRef입니다. local success = self.WorldShopService:GiveCoin1000(self.EntityRefProperty) if success then -- 지급 성공 시 로그 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [server only] boolean GiveCoin1000 (EntityRef userEntity) { local walletComponent = userEntity.WalletComponent if walletComponent == nil then return false end -- 유저에게 1000 코인 지급 walletComponent:AddCoin(1000) -- 상품 지급 성공 return true } ```
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | GetTypeAndWait로 리소스 타입을 확인한 후, 해당 ID가 Sprite인지 AnimationClip인지에 따라 다른 로직을 처리하고 싶을 때 반환값을 어떻게 비교해야 하나요? [answer] | 제공된 참고 문서에는 `_ResourceService:GetTypeAndWait` 메서드가 리소스 ID를 받아 타입 정보를 반환한다는 것만 예시로 나와 있을 뿐, 반환값의 구체적인 형태(예: 특정 문자열 상수, enum 값 등)나 비교 대상 값에 대한 설명이 포함되어 있지 않습니다. 따라서 해당 API의 정확한 반환값 형식과 비교 방법에 대해서는 답변드릴 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetTypeAndWait 리소스 타입을 확인하는 예제입니다. ```lua Method: void OnBeginPlay() { -- sprite local type = _ResourceService:GetTypeAndWait('f55cd1b715c14593a97caff8b147d544') log(type) -- animationclip local type2 = _ResourceService:GetTypeAndWait('235ede11f6a24ecb85f6271833d06ba0') log(type2) }
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | `GiveCoin1000` 메서드 내 `walletComponent`의 역할과 `nil` 체크의 목적을 표로 정리하세요. [answer] | `GiveCoin1000` 메서드 내에서 `walletComponent`와 `nil` 체크의 역할 및 목적은 다음과 같습니다. | 항목 | 역할 및 목적 | | :--- | :--- | | `walletComponent` | 대상 유저(`userEntity`)의 지갑 컴포넌트를 참조하여 코인 지급(`AddCoin`)을 실행하는 객체입니다. | | `nil` 체크 | 대상 유저가 지갑 컴포넌트를 가지고 있지 않거나(컴포넌트 미부착, 엔티티 비활성 등) 참조가 실패한 경우를 방지하기 위한 안전장치입니다. `nil`일 경우 코인 지급 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [server only] boolean GiveCoin1000 (EntityRef userEntity) { local walletComponent = userEntity.WalletComponent if walletComponent == nil then return false end -- 유저에게 1000 코인 지급 walletComponent:AddCoin(1000) -- 상품 지급 성공 return true } ```
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopService [question] | WorldShopService 의 GiveCoin1000 메서드를 호출하여 특정 엔티티에게 1000 코인을 지급하는 스크립트를 작성해줘. [answer] | 참고 문서에 `WorldShopService`의 `GiveCoin1000` 메서드 호출 예제가 제공되지 않았습니다. 문서에는 해당 메서드의 내부 구현(즉, `WalletComponent`를 직접 사용하여 코인을 지급하는 로직)만 포함되어 있습니다. 따라서 `WorldShopService`를 직접 호출하는 정확한 API 명세(서비스 변수명, 메서드 시그니처 등)를 확인할 수 없으므로, 문서에 근거하여 **`WalletComponent`를 직접 사용하여 1000 코인을 지급하는 스크립트**를 작성해 드립니다. 이는 문서에 명시된 `G [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [server only] boolean GiveCoin1000 (EntityRef userEntity) { local walletComponent = userEntity.WalletComponent if walletComponent == nil then return false end -- 유저에게 1000 코인 지급 walletComponent:AddCoin(1000) -- 상품 지급 성공 return true } ```
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopProduct [question] | WorldShopProduct의 Id와 EndSalesPeriod를 사용하여 판매 종료까지 남은 시간을 계산하여 HasSalesPeriod가 true일 때만 계산 결과를 반환하는 스크립트를 작성해줘 [answer] | `WorldShopProduct` 구조체에는 `Id`, `EndSalesPeriod`, `HasSalesPeriod` 프로퍼티가 존재하며, `DateTime` 타입은 `Elapsed` 프로퍼티를 통해 Unix epoch 기준 초 단위의 숫자 값을 반환합니다. 따라서 현재 시각과 `EndSalesPeriod`의 `Elapsed` 값을 비교하여 남은 시간을 계산할 수 있습니다. 참고 문서에 명시된 `WorldShopService`를 통해 상품을 가져오는 예제(`GetProductsAndWait`)와 `DateTime`의 `Elapse [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService를 통해 얻은 상품의 정보입니다. # Properties - **string Description** 상품의 설명입니다. - **DateTime EndSalesPeriod** 판매 종료 일시입니다. HasSalesPeriod가 true일 때만 유효한 값을 가집니다. - **boolean HasSalesPeriod** 판매 기간이 설정되어 있는지 확인합니다. - **string Id** 상품의 식별자입니다. - **string Name** 상품의 이름입니다. - **int32 Pric
[task] | single_turn [pass] | ⏳ 미판정 [title] | FaceActionStateChangeEvent [question] | FaceActionStateChangeEvent의 ActionState 속성은 어떤 타입의 값이 들어오나요? [answer] | `FaceActionStateChangeEvent`의 `ActionState` 속성은 `MapleAvatarFaceActionState` 타입의 값을 가집니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Face Action의 상태가 변경되었을 때 발생하는 이벤트입니다. # Properties - **MapleAvatarFaceActionState ActionState** 변경된 상태입니다. # Constructors - **FaceActionStateChangeEvent()** 기본값으로 FaceActionStateChangeEvent를 초기화합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | WorldShopService의 GetProductsAndWait 함수가 반환하는 객체 타입과 페이지 이동 메서드 이름을 3문장 이내로 설명하세요. [answer] | `GetProductsAndWait()` 함수는 `WorldShopProductPages` 타입의 객체를 반환합니다. 이 객체를 통해 다음 페이지로 이동하려면 `MoveToNextPageAndWait()` 메서드를 사용합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetProductsAndWait `GetProductsAndWait()` 함수를 이용해 조건에 해당하는 상품들을 검색할 수 있습니다. 이 함수가 리턴하는 `WorldShopProductPages` 타입의 객체는 검색된 결과가 많을 경우 결과를 페이지 단위로 나눠 구할 수 있게 해줍니다. ```lua Method: void SearchOnSaleItems () { -- 상품 종류가 아이템이고, 판매 상태가 판매 중인 상품을 검색합니다. local pages = _WorldShopService:GetProductsAn
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | _ResourcesService:PreloadAsync 를 통해 리소스 목록을 로드하되, 로딩 중에는 wait(0.1)을 호출하여 프레임 업데이트를 보장하고 완료 후 로딩 상태를 해제하는 [client only] 메서드를 작성해줘 [answer] | 제공된 참고 문서에는 `_ResourceService:PreloadAsync()`의 콜백 기반으로 비동기 로딩을 처리하는 예제만 포함되어 있습니다. 문서에는 `wait(0.1)`을 사용하여 프레임 업데이트를 보장하는 동기화 루프를 구현하는 예제나 `PreloadAsync`가 동기화 `wait`를 반환하는지에 대한 설명이 없습니다. 또한 `PreloadAsync`가 비동기적으로 완료되므로, 콜백 내에서만 완료 후 처리가 이루어집니다. 문서에 명시되지 않은 API나 동작 방식(예: `PreloadAsync`의 반환값을 `wait`와 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | two_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | 월드 숍에서 판매 중인 아이템 상품을 페이지 단위로 검색하는 방법은 무엇인가요? [answer] | 월드 숍에서 판매 중인 아이템 상품을 페이지 단위로 검색하려면 `_WorldShopService:GetProductsAndWait()` 함수를 사용합니다. 이 함수에는 상품 종류(`WorldShopProductType.Item`)와 판매 상태(`WorldShopProductStatus.Ing`)를 인수로 전달하며, 반환된 `WorldShopProductPages` 객체를 통해 결과를 페이지별로 처리할 수 있습니다. 검색된 각 페이지의 데이터를 가져오려면 `GetCurrentPageDatas()` 메서드를 호출하고, 현재 페이지가 [followup] | GetProductsAndWait 함수가 반환하는 WorldShopProductPages 객체에서 마지막 페이지(IsLastPage)를 판별하여 while 루프를 종료하는 정확한 코드 예시를 보여주세요. [followup_answer] | `WorldShopProductPages` 객체의 `IsLastPage` 프로퍼티를 확인하여 현재 페이지가 마지막인지 판별하고, 마지막 페이지라면 `break`로 `while` 루프를 종료하는 코드 예시는 다음과 같습니다. ```lua Method: void SearchOnSaleItems () { -- 상품 종류가 아이템이고, 판매 상태가 판매 중인 상품을 검색합니다. local pages = _WorldShopService:GetProductsAndWait(WorldShopProductType.Item, WorldShopP [scores] | [judge_reason] | [source_doc] | #### GetProductsAndWait `GetProductsAndWait()` 함수를 이용해 조건에 해당하는 상품들을 검색할 수 있습니다. 이 함수가 리턴하는 `WorldShopProductPages` 타입의 객체는 검색된 결과가 많을 경우 결과를 페이지 단위로 나눠 구할 수 있게 해줍니다. ```lua Method: void SearchOnSaleItems () { -- 상품 종류가 아이템이고, 판매 상태가 판매 중인 상품을 검색합니다. local pages = _WorldShopService:GetProductsAn
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | _ResourceService:PreloadAsync 를 사용하여 리소스 로드를 시작하기 전에 로딩 화면을 표시하고, 완료 시 로딩 화면을 숨기는 로직을 OnBeginPlay()에서 실행하는 [client only] 스크립트를 작성해줘 [answer] | `OnBeginPlay()`에서 `_ResourceService:PreloadAsync()`를 호출하여 리소스 로드를 시작하고, 로드 중에는 로딩 화면을 표시하며 완료 시 숨기는 로직을 수행하는 스크립트입니다. 참고로 `ShowLoadingScreen()`과 `HideLoadingScreen()` 함수는 실제 구현이 필요합니다. 아래 예제에서는 로딩 화면 표시/숨김을 담당하는 메서드 정의는 생략하고, `PreloadAsync`의 콜백 구조에만 집중하여 작성했습니다. ```lua Property: [None] number Load [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | GetTypeAndWait는 동기 처리처럼 보이지만 이름에 Wait가 붙어 있는데, OnBeginPlay에서 여러 리소스 타입을 연속으로 확인하면 다음 프레임까지 지연이 발생하거나 성능 저하가 있을까요? [answer] | 제공된 문서에는 `_ResourceService:GetTypeAndWait`의 내부 구현 방식, 실제 소요 시간, 프레임 지연 여부, 또는 성능에 미치는 영향에 대한 정보가 포함되어 있지 않습니다. 문서에는 단순히 리소스 ID를 인수로 전달하여 타입을 반환하는 사용법 예제만 제시되어 있을 뿐, "Wait"가 포함된 함수 호출 시 발생하는 구체적인 동기/비동기 처리 메커니즘이나 성능 지표에 대해서는 설명하고 있지 않습니다. 따라서 해당 함수가 다음 프레임 지연이나 성능 저하를 유발하는지 여부는 확인할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetTypeAndWait 리소스 타입을 확인하는 예제입니다. ```lua Method: void OnBeginPlay() { -- sprite local type = _ResourceService:GetTypeAndWait('f55cd1b715c14593a97caff8b147d544') log(type) -- animationclip local type2 = _ResourceService:GetTypeAndWait('235ede11f6a24ecb85f6271833d06ba0') log(type2) }
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopService [question] | WorldShopService의 UserHasPassAndWait 메서드를 사용하여 현재 유저가 특정 상품 ID의 이용권을 보유하고 있는지 확인하는 스크립트를 작성해줘 [answer] | `WorldShopService`의 `UserHasPassAndWait` 메서드를 사용하여 현재 유저가 특정 상품 ID의 이용권을 보유하고 있는지 확인하는 스크립트입니다. 참고 사항: 1. `UserHasPassAndWait`는 `string userId`와 `string productId` 두 개의 인자를 요구합니다. 2. 현재 유저의 ID를 얻기 위해 `UserService`의 `UserEnterEvent`를 통해 `UserId`를 저장하고, 그 값을 사용합니다. (문서에 명시된 다른 현재 유저 ID 조회 API가 없으므로, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | ResourceService의 PreloadAsync와 RemoveCaches, UnloadUnusedResources를 조합하여 게임 시작 시 필요한 리소스 목록을 비동기로 미리 로드하고, 레벨 종료 시 해당 RUID들의 캐시를 제거한 후 5초 동안 미사용된 리소스를 메모리에서 해제하는 스크립트를 작성해줘 [answer] | 요청하신 게임 시작 시 리소스 미리 로드, 레벨 종료 시 캐시 제거 및 메모리 해제 로직을 구현한 mLua 스크립트입니다. `OnBeginPlay`에서 `_ResourceService:PreloadAsync`를 사용하여 비동기 로드를 시작하고, `OnEndPlay`에서 `_ResourceService:RemoveCaches`로 캐시를 제거한 뒤 `_ResourceService:UnloadUnusedResources(5)`를 호출하여 5초간 미사용된 리소스를 메모리에서 해제하도록 구성했습니다. ```lua Property: [No [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 맵 이동 전 ClearCaches를 호출했는데, 이후 새로운 맵에서 리소스를 불러올 때 이전 맵의 캐시와 충돌하거나 메모리가 제대로 해제되지 않는다면 원인이 무엇일까요? [answer] | 제공된 문서에는 `ClearCaches` 호출 후 새로운 맵에서 리소스를 불러올 때 발생하는 충돌이나 메모리 해제 실패에 대한 구체적인 원인 분석이나 해결책이 포함되어 있지 않습니다. 문서에 명시된 내용으로는 다음과 같은 사실만 확인할 수 있습니다: 1. **`ClearCaches`의 기능**: 캐싱된 모든 리소스를 캐시에서 해제합니다. 2. **맵 이동 시 동작**: 로비 맵으로 이동할 때 `ClearCaches`를 호출하는 예제가 있으며, 이 경우 `UnloadUnusedResources(0)`는 내부적으로 자동 호출되므 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetTypeAndWait 리소스 타입을 확인하는 예제입니다. ```lua Method: void OnBeginPlay() { -- sprite local type = _ResourceService:GetTypeAndWait('f55cd1b715c14593a97caff8b147d544') log(type) -- animationclip local type2 = _ResourceService:GetTypeAndWait('235ede11f6a24ecb85f6271833d06ba0') log(type2) }