[task] | single_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | 대미지 스킨을 미리 불러오는 PreloadAsync 함수를 서버 스크립트에서 호출하면 어떤 문제가 발생하는지 설명해 주세요. [answer] | `PreloadAsync` 함수는 문서에 명시된 바와 같이 `[ClientOnly]` 태그가 붙어 있는 클라이언트 전용 메서드입니다. 따라서 서버 스크립트에서 이 함수를 호출하면 클라이언트에서만 실행되도록 설계된 API를 서버 환경에서 호출하려는 문제가 발생합니다. mLua의 서비스 메서드 실행 공간 규칙에 따라, `[ClientOnly]`로 지정된 메서드는 서버 측에서 접근하거나 실행할 수 없습니다. 서버 스크립트에서 `_DamageSkinService:PreloadAsync`를 호출하게 되면, 해당 메서드가 서버 컨텍스트에서 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 [ClientOnly] 태그를 정확히 인용하여 서버 호출 시 오류 가능성을 논리적으로 설명했고, 지어낸 API나 불필요한 서술이 없어 우수함. [source_doc] | 대미지 스킨 관련 기능을 제공합니다. # Methods - **void Play(Entity targetEntity, string skinId, float delayPerAttack, table<any> damages, DamageSkinTweenType tweenType, boolean bCritical, Vector2 offset = Vector2(0, 0), Vector2 scale = Vector2(0, 0), float playRate = 1, float alpha = 1, LitMode litMode = LitMode
[task] | instruction_following [pass] | ✅ 통과 [title] | InstanceMapService [question] | InstanceMapService의 각 비권장 프로퍼티 이름과 이를 대체하는 RoomService의 프로퍼티 이름을 2열 표로 정리하세요. [answer] | InstanceMapService의 비권장 프로퍼티와 이를 대체하는 RoomService 프로퍼티는 다음과 같습니다. | InstanceMapService 프로퍼티 (비권장) | RoomService 대체 프로퍼티 | | :--- | :--- | | InstanceKey | InstanceRooms | | InstanceMaps | InstanceRooms | | InstanceRooms | RoomKey | [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 비권장 프로퍼티와 대체 프로퍼티의 대응 관계를 정확하고 명확하게 표로 정리했습니다. [source_doc] | 더는 사용하지 않는 Service입니다. RoomService를 사용하세요. # Properties - **string InstanceKey [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. RoomService의 InstanceRooms를 사용하세요. - **ReadOnlyDictionary<string, InstanceRoom> InstanceMaps [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. RoomService의 InstanceRooms를 사용
[task] | instruction_following [pass] | ✅ 통과 [title] | LogService [question] | 서버와 클라이언트 로그 출력 함수(LogServer, LogClient)가 호출하는 표준 로그 함수 3종과 그 매개 변수 값을 표로 정리하세요. [answer] | 참고 문서의 예제 코드를 기준으로, `LogServer`와 `LogClient` 함수에서 호출되는 표준 로그 함수 3종과 각각의 매개 변수 값을 아래 표와 같이 정리할 수 있습니다. | 함수 이름 | 매개 변수 (문자열) | | :--- | :--- | | `log` | `"log server"` 또는 `"log client"` | | `log_warning` | `"log_warning server"` 또는 `"log_warning client"` | | `log_error` | `"log_error server"` 또는 `"l [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 예제 코드에 명시된 로그 함수 3종과 매개 변수 값을 정확하고 명확한 표로 정리하여 질문의 요구사항을 완벽히 충족함. [source_doc] | 로그 관련 기능을 제공합니다. # Methods - **void SetShouldShowServerLog(boolean shouldShowServerLog) [ServerOnly]** 서버에서 발생된 로그 출력 여부를 설정합니다. ##### inherited from Service: - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다
[task] | code [pass] | ✅ 통과 [title] | BadgeService [question] | 유저 입장 시 _UserService의 UserEnterEvent를 처리하여 _BadgeService:UserHasBadgeAsync를 비동기로 호출하고, 콜백에서 배지 보유 여부가 false인 경우 _BadgeService:AwardBadgeAndWait를 통해 배지를 지급하는 스크립트를 작성해줘 [answer] | ```lua Property: [None] string BadgeId = "test_badge_001" Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { local UserId = event.UserId _BadgeService:UserHasBadgeAsync(UserId, self.BadgeId, function(uid, bid, hasBadge) if not hasBadge then [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 API 시그니처와 규칙의 표준 구문을 정확히 준수하여 질문한 로직을 오류 없이 구현했습니다. [source_doc] | 유저가 배지를 획득할 수 있게 하거나 배지 정보를 조회하는 기능을 제공합니다. # Methods - **boolean AwardBadgeAndWait(string userId, string badgeId) [ServerOnly] [Yield]** 유저에게 배지를 지급하고 지급 성공 여부를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 메이커 환경에서는 지급 받을 수 없는 상태의 배지도 테스트를 위해 지급 받을 수 있습니다. - **BadgeInfo GetBadgeInfoAndWait(string badgeId) [Y
[task] | two_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | `_DamageSkinService:Play` 메서드의 각 매개변수(엔티티, 색상, 시간, 타겟 ID 등)는 어떤 역할을 하는지 설명해 주세요. [answer] | 제공된 참고 문서에는 `_DamageSkinService:Play` 메서드 호출 예제만 포함되어 있으며, 각 매개변수의 구체적 정의(파라미터 이름, 상세 역할 설명)는 문서에 명시되어 있지 않습니다. 따라서 문서에 있는 정보만 바탕으로 할 때, `_DamageSkinService:Play`는 아래 예제와 같이 6개의 인자를 받아 호출됩니다. ```lua _DamageSkinService:Play(TriggerBodyEntity, "000000", 0.05, {1, 2, 3}, DamageSkinTweenType.Default, [followup] | 첫 번째 매개변수로 받은 `TriggerBodyEntity`가 트라이거를 통과한 모든 엔티티가 아니라 특정 조건(예: 적 대역)에 맞는 경우만 피격 효과를 적용하려면 코드에서 어떻게 필터링해야 하나요? [followup_answer] | 제공된 참고 문서에는 `_DamageSkinService:Play` 호출 예제와 `HandleTriggerEnterEvent` 이벤트 핸들러 구조만 포함되어 있으며, 엔티티의 대역(적대/우호 등)을 확인하거나 필터링하는 데 사용되는 구체적인 API, 프로퍼티, 또는 메서드는 문서에 명시되어 있지 않습니다. 따라서 문서에 있는 정보만 바탕으로 할 때, `TriggerBodyEntity`에 대한 조건 분기(예: 이름 확인)는 가능하지만, "적 대역"이라는 상태값을 직접 검사하는 코드를 작성할 수 있는 API가 문서에 제공되지 않았습니 [scores] | helpfulness=3 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 없는 매개변수 정의를 지어내지 않고, 예제 코드에서 확인 가능한 형태만 나열하며 한계를 명확히 지적하여 정확하고 일관된 답변을 제공함. [source_doc] | # Examples ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: TriggerComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local TriggerBod
[task] | code [pass] | ✅ 통과 [title] | InstanceMapService [question] | _InstancMapService는 더는 사용하지 않는 비추천(Deprecated) 서비스이며, 제공된 문서에는 RoomService로의 대체 사용법 외에는 구체적인 메서드(Method)나 이벤트(Event) 정보가 전혀 없으므로, 해당 API로 해결할 수 있는 구체적인 mLua 코딩 과제를 생성할 수 없습니다. [answer] | 정확합니다. `_InstanceMapService`는 더는 사용하지 않는 비추천(Deprecated) 서비스입니다. 제공된 문서에 따르면, 이 서비스의 모든 프로퍼티(`InstanceKey`, `InstanceMaps`, `InstanceRooms`)는 비추천 처리되어 있으며, 각각 **`RoomService`의 `InstanceRooms`** 또는 **`RoomService`의 `RoomKey`**를 사용하도록 안내되어 있습니다. 또한, 해당 서비스 자체에 대한 구체적인 메서드(Method)나 이벤트 핸들러(Event Handl [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 없는 API를 지어내지 않고, InstanceMapService의 비추천 상태와 RoomService로의 대체 안내를 정확히 전달했으며, 코드 생성 불가의 근거를 명확히 설명하여 질문자의 의도를 잘 충족했습니다. [source_doc] | 더는 사용하지 않는 Service입니다. RoomService를 사용하세요. # Properties - **string InstanceKey [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. RoomService의 InstanceRooms를 사용하세요. - **ReadOnlyDictionary<string, InstanceRoom> InstanceMaps [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. RoomService의 InstanceRooms를 사용
[task] | single_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | _DamageSkinService:Play 함수에서 마지막 파라미터가 false일 때와 true일 때 동작 차이가 무엇인가요? [answer] | 제공된 참고 문서에는 `_DamageSkinService:Play` 함수의 시그니처(파라미터 목록)와 호출 예제만 포함되어 있으며, 각 파라미터가 의미하는 구체적인 동작이나 `false`/`true` 값에 따른 동작 차이에 대한 설명은 없습니다. 따라서 주어진 정보만으로 마지막 파라미터가 `false`일 때와 `true`일 때의 동작 차이를 설명할 수 없습니다. [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 문서에 없는 파라미터 의미를 지어내지 않고, 주어진 정보 한계 내에서 정직하게 답변하여 정확도와 일관성이 높으며, 질문자 입장에서 직접적인 해결책은 아니지만 오해 방지 측면에서 유용함. [source_doc] | # Examples ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: TriggerComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local TriggerBod
[task] | code [pass] | ❌ 탈락 [title] | BadgeService [question] | 스크립트가 시작될 때 _BadgeService:GetBadgeInfosAndWait를 호출하여 모든 등급(BadgeGrade)과 상태(BadgeStatus)의 배지 정보 페이지를 조회하고, 반환된 GetBadgeInfos 객체에서 첫 번째 페이지의 배지 ID 목록을 로그로 출력하는 스크립트를 작성해줘 [answer] | 스크립트가 시작될 때(`OnBeginPlay`) `_BadgeService:GetBadgeInfosAndWait`를 호출하여 모든 등급과 상태의 배지 정보를 조회하고, 첫 번째 페이지에 있는 배지들의 ID를 로그로 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay () { -- 모든 등급(nil)과 모든 상태(nil)의 배지 정보를 조회합니다. local pages = _BadgeService:GetBadgeInfosAndWait(nil, nil) -- [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=1 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 없는 `GetCurrentPageDatas` 및 `badge.Id` 접근자를 지어내어 정확도가 낮습니다. [source_doc] | 유저가 배지를 획득할 수 있게 하거나 배지 정보를 조회하는 기능을 제공합니다. # Methods - **boolean AwardBadgeAndWait(string userId, string badgeId) [ServerOnly] [Yield]** 유저에게 배지를 지급하고 지급 성공 여부를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 메이커 환경에서는 지급 받을 수 없는 상태의 배지도 테스트를 위해 지급 받을 수 있습니다. - **BadgeInfo GetBadgeInfoAndWait(string badgeId) [Y
[task] | single_turn [pass] | ✅ 통과 [title] | BadgeService [question] | GetBadgeInfoAndWait와 GetBadgeInfoAsync의 차이를 설명해 주시고, 비동기 버전인 GetBadgeInfoAsync의 callback 함수에서 매개변수로 받는 두 값의 순서와 의미는 무엇입니까? [answer] | `GetBadgeInfoAndWait`와 `GetBadgeInfoAsync`는 모두 특정 `badgeId`에 해당하는 배지 정보를 조회하는 메서드입니다. 두 메서드의 가장 큰 차이는 **스크립트 실행 흐름의 제어 방식**입니다. 1. **`GetBadgeInfoAndWait` (동기식)** - 호출하면 배지 정보 조회가 완료될 때까지 **현재 스크립트의 실행이 중단(보류)됩니다.** - 조회가 끝나면 반환된 `BadgeInfo` 객체를 바로 다음 코드에서 사용할 수 있습니다. - 순차적인 로직 처리가 명확하지만, [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 API 정의와 제약 사항을 정확히 반영하여 동기/비동기 차이와 콜백 매개변수 순서를 명확하게 설명했고, 코드 예시도 mLua 문법에 부합합니다. [source_doc] | 유저가 배지를 획득할 수 있게 하거나 배지 정보를 조회하는 기능을 제공합니다. # Methods - **boolean AwardBadgeAndWait(string userId, string badgeId) [ServerOnly] [Yield]** 유저에게 배지를 지급하고 지급 성공 여부를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 메이커 환경에서는 지급 받을 수 없는 상태의 배지도 테스트를 위해 지급 받을 수 있습니다. - **BadgeInfo GetBadgeInfoAndWait(string badgeId) [Y
[task] | single_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | DamageSkinTweenType.Default 외에 다른 트윈 타입이 존재하는지, 그리고 그 값들을 어떻게 확인해야 하나요? [answer] | 제공된 참고 문서에는 `DamageSkinService:Play` 메서드의 예제 코드에서 `DamageSkinTweenType.Default` 값이 사용된 사례만 포함되어 있습니다. 따라서, `DamageSkinTweenType.Default` 외에 다른 트윈 타입(예: `Fade`, `Scale` 등)이 존재하는지, 그리고 전체적으로 어떤 값들이 정의되어 있는지에 대한 정보는 주어진 문서에 명시되어 있지 않습니다. 해당 API의 다른 상수 값들을 확인하시려면, 메이플스토리 월드 에디터의 **API 문서** 또는 **Intell [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 없는 값을 지어내지 않고, 문서 제한을 정확히 인지하며 에디터 내 문서 확인이라는 실질적인 해결책을 제시하여 매우 정확하고 유용합니다. [source_doc] | # Examples ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: TriggerComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local TriggerBod
[task] | two_turn [pass] | ✅ 통과 [title] | LogService [question] | _LogService:SetShouldShowServerLog를 사용하여 서버 로그 출력을 제어하는 방식이 궁금합니다. [answer] | `_LogService:SetShouldShowServerLog`는 서버에서 발생된 로그가 클라이언트(또는 개발자 콘솔)에 출력될지 여부를 제어하는 메서드입니다. 이 메서드는 **서버 공간([server only])** 에서만 실행될 수 있으며, 인자로 `boolean` 값을 전달하여 로그 출력 여부를 설정합니다. - `true` 전달: 서버에서 발생한 `log`, `log_warning`, `log_error` 등의 로그가 출력됩니다. - `false` 전달: 서버에서 발생한 로그는 출력되지 않으며, 클라이언트 로그만 출력됩니다 [followup] | [client only] 환경에서 SetShouldShowServerLog를 호출해도 서버 로그 출력이 실제로 변경되는지, 그리고 예제 코드에서처럼 self:SetShouldShowServerLog를 직접 호출하는 것이 _LogService:SetShouldShowServerLog를 호출하는 것과 차이가 있는지 확인하고 싶습니다. [followup_answer] | `[client only]` 환경에서 `SetShouldShowServerLog`를 호출하더라도 서버 로그 출력이 **직접적으로 변경되지 않습니다.** 이는 `SetShouldShowServerLog` 메서드가 `[ServerOnly]` 속성을 가지기 때문입니다. 즉, 이 메서드는 서버 공간에서만 실행되며, 클라이언트 공간에서는 서버 상태를 변경할 수 없습니다. 예제 코드에서 `[client only]` 영역의 `OnBeginPlay`에서 `self:SetShouldShowServerLog(true)`를 호출하는 것처럼 보이는 [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 API 정의와 예제 코드를 정확히 인용하여 서버 로그 제어 방식을 명확하고 일관되게 설명했습니다. [source_doc] | 로그 관련 기능을 제공합니다. # Methods - **void SetShouldShowServerLog(boolean shouldShowServerLog) [ServerOnly]** 서버에서 발생된 로그 출력 여부를 설정합니다. ##### inherited from Service: - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다
[task] | single_turn [pass] | ❌ 탈락 [title] | BadgeService [question] | UserHasBadgeAndWait를 사용하여 유저의 배지 보유 여부를 확인했는데, 메이커 환경에서 테스트할 때 배지를 하나도 없는 상태로 시작한다고 하는데 이는 어떤 의미를 가지며 실제 배포 후와 차이가 있을까요? [answer] | 메이커 환경(제작 중인 월드)에서 `UserHasBadgeAndWait`를 호출할 때 "배지를 하나도 가지지 않은 채로 시작한다"는 것은, 테스트 유저가 월드에 최초 접속하거나 리셋된 상태에서 이미 어떤 배지도 획득하지 못한 순수한 초기 상태라는 의미입니다. 이는 개발자가 특정 조건에서 배지를 지급하거나 확인하는 로직을 처음부터 검증할 수 있게 해주는 것입니다. 실제 배포(출시된 월드) 후와 차이점은 다음과 같습니다. 1. **초기 상태 차이**: - **메이커 환경**: 유저는 항상 배지 0개 상태로 시작합니다. 따라서 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=3 complexity=2 verbosity=2 [judge_reason] | 메이커 환경과 출시 월드의 배지 상태 차이 설명은 적절하나, 코드 예시에서 문서와 시스템 규칙에 없는 _EnvironmentService API를 지어내어 정확도가 낮음. [source_doc] | 유저가 배지를 획득할 수 있게 하거나 배지 정보를 조회하는 기능을 제공합니다. # Methods - **boolean AwardBadgeAndWait(string userId, string badgeId) [ServerOnly] [Yield]** 유저에게 배지를 지급하고 지급 성공 여부를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 메이커 환경에서는 지급 받을 수 없는 상태의 배지도 테스트를 위해 지급 받을 수 있습니다. - **BadgeInfo GetBadgeInfoAndWait(string badgeId) [Y
[task] | instruction_following [pass] | ✅ 통과 [title] | InstanceMapService [question] | MoveUserToStaticRoom 함수의 대체 수단을 1문장 이내로 설명하세요. [answer] | RoomService의 MoveUserToStaticRoom(string, string) 함수를 사용하세요. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=1 [judge_reason] | 참고 문서에 명시된 대체 수단을 정확하고 간결하게 1문장 이내로 설명하였습니다. [source_doc] | g, string, string) 함수를 사용하세요. - **boolean MoveUserToParentMap(string userId, string mapName = nil) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. RoomService의 MoveUserToStaticRoom(string, string) 함수를 사용하세요. - **boolean MoveUserToStaticRoom(string userId, string mapName = nil) [Deprecated] [
[task] | instruction_following [pass] | ❌ 탈락 [title] | InstanceMapService [question] | 문서에서 언급된 RoomService의 대체 함수 중 시그니처에 기본 인자(default argument)가 포함된 함수만 코드 블록으로 출력하고, 설명은 주석으로만 작성하세요. [answer] | ```lua Property: [None] string RoomKey = "test_room" table<string> MapNames = {"GameMap01", "GameMap02"} Method: [server only] void TestRoomServiceFunctions() { -- GetOrCreateInstanceRoom: key와 firstUserWaitSeconds(기본값 10) 인자를 받습니다. local room = _RoomService:GetOrCreateInstanceRoom(self.Roo [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=3 complexity=2 verbosity=2 [judge_reason] | 질문에서 요구한 '기본 인자가 포함된 함수'는 문서의 InstanceMapService 메서드들이며, 응답은 이를 RoomService의 함수로 오해하거나 RoomService의 정확한 시그니처를 문서에 근거 없이 지어내어 정확성에 결함이 있습니다. [source_doc] | - **InstanceRoom CreateInstanceMap(string key, table<string> mapNames) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. RoomService의 CreateInstanceRoom(string, table, float)을 사용하세요. - **InstanceRoom CreateInstanceRoom(string key, table<string> mapNames, float firstUserWaitSeconds = 10) [Depre
[task] | instruction_following [pass] | ✅ 통과 [title] | InstanceMapService [question] | InstanceMapService를 RoomService로 마이그레이션할 때 프로퍼티 매핑을 확인하는 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Property: [None] -- InstanceMapService의 프로퍼티는 모두 비추천(Deprecated) 상태이며, RoomService로 대체됩니다. -- 아래 주석은 마이그레이션 시 프로퍼티 매핑 관계를 나타냅니다. -- 1. InstanceKey (string, Deprecated, ReadOnly) -- -> RoomService의 InstanceRooms를 사용하세요. -- (구체적인 대체 프로퍼티 이름은 문서에 명시되지 않았으므로 RoomService API 확인 필요) -- 2. I [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=3 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 명시된 매핑 정보를 주석으로 정확히 제시했으나, 코드 블록 내부에 주석만 존재하는 비효율적인 구조이며 RoomService의 구체적 메서드명이 없음을 명시하여 안전성을 확보함 [source_doc] | 더는 사용하지 않는 Service입니다. RoomService를 사용하세요. # Properties - **string InstanceKey [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. RoomService의 InstanceRooms를 사용하세요. - **ReadOnlyDictionary<string, InstanceRoom> InstanceMaps [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. RoomService의 InstanceRooms를 사용
[task] | single_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | DisconnectEvent 호출 후에도 특정 이벤트가 계속 수신되는 것 같은데, 연결을 제대로 끊지 못한 원인이 무엇일까요? [answer] | `DisconnectEvent` 호출 후에도 이벤트가 계속 수신되는 원인은 **연결된 이벤트 핸들러 인스턴스(`EventHandlerBase`)를 정확히 전달하지 못했기 때문**일 가능성이 높습니다. `DisconnectEvent`는 단순히 이벤트 이름이나 타입만 넘겨서 연결을 끊는 것이 아니라, **이전 `ConnectEvent` 호출 시 반환받은 `EventHandlerBase` 객체를 반드시 두 번째 매개변수로 전달**해야 합니다. 만약 `nil`이나 다른 핸들러 객체를 전달하면 해당 연결은 해제되지 않으며, 기존 연결은 그 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 API 시그니처(ConnectEvent 반환값, DisconnectEvent 매개변수 및 반환형)를 정확히 해석하여 문제를 진단하고, mLua 구문 규칙에 부합하는 명확한 코드 예시를 제공했습니다. [source_doc] | - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지
[task] | instruction_following [pass] | ✅ 통과 [title] | InstanceMapService [question] | Service에서 상속받은 이벤트 연결 메서드(ConnectEvent)의 매개 변수 타입을 2개 항목의 번호 목록으로 나열하세요. [answer] | Service에서 상속받은 `ConnectEvent` 메서드의 매개 변수 타입은 다음과 같습니다. 1. `string key, IScriptFunction eventHandler` 2. `Type eventType, IScriptFunction eventHandler` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 ConnectEvent의 두 오버로드 매개 변수를 정확하고 간결하게 나열했습니다. [source_doc] | g, string, string) 함수를 사용하세요. - **boolean MoveUserToParentMap(string userId, string mapName = nil) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. RoomService의 MoveUserToStaticRoom(string, string) 함수를 사용하세요. - **boolean MoveUserToStaticRoom(string userId, string mapName = nil) [Deprecated] [
[task] | single_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | 000000 색상 코드는 RGB 값을 16진수로 나타낸 것인데, 다른 색상을 적용하려면 어떤 형식의 문자열을 넣어야 하나요? [answer] | 제공된 참고 문서에는 `_DamageSkinService:Play` 메서드의 색상 매개변수로 `"000000"`라는 6자리 16진수 문자열이 사용된다는 예제만 포함되어 있습니다. 문서에는 다른 색상 형식(예: 3자리, RGBA, 이름 기반 등)에 대한 설명이나 예제가 명시되어 있지 않으므로, **문서에서 확인할 수 있는 범위는 6자리 16진수 색상 코드 형식**뿐입니다. 따라서 다른 색상을 적용할 때는 **6자리 16진수 문자열** 형식을 따르는 것이 문서 근거에 부합합니다. * 예: 빨강은 `"FF0000"`, 초록은 ` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서에 명시된 예제 코드 기반의 합리적 추론을 통해 질문자의 의도를 정확히 파악하고, 문서에 없는 정보임을 명시하면서 안전한 답변을 제공했습니다. [source_doc] | # Examples ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: TriggerComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local TriggerBod
[task] | single_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | playRate 파라미터를 0 또는 음수로 설정했을 때 실제로 적용되는 재생 속도와, 이를 방지하기 위한 권장 코딩 관행은 무엇인가요? [answer] | `Play`, `PlayTextDamage` 메서드에서 `playRate` 파라미터가 0 이하(0 또는 음수)의 값으로 설정될 경우, 시스템은 해당 값을 무시하고 자동으로 **1**로 대체하여 적용합니다. 따라서 실제로 적용되는 재생 속도는 항상 1(기본 속도)이 됩니다. 이를 방지하기 위한 권장 코딩 관행은 다음과 같습니다. 1. **값 검증(Validation) 후 호출**: `playRate`를 0 이하의 값으로 설정하지 않도록 호출 전에 조건문을 사용하여 체크하는 것이 가장 안전합니다. 2. **적절한 양수 값 사용* [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서와 규칙에 기반하여 playRate의 안전장치 동작을 정확히 설명하고, 올바른 mLua 문법과 API 시그니처를 사용하여 예시를 제시했습니다. [source_doc] | 대미지 스킨 관련 기능을 제공합니다. # Methods - **void Play(Entity targetEntity, string skinId, float delayPerAttack, table<any> damages, DamageSkinTweenType tweenType, boolean bCritical, Vector2 offset = Vector2(0, 0), Vector2 scale = Vector2(0, 0), float playRate = 1, float alpha = 1, LitMode litMode = LitMode
[task] | single_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | DamageSkinService에서 이벤트를 받을 때 string key와 Type eventType 중 어떤 방식으로 ConnectEvent를 호출해야 하는지 차이가 있나요? [answer] | `DamageSkinService`에서 `ConnectEvent`를 호출할 때 `string key`와 `Type eventType` 중 어떤 방식을 선택하느냐에 따라 이벤트 매칭 방식이 달라집니다. 1. **`string key` 방식**: - 이벤트의 **이름**이 해당 문자열과 일치하는 이벤트가 발생했을 때 핸들러가 호출됩니다. - 특정 이벤트 이름을 문자열로 직접 지정하여 연결하는 방식입니다. 2. **`Type eventType` 방식**: - 이벤트의 **타입**이 해당 `Type`과 일치하는 이벤트가 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 ConnectEvent 두 가지 시그니처와 동작 방식을 정확히 비교하고, DisconnectEvent의 제약사항까지 적절히 안내하여 질문의 의도에 부합하는 유용하고 정확한 답변을 제공함. [source_doc] | - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지
[task] | two_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | 여러 공격에 대해 각각 다른 크리티컬 여부를 지정하여 대미지 스킨을 재생하려면 어떤 `Play` 메서드를 사용해야 하나요? [answer] | 여러 공격에 대해 각각 다른 크리티컬 여부를 지정하려면 `table<boolean>` 타입의 `criticals` 파라미터를 받는 `Play` 메서드를 사용해야 합니다. 해당 메서드는 `damages` 테이블과 `criticals` 테이블의 길이가 반드시 같아야 하며, `damages`에는 정수(`integer`) 또는 `DamageSkinTextType`을, `criticals`에는 각 대미지에 해당하는 크리티컬 여부(`true`/`false`)를 순서대로 넣습니다. ```lua _DamageSkinService:Play( [followup] | `damages` 테이블과 `criticals` 테이블의 길이가 다를 경우 발생하는 오류를 방지하기 위한 코드 작성 예시를 보여주세요. [followup_answer] | `damages` 테이블과 `criticals` 테이블의 길이가 다르면 `Play` 메서드가 정상적으로 동작하지 않을 수 있으므로, 호출 전에 두 테이블의 길이가 일치하는지 확인하는 로직을 추가하는 것이 좋습니다. 아래 예시에서는 `damages`와 `criticals`를 생성한 후, 길이가 다른 경우 `log`로 경고를 출력하고 대미지 스킨 재생을 생략하는 방식으로 작성했습니다. ```lua Method: [server only] void OnUpdate(number delta) { -- 예시: 여러 공격의 대미지와 크 [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 명시된 table<boolean> criticals 파라미터를 사용하는 Play 메서드를 정확히 식별하고, 제약 조건(테이블 길이 일치, damages 타입)과 함께 올바른 코드 예시를 제공하여 질문을 완벽히 해결했습니다. [source_doc] | 대미지 스킨 관련 기능을 제공합니다. # Methods - **void Play(Entity targetEntity, string skinId, float delayPerAttack, table<any> damages, DamageSkinTweenType tweenType, boolean bCritical, Vector2 offset = Vector2(0, 0), Vector2 scale = Vector2(0, 0), float playRate = 1, float alpha = 1, LitMode litMode = LitMode
[task] | instruction_following [pass] | ✅ 통과 [title] | InstanceMapService [question] | 이 문서에 명시된 Deprecated 상태인 함수들의 원본 이름과 대체 함수 이름을 2열 표로 정리하세요. [answer] | InstanceMapService에서 Deprecated(사용 중단)된 함수와 이를 대체할 함수는 다음과 같습니다. | Deprecated 함수 | 대체 함수 | | :--- | :--- | | `MoveUserToParentMap(string userId, string mapName = nil)` | `RoomService`의 `MoveUserToStaticRoom(string, string)` | | `MoveUserToStaticRoom(string userId, string mapName = nil)` | `RoomServ [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서에 명시된 Deprecated 함수 두 가지와 그 대체 함수를 정확히 2열 표로 정리하여 질문에 완벽하게 부합합니다. [source_doc] | g, string, string) 함수를 사용하세요. - **boolean MoveUserToParentMap(string userId, string mapName = nil) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. RoomService의 MoveUserToStaticRoom(string, string) 함수를 사용하세요. - **boolean MoveUserToStaticRoom(string userId, string mapName = nil) [Deprecated] [
[task] | single_turn [pass] | ❌ 탈락 [title] | InstanceMapService [question] | InstanceMapService의 InstanceKey 프로퍼티가 Deprecated 처리된 이유와 RoomService의 어떤 프로퍼티로 대체해야 하는지 궁금합니다. [answer] | `InstanceMapService`의 `InstanceKey` 프로퍼티는 해당 서비스 전체가 더 이상 사용되지 않는(Deprecated) 것으로 지정되었기 때문에 함께 비추천 처리되었습니다. 이 프로퍼티는 `RoomService`의 **`InstanceRooms`** 프로퍼티로 대체해야 합니다. 참고로 `InstanceMapService`는 현재 `RoomService` 사용을 권장하는 상태이며, `InstanceKey` 외에도 `InstanceMaps`, `InstanceRooms` 프로퍼티 모두 `RoomService`의 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=2 verbosity=2 [judge_reason] | 실제 문서에서 InstanceKey의 대체 프로퍼티가 RoomService의 InstanceRooms라고 명시하고 있음에도, 응답은 InstanceKey의 대체를 RoomService의 InstanceRooms라고 잘못 서술하여 정확도가 낮음. [source_doc] | 더는 사용하지 않는 Service입니다. RoomService를 사용하세요. # Properties - **string InstanceKey [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. RoomService의 InstanceRooms를 사용하세요. - **ReadOnlyDictionary<string, InstanceRoom> InstanceMaps [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. RoomService의 InstanceRooms를 사용
[task] | single_turn [pass] | ✅ 통과 [title] | DamageSkinService [question] | 트라이거에 캐릭터가 들어왔을 때 스킨이 0.05초 동안 특정 색상으로 변하도록 하려면 어떤 파라미터 순서로 호출해야 하나요? [answer] | `_DamageSkinService:Play` 메서드를 사용하여 트라이거에 캐릭터가 들어왔을 때 스킨 색상을 변경할 수 있습니다. 파라미터 순서는 다음과 같습니다. 1. **대상 엔티티**: 스킨 효과가 적용될 대상 (트라이거에 들어온 캐릭터 엔티티) 2. **색상**: 적용할 색상 코드 (예: "000000") 3. **시간**: 효과가 지속되는 시간 (초 단위, 예: 0.05) 4. **타겟 목록**: 적용 대상 ID 또는 인덱스 목록 (예: {1, 2, 3}) 5. **트윈 타입**: 애니메이션 방식 (예: `Dam [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 예제 코드와 API 시그니처를 정확히 반영하여 파라미터 순서와 사용법을 명확하게 설명했으므로 모든 항목에서 높은 점수를 받습니다. [source_doc] | # Examples ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: TriggerComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local TriggerBod
[task] | code [pass] | ✅ 통과 [title] | BadgeService [question] | 서버에서 주기적으로 _TimerService:SetTimerOnce를 사용하여 5초마다 실행되는 함수 안에서 _BadgeService:GetBadgeInfoAndWait를 호출해 특정 배지 정보의 BadgeInfo를 조회하고, 해당 정보의 이름을 로그로 출력하는 스크립트를 작성해줘 [answer] | 요청하신 동작은 `SetTimerOnce`가 '한 번만' 실행되는 타이머라는 점에서 주기적으로 반복하려면 함수 내부에서 다음 타이머를 다시 설정하는 재귀 구조를 사용해야 합니다. 또한 `GetBadgeInfoAndWait`는 Yield 함수이므로 실행이 일시정지되는 동안에도 스크립트가 정상 동작하도록 주의해야 합니다. 아래는 5초마다 특정 배지(`"badge_id_example"`)의 정보를 조회하고 이름을 로그에 출력하는 서버 전용 스크립트입니다. ```lua Method: [server only] void OnBeginPla [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | SetTimerOnce의 재귀적 호출을 통한 주기 실행 구현과 GetBadgeInfoAndWait 사용법이 mLua 규칙 및 문서와 일치하며, BadgeInfo.Name 필드 접근은 표준 객체 프로퍼티 접근 방식으로 합리적이다. [source_doc] | 유저가 배지를 획득할 수 있게 하거나 배지 정보를 조회하는 기능을 제공합니다. # Methods - **boolean AwardBadgeAndWait(string userId, string badgeId) [ServerOnly] [Yield]** 유저에게 배지를 지급하고 지급 성공 여부를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 메이커 환경에서는 지급 받을 수 없는 상태의 배지도 테스트를 위해 지급 받을 수 있습니다. - **BadgeInfo GetBadgeInfoAndWait(string badgeId) [Y
[task] | instruction_following [pass] | ✅ 통과 [title] | EffectService [question] | PlayEffect 메서드의 사용 가능한 옵션 목록을 쉼표로 구분하여 나열하세요. [answer] | FlipX, FlipY, SortingLayer, OrderInLayer, Alpha, StartFrameIndex, EndFrameIndex, PlayRate, SyncFlip, Color, MaterialID, IgnoreMapLayerCheck, LitMode [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서에 명시된 PlayEffect 메서드의 옵션 목록을 정확하고 간결하게 나열했습니다. [source_doc] | 이펙트 제어 기능을 제공합니다. # Methods - **integer PlayEffect(string animationClipRUID, Entity instigator, Vector3 position, float zRotation, Vector3 scale, boolean isLoop = false, Dictionary<string, any> options = nil)** 현재 맵의 고정된 위치에 이펙트를 재생하고 이펙트를 제거하기 위한 일련 번호를 반환합니다. 이펙트 생성에 실패할 경우 0을 반환합니다. 사용 가능한 옵션
[task] | two_turn [pass] | ✅ 통과 [title] | InstanceMapService [question] | InstanceMapService의 메서드들이 대체로 Deprecated 상태인데, 어떤 메서드가 어떤 RoomService 메서드로 대체되는지 알려줘 [answer] | `InstanceMapService`의 모든 메서드는 비추천(Deprecated) 상태이며, 각각 `RoomService`의 특정 메서드로 대체됩니다. 구체적인 대체 관계는 다음과 같습니다. 1. **인스턴스 룸 생성** * `CreateInstanceMap(string key, table<string> mapNames)` → `RoomService:CreateInstanceRoom(string, table, float)` * `CreateInstanceRoom(string key, table [followup] | CreateInstanceMap과 MoveUsersToInstanceMap을 호출하던 기존 스크립트가 있으면, 이를 RoomService의 CreateInstanceRoom과 MoveUserToInstanceRoom으로 교체하는 mLua 코드 예제를 작성해줘 [followup_answer] | `InstanceMapService`의 비추천 메서드(`CreateInstanceMap`, `MoveUsersToInstanceMap`)를 `RoomService`의 권장 메서드(`CreateInstanceRoom`, `MoveUserToInstanceRoom`)로 교체한 mLua 코드 예제는 다음과 같습니다. 참고: `MoveUsersToInstanceMap`은 복수의 유저를 이동시키며 `int32`(이동된 유저 수)를 반환합니다. `RoomService`의 `MoveUserToInstanceRoom`도 동일한 시그니처(`str [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 모든 Deprecated 메서드와 그 대체 RoomService 메서드를 빠짐없이 정확히 분류하여 제시했습니다. [source_doc] | - **InstanceRoom CreateInstanceMap(string key, table<string> mapNames) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. RoomService의 CreateInstanceRoom(string, table, float)을 사용하세요. - **InstanceRoom CreateInstanceRoom(string key, table<string> mapNames, float firstUserWaitSeconds = 10) [Depre
[task] | single_turn [pass] | ❌ 탈락 [title] | DamageSkinService [question] | event.TriggerBodyEntity 를 직접 전달하는 대신 다른 엔티티의 참조를 전달하면 스킨 효과가 정상적으로 적용되지 않을 수 있는 이유는 무엇인가요? [answer] | `DamageSkinService:Play` 메서드는 특정 엔티티에 스킨(피해) 효과를 적용하기 위해 해당 엔티티의 렌더러 또는 스킨 관련 컴포넌트 정보를 내부적으로 조회하고 조작합니다. 문서 예제에서 `event.TriggerBodyEntity`를 직접 전달하는 이유는, 트리거 이벤트가 발생했을 때 **트리거 영역에 진입한 실제 대상 엔티티**를 정확히 식별하여 그 대상에게만 효과를 적용해야 하기 때문입니다. 다른 엔티티의 참조를 전달할 경우 다음과 같은 문제가 발생할 수 있습니다. 1. **효과 적용 대상 오류**: `Da [followup] | [followup_answer] | [scores] | helpfulness=2 correctness=1 coherence=3 complexity=3 verbosity=2 [judge_reason] | 문서에는 `DamageSkinService:Play`가 렌더러를 조회하거나 특정 엔티티가 아닌 경우 실패하는 이유에 대한 기술적 설명이 없으며, '렌더러 조회', '스킨 데이터 컴포넌트 부재' 등은 문서에 없는 사실과 API 동작을 지어낸 것으로 정확도가 낮습니다. [source_doc] | # Examples ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: TriggerComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local TriggerBod
[task] | instruction_following [pass] | ✅ 통과 [title] | EffectService [question] | PlayEffectAttached 메서드의 매개변수 이름을 순서대로 표로 정리하세요. [answer] | `PlayEffectAttached` 메서드의 매개변수는 다음과 같습니다. | 순서 | 매개변수 이름 | |:---:|:---| | 1 | `animationClipRUID` | | 2 | `parentEntity` | | 3 | `localPosition` | | 4 | `localZRotation` | | 5 | `localScale` | | 6 | `isLoop` | | 7 | `options` | [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서의 PlayEffectAttached 메서드 서명과 매개변수 순서가 정확히 일치하며, 요구된 표 형식으로 간결하게 답변했습니다. [source_doc] | 이펙트 제어 기능을 제공합니다. # Methods - **integer PlayEffect(string animationClipRUID, Entity instigator, Vector3 position, float zRotation, Vector3 scale, boolean isLoop = false, Dictionary<string, any> options = nil)** 현재 맵의 고정된 위치에 이펙트를 재생하고 이펙트를 제거하기 위한 일련 번호를 반환합니다. 이펙트 생성에 실패할 경우 0을 반환합니다. 사용 가능한 옵션
[task] | instruction_following [pass] | ✅ 통과 [title] | EffectService [question] | EffectService에서 이펙트를 제거하는 메서드의 코드 시그니처만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void RemoveEffect(integer serial) { -- EffectService에서 이펙트를 제거하는 메서드입니다. -- 매개변수 serial은 PlayEffect 또는 PlayEffectAttached 호출 시 반환된 일련 번호입니다. -- 해당 일련 번호에 해당하는 이펙트를 제거합니다. } ``` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 질문에서 요구한 시그니처와 주석 설명을 정확히 제공했으며, 문서와 일치하는 API를 사용했습니다. [source_doc] | 이펙트 제어 기능을 제공합니다. # Methods - **integer PlayEffect(string animationClipRUID, Entity instigator, Vector3 position, float zRotation, Vector3 scale, boolean isLoop = false, Dictionary<string, any> options = nil)** 현재 맵의 고정된 위치에 이펙트를 재생하고 이펙트를 제거하기 위한 일련 번호를 반환합니다. 이펙트 생성에 실패할 경우 0을 반환합니다. 사용 가능한 옵션