← 목록

mLua · Nemotron-CC 리프레이즈 (CPT)

총 8,200개 · 페이지 1/274
🔀 랜덤 처음으로
불러오는 중…

[task] | wikipedia [title] | 스크립트 라이프 사이클 [category] | Guides [rephrased] | # 스크립트 라이프 사이클 스크립트 라이프 사이클은 메이플스토리 월드에서 컴포넌트 스크립트의 함수들이 언제 호출되는지를 설명하는 개념입니다. 라이프 사이클을 이해하면 특정 함수의 실행 시점을 예측할 수 있으며, 전체 월드의 동작 흐름을 고려하여 논리적으로 스크립트를 작성하는 데 도움이 됩니다. ## 기본 이벤트 함수의 라이프 사이클 월드에 필요한 로직을 구현하기 위해서는 컴포넌트 스크립트를 생성해야 합니다. 컴포넌트 스크립트를 작성할 때는 함수가 호출되는 시점을 정확히 파악하여 의도한 대로 동작하도록 구성해야 합니다. 라이프 [original] | # 학습 과정 소개 기본 이벤트 함수의 라이프 사이클과 플레이할 때의 전체 라이프 사이클을 알아봅시다. 라이프 사이클을 이해하면 특정 함수가 언제 불리는지 예상할 수 있고, 전체 월드의 동작을 고려하며 제작할 수 있습니다. # 기본 이벤트 함수의 라이프 사이클 월드에 필요한 로직을 만들기 위해서는 컴포넌트 스크립트를 만들어야만 합니다. 필요한 컴포넌트 스크립트를 만들 때 호출되는 시점을 예상해 의도한 로직에 맞게 동작할 수 있도록 작성해야 합니다. 라이프 사이클의 개념을 익혀두면 전체 흐름을 파악할 수 있기에 스크립트를 작성 [chunk_id] | Guides:668:0

[task] | extract_knowledge [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 검증 (Server Validation) ## 1. 개념 설명 메이플스토리 월드(mLua)에서 플레이어 엔티티가 서버 함수를 호출할 때 데이터는 '패킷(Packet)'을 통해 전송됩니다. 클라이언트는 조작이 가능하므로, 클라이언트에서 보낸 데이터를 서버가 무조건 신뢰하면 패킷 변조나 클라이언트 변조 공격에 취약해집니다. 따라서 **중요한 데이터**(골드, 경험치, 아이템 등)를 다루는 판정은 반드시 **서버에서 재검증(Re-validation)** 해야 합니다. * **클라이언트 역할:** UI 표시, 입력 수집, [original] | # 학습 과정 소개 플레이어 엔티티에서 서버 함수를 호출할 경우 '패킷'을 통해 데이터를 전송합니다. 중요한 데이터를 패킷에 담아 보낼 경우, 서버는 받은 패킷을 바로 반영하지 않고 한 번 더 검증해 보안을 강화해야 합니다. 이번 가이드에서는 서버 검증 스크립트를 작성하고, 안정적인 서버를 구성하는 방법을 알아봅니다. ##### 참고 가이드 * [패킷 변조 대비](/docs/?postId=1102) * [WorldConfig](/docs/?postId=1101) # 검증 시 유의 사항 클라이언트 변조 및 패킷 변조 예방을 위 [chunk_id] | Guides:1084:0

[task] | extract_knowledge [title] | WorldShopProduct [category] | Misc [rephrased] | # WorldShopProduct `WorldShopService`를 통해 조회한 상품 정보를 나타내는 구조체입니다. ## 개념 설명 `WorldShopProduct`는 월드샵(WorldShop)에 등록된 개별 상품의 메타데이터를 포함합니다. 이 객체는 상품의 기본 식별 정보(이름, ID), 가격, 상태, 종류, 이미지 리소스 위치, 그리고 선택적으로 설정된 판매 기간 정보를 제공합니다. ## API 사용법 `WorldShopProduct`는 읽기 전용 속성(Properties)으로 구성되어 있습니다. | 속성 이름 | [original] | WorldShopService를 통해 얻은 상품의 정보입니다. # Properties - **string Description** 상품의 설명입니다. - **DateTime EndSalesPeriod** 판매 종료 일시입니다. HasSalesPeriod가 true일 때만 유효한 값을 가집니다. - **boolean HasSalesPeriod** 판매 기간이 설정되어 있는지 확인합니다. - **string Id** 상품의 식별자입니다. - **string Name** 상품의 이름입니다. - **int32 Pric [chunk_id] | Misc:641:0

[task] | distill [title] | 행동 트리 노드 만들기 [category] | Guides [rephrased] | **Decorator Node 생성 및 실행** `BTNodeType`의 프로퍼티에 `any` 타입의 `Child` (또는 `child`)를 추가하여 Decorator Node로 정의합니다. 자식 노드 실행은 `Behave()` 함수 호출로 처리합니다. ```lua Property: [None] any Child = nil Method: any OnBehave(number delta) { if self.Child == nil then return BehaviourTreeStatus.Failure end loca [original] | Decorator Node는 BTNodeType을 활용해 생성할 수 있습니다. 새 BTNodeType을 생성하고, 프로퍼티로 any 타입의 **Child** 또는 **child**를 추가해 Decorator Node로 만들 수 있습니다. 자식 노드를 실행하고 싶을 때는 `Behave()` 함수를 호출합니다. ```lua Property: [None] any Child = nil Method: any OnBehave(number delta) { if self.Child == nil then return Behaviou [chunk_id] | Guides:1155:2

[task] | diverse_qa [title] | 리치 텍스트 사용하기 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 리치 텍스트를 사용할 수 있는 컴포넌트는 총 몇 가지이며, 각각의 이름은 무엇인가요? 답변: 리치 텍스트를 사용할 수 있는 컴포넌트는 총 4가지로, **TextRendererComponent**, **TextGUIRendererComponent**, **ChatBalloonComponent**, **TextComponent**입니다. 질문: TextComponent는 다른 3가지 컴포넌트와 달리 리치 텍스트 사용에서 어떤 제한이 있나요? 답변: TextComponent에서는 일부 리치 텍스트 태그만 사 [original] | ## 학습 과정 소개 리치 텍스트를 사용할 수 있는 컴포넌트와 태그를 알아봅시다. ##### 참고 가이드 * [말풍선 만들기](/docs?postId=119) * [TextRendererComponent](/apiReference/Components/TextRendererComponent) * [TextGUIRendererComponent](/apiReference/Components/TextGUIRendererComponent) * [ChatBalloonComponent](/apiReference/Components/Cha [chunk_id] | Guides:1327:0

[task] | extract_knowledge [title] | Effective MSW 1 [category] | Guides [rephrased] | # 1. 개념 설명 메이플스토리 월드(mLua) 환경에서 객체 참조와 비동기 처리 시 발생하는 문제를 해결하기 위한 두 가지 핵심 개념이 존재한다. 1. **객체 유효성 검사 (`isvalid`)**: 루아의 일반적인 `nil` 체크와 달리, mLua에서는 엔티티(Entity)나 컴포넌트(Component)의 삭제 과정이 즉시 완료되지 않는다. 삭제 요청부터 실제 메모리 해제(`nil` 상태)까지 여러 단계(삭제 처리 대기, 삭제 중, 삭제 완료)가 존재하므로, 단순한 `nil` 비교는 중간 상태의 객체를 참조하여 오류를 유발 [original] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민 [chunk_id] | Guides:559:0

[task] | extract_knowledge [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController 컴포넌트 초기화 ## 1. 개념 설명 메이플스토리 월드의 기본 `PlayerController` 동작을 대체하거나 확장하기 위해 커스텀 스크립트를 사용하는 경우, 컴포넌트 초기화 로직을 직접 구현해야 합니다. 이 과정은 클라이언트 환경(`[client only]`)에서 수행되며, 로컬 플레이어(`LocalPlayer`)에게만 적용됩니다. 커스텀 초기화는 `UseCustomScript` 플래그가 `true`일 때만 진행되며, 다음과 같은 5가지 핵심 메서드로 구성됩니다. 1. **`On [original] | 컴포넌트를 초기화할 수 있도록 아래 5가지 메소드를 추가하고, 아래와 같이 작성합니다. `UseCustomScript`가 `false`이면 초기화하지 않으며, LocalPlayer인 경우에만 키 매핑, Hold 액션 설정, 이벤트 핸들러 등록, 컴포넌트 캐싱을 수행합니다. - `OnBeginPlay()`: 컴포넌트 초기화의 진입점으로 키, 핸들러, 컴포넌트를 설정하고 StateComponent의 HitEventHandler를 재정의합니다. - `InitKeys()`: 액션 키와 상호작용 키의 기본 매핑을 등록합니다. - `Init [chunk_id] | Guides:1403:2

[task] | distill [title] | 월드 워프하기 [category] | Guides [rephrased] | `_TeleportService:GetWarpRecord(UserId)`는 유저가 워프로 현재 월드에 입장했는지, 그리고 이전 월드가 어디였는지 확인하는 API입니다. 일반 입장 시 `nil`을 반환합니다. **사용 예시** ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { local UserId = event.UserId local warpRecord = _TeleportServi [original] | 이동한 월드에서 입장한 유저가 워프로 입장한 것인지 `GetWarpRecord()`를 활용해 확인할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성하고, Common에 추가합니다. 2. 월드에 입장한 유저가 워프로 입장했는지 확인할 수 있도록 아래와 같이 작성합니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { ------------- [chunk_id] | Guides:743:1

[task] | distill [title] | MobileVibratorService [category] | Services [rephrased] | # MobileVibratorService 모바일 기기의 하드웨어 진동 기능을 제어합니다. 해당 기능이 기기에서 지원되어야만 동작합니다. ## Methods * **`boolean IsHWSupported()` `[ClientOnly]`** 기기의 진동 기능 지원 여부를 반환합니다. * **`void Vibrate()` `[ClientOnly]`** 기기를 진동시킵니다. ## Inherited from Service * `EventHandlerBase ConnectEvent(string key, I [original] | 모바일 기기의 진동 기능을 사용합니다. 사용자 기기에서 진동 기능을 지원해야 사용할 수 있습니다. # Methods - **boolean IsHWSupported() [ClientOnly]** 기기의 진동 기능 지원 여부를 반환합니다. - **void Vibrate() [ClientOnly]** 기기를 진동시킵니다. ##### inherited from Service: - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 [chunk_id] | Services:930:0

[task] | wikipedia [title] | UI 엔티티 제어하기 [category] | Guides [rephrased] | # UI 엔티티 제어 메이플스토리 월드(MapleStory Worlds)에서 UI 엔티티의 노출(보임/숨김) 상태는 `SetEnable()` 함수를 통해 제어합니다. 이 함수는 엔티티 인스턴스를 인수로 받아, 해당 UI 요소가 화면에 표시되도록 할지(`true`) 또는 숨기도록 할지(`false`) 결정합니다. ## 개별 UI 엔티티 제어 팝업창과 같이 여러 UI 요소가 동시에 나타났다가 사라져야 하는 경우, 각 UI 요소가 동일한 계층(레벨)에 독립적으로 존재한다면 모든 엔티티의 `Enable` 상태를 개별적으로 설정해야 합 [original] | `SetEnable()` 함수를 사용해 UI의 노출을 제어할 수 있습니다. 아래 그림과 같이 팝업창을 직접 제작하고 동일 계층으로 UI를 만들었을 경우를 살펴봅시다. 이 팝업창은 동시에 나타나고 사라져야 하므로 모든 엔티티의 **Enable**을 별도로 설정해야 합니다. ```lua void ShowPopupUI() { local PopupUIEntity_1 = _EntityService:GetEntityByPath("/ui/DefaultGroup/MODImage_1") local PopupUIEntity_2 = [chunk_id] | Guides:1154:1

[task] | wikipedia [title] | RectTileMap에서 캐릭터 이동 제어 [category] | Guides [rephrased] | # 이동 RectTileMap에서 캐릭터 이동 제어: 장애물 타일 피하기 이 섹션은 `RectTileMap` 환경에서 점프로만 회피할 수 있는 장애물을 설정하고, 해당 장애물을 밟으면 캐릭터가 사망하도록 동작을 제어하는 방법을 설명합니다. ### 구성 및 설정 1. **맵 구성**: 맵에 `Trap` 타일을 배치합니다. 2. **스크립트 컴포넌트 생성**: `MyDesk` 하위에 `CheckTrapTile`이라는 이름의 새 스크립트 컴포넌트를 생성합니다. 3. **컴포넌트 적용**: 생성된 `CheckTrapTile` 컴 [original] | ## 장애물 타일 피하기 점프로만 넘어갈 수 있는 장애물을 만들고, 장애물을 밟으면 캐릭터가 죽도록 설정해 봅시다. 1. 맵에 Trap 타일을 배치합니다. 2. **MyDesk** 아래에 새 스크립트 컴포넌트 **CheckTrapTile**를 만든 뒤, **DefaultPlayer**에 추가합니다. 3. 아래와 같이 **CheckTrapTile**을 작성합니다. ```lua Property: [None] string CurrentTileName = "" Met [chunk_id] | Guides:748:2

[task] | knowledge_list [title] | StateSet 제어하기 [category] | Guides [rephrased] | 제시된 문서 내용에 기반하여 핵심 사실을 추출한 목록입니다. 1. Gacha StateSet을 적용하기 위해서는 `StateComponent`가 포함된 엔티티 모델이 필요하며, `Workspace - MyDesk - Create Model` 메뉴를 통해 생성합니다. 2. Gacha 모델에는 `TransformComponent`, `RigidbodyComponent`, `SpriteRendererComponent`(SpriteRUID: 939597de7475400ab64231404c764e4c), `StateComponent`를 추 [original] | ### Gacha 모델 생성 생성한 **Gacha** StateSet을 사용하기 위해서 **StateComponent**가 있는 엔티티를 생성합니다. 1. **Workspace - MyDesk - Create Model**을 눌러 새로운 **Gacha** 모델을 생성합니다. 2. 모델에 **TransformComponent, RigidbodyComponent, SpriteRendererComponent, StateComponent**를 추가합니다. * SpriteRUID: 939597de7475400ab64231404c [chunk_id] | Guides:1398:6

[task] | knowledge_list [title] | 렉트 타일 제작하기 [category] | Guides [rephrased] | 제시된 문서에는 mLua 스크립트 언어, API, 코드 블록, 서버/클라이언트 실행 공간, 또는 기술적인 동기화 제약 사항에 대한 정보가 **전혀 포함되어 있지 않습니다.** 해당 문서는 Adobe Photoshop을 사용하여 `RectTileMap`에 활용할 그래픽 리소스(타일 이미지)를 제작하는 **아트 가이드**입니다. 따라서 요청하신 "API 이름·매개변수·반환 타입·동기화/서버·클라이언트 제약"을 명시하는 작업은 원문에 없는 사실을 지어내게 되므로 수행할 수 없습니다. 대신, 원문에 명시된 **그래픽 리소스 제작 관련 [original] | # 학습 과정 안내 크리에이터의 월드에 어울리는 특색 있는 렉트 타일을 그리는 방법을 소개합니다. 크리에이터가 사용하기 편한 소프트웨어를 사용해 타일을 제작할 수 있습니다. 이 가이드는 Adobe Photoshop을 사용해 타일을 제작합니다. 제작한 시트는 [아틀라스 활용하기](/docs/?postId=687)를 참고해 이미지를 일정한 크기로 잘라 타일로 활용할 수 있습니다. ##### 참고 가이드 [RectTileMap의 활용](/docs/?postId=589) [아틀라스 활용하기](/docs/?postId=687) # 타일 [chunk_id] | Guides:1040:0

[task] | distill [title] | PolygonShape [category] | Misc [rephrased] | **PolygonShape** 충돌 기능에 사용하는 다각형 모양입니다. **Properties** * `float Angle`: 회전 각도. * `List<Vector2> Points`: 다각형을 이루는 점들의 월드 좌표. * `Vector2 Position`: (Shape 상속) 모양의 월드 좌표. **Constructors** * `PolygonShape(Vector2 position, List<Vector2> points, float angle)`: 지정한 값으로 초기화합니다. [original] | 충돌 관련 기능에 활용하는 다각형 모양을 나타냅니다. # Properties - **float Angle** 회전된 각도입니다. - **List<Vector2> Points** 다각형을 이루는 점들의 월드 좌표상 위치입니다. ##### inherited from Shape: - **Vector2 Position** 모양의 월드 좌표상 위치입니다. # Constructors - **PolygonShape(Vector2 position, List<Vector2> points, float angle)** 지정한 [chunk_id] | Misc:925:0

[task] | extract_knowledge [title] | 헤어 만들기 [category] | Guides [rephrased] | # 메이플스토리 월드: 아바타 아이템(헤어) 레이어 구조 및 제작 가이드 본 절에서는 메이플스토리 월드의 아바타 아이템인 헤어(Hair)를 제작할 때 사용하는 스프라이트 시트(Sprite Sheet)의 레이어 구조, 모자(Cap)와의 상호작용 규칙, 그리고 기본 이미지 작업 프로세스를 다룹니다. ## 1. 개념 설명: 헤어 및 모자 레이어 구조 헤어 아이템은 캐릭터의 자세(일반, 엎드림)와 관점(앞모습, 뒷모습)에 따라 서로 다른 레이어를 참조하여 렌더링됩니다. 또한, 모자 아이템을 착용했을 때 헤어가 눌리는 효과를 표현하기 [original] | 1. NoCap 헤어의 뒷모습을 그릴 수 있는 레이어와 모자 샘플이 포함되어 있습니다. [모자 만들기](/docs?postId=592) vslot의 3번 유형에 해당하는 모자 샘플입니다. * **guide_cap_samples**: 기본 헤어로 머리 모양이 변하지 않는 모자 샘플이 포함되어 있습니다. * **edithere:back_backHair_91**: 헤어의 뒷모습을 그릴 수 있는 레이어입니다. 앞모습에서는 별도의 레이어에 그린 긴 머리를 함께 그려야합니다 2. WithCap 모자를 썼을 때 눌리는 헤어의 [chunk_id] | Guides:657:2

[task] | distill [title] | ResourceService [category] | Services [rephrased] | # ResourceService ### GetTypeAndWait 리소스 ID에 해당하는 타입을 반환합니다. ```lua Method: void OnBeginPlay() { local type = _ResourceService:GetTypeAndWait('f55cd1b715c14593a97caff8b147d544') log(type) } ``` ### RemoveCaches 지정한 리소스 ID 목록을 캐시에서 해제합니다. ```lua Method: [client only] void UpgradeSkill(str [original] | #### GetTypeAndWait 리소스 타입을 확인하는 예제입니다. ```lua Method: void OnBeginPlay() { -- sprite local type = _ResourceService:GetTypeAndWait('f55cd1b715c14593a97caff8b147d544') log(type) -- animationclip local type2 = _ResourceService:GetTypeAndWait('235ede11f6a24ecb85f6271833d06ba0') log(type2) } [chunk_id] | Services:644:5

[task] | distill [title] | 오버레이 라이트 제어하기 [category] | Guides [rephrased] | # 광원 오버레이 라이트 제어하기 `_OverlayLightService`는 클라이언트에서만 사용 가능하며, 오버레이 라이트를 생성 및 제거합니다. ### 광원 생성 `SpawnFreeformTypeOverlayLight` 메서드를 통해 Freeform 타입 광원을 생성합니다. 1. **서비스 활성화**: `_OverlayLightService:SetOverlayLightEnabled(true)` 호출. 2. **정보 객체 생성**: `FreeformTypeOverlayLightInfo(self.Entity)`로 인스턴스 [original] | ```lua [client only] void OnBeginPlay() { _OverlayLightService:SetOverlayLightEnabled(true) -- 생성할 Freeform 타입 광원의 정보를 담을 객체를 생성합니다. local overlayLightInfo = FreeformTypeOverlayLightInfo(self.Entity) -- 광원 모양을 만들 점의 정보들을 입력합니다. local freeformPoints = table.create(4) [chunk_id] | Guides:1346:2

[task] | diverse_qa [title] | AvatarRendererComponent [category] | Components [rephrased] | 질문: `AvatarRendererComponent`의 주요 역할은 무엇인가요? 답변: 아바타 형태의 엔티티를 렌더링하는 것입니다. 질문: `OrderInLayer` 프로퍼티의 값이 클수록 렌더링 우선순위는 어떻게 되나요? 답변: 같은 Layer 내에서 수가 클수록 앞에 보이도록 우선순위가 결정됩니다. 질문: `IgnoreMapLayerCheck` 프로퍼티가 true로 설정되어 있을 때 `SortingLayer`에 Map Layer 이름을 지정하면 어떤 일이 발생하나요? 답변: Map Layer 이름에 대한 자동 치환을 수행하지 [original] | 아바타 형태의 엔티티를 렌더링합니다. # Properties - **boolean IgnoreMapLayerCheck [Sync]** SortingLayer에 Map Layer 이름을 지정했을 때 자동 치환을 수행하지 않습니다. - **string MaterialId [Sync]** 렌더러에 적용할 머티리얼의 Id를 지정합니다. - **int32 OrderInLayer** 같은 Layer 내의 우선순위를 결정합니다. 수가 클수록 앞에 보입니다. - **float PlayRate [Sync]** 아바타 애니메이션의 [chunk_id] | Components:350:0

[task] | distill [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [category] | Guides [rephrased] | # SideViewRectTileMap에서 캐릭터 이동 제어 (SideviewbodyComponent) `SideViewRectTile` 모드로 제작된 맵에서 `DefaultPlayer`의 횡스크롤 이동을 제어하는 컴포넌트입니다. `RigidbodyComponent`, `KinematicbodyComponent`와 함께 기본 제공되며, 맵 모드에 따라 활성화되는 이동 주체가 자동 전환됩니다. ## 프로퍼티 | 프로퍼티 | 타입 | 설명 | | :--- | :--- | :--- | | `Enable` | `boolean` | 컴 [original] | # 학습 과정 소개 DefaultPlayer에는 RigidbodyComponent, KinematicbodyComponent, SideviewbodyComponent가 모두 포함되어 있기 때문에 맵이 제작된 모드에 따라 자동으로 이동 제어의 주체가 달라집니다. 그중 SideViewRectTile 모드로 제작된 맵에서는 SideviewbodyComponent로 캐릭터의 이동을 제어합니다. 이번 시간에는 SideviewbodyComponent에 대해 알아보고 간단한 예제를 통해 활용법을 살펴봅시다. ##### 참고 API Refe [chunk_id] | Guides:759:0

[task] | distill [title] | 스킬 이펙트를 뿌려보자! [category] | Guides [rephrased] | # 이펙트 스킬 이펙트를 뿌려보자! 메이플스토리 월드의 `_EffectService`를 사용하여 이펙트 리소스를 호출하는 방법을 학습합니다. 특정 키 입력 시 스킬 이펙트가 노출되는 예제를 통해 구현 방법을 다룹니다. ## _EffectService API 이펙트 제어에 사용되는 주요 함수 두 가지의 시그니처와 동작 규칙은 다음과 같습니다. ### `PlayEffect` 고정된 세계 좌표(World Space) 기준의 특정 위치에 이펙트를 생성합니다. ```lua _EffectService:PlayEffect(string [original] | # 학습 과정 소개 메이플스토리 월드에서는 메이플스토리에서 사용되었던 수많은 이펙트 리소스들을 제공하고 있습니다. 그리고 우리는 이러한 이펙트들을 적절한 시점과 위치에 호출해 줌으로써 한층 더 멋진 연출을 구사할 수 있습니다. 이번 과정에서는 특정 키를 누를 때마다 스킬 이펙트가 노출되는 예제를 진행해봄으로써 스크립트를 통해 이펙트를 호출하는 방법에 대해 알아보도록 합니다. 다음 가이드를 먼저 학습하면 이번 과정을 진행하는 데 많은 도움이 될 것입니다. [스크립트 에디터 오리엔테이션](https://mod-developers. [chunk_id] | Guides:70:0

[task] | knowledge_list [title] | Blackboard [category] | Misc [rephrased] | 1. `Blackboard` 컴포넌트는 AI 행동 트리에서 사용하는 데이터 저장소이며, 키-값 쌍(key-value pair) 형식으로 데이터를 관리하여 행동 트리 노드 간의 데이터 공유에 사용됩니다. 2. `boolean GetBool(string key)` 메서드는 지정한 키에 저장된 `boolean` 값을 조회하여 반환합니다. 3. `Color GetColor(string key)` 메서드는 지정한 키에 저장된 `Color` 값을 조회하여 반환합니다. 4. `Component GetComponent(string key)` 메서 [original] | AI 행동 트리에서 사용하는 데이터 저장소입니다. 키-값 쌍으로 데이터를 관리하며 행동 트리 노드 간 데이터를 공유합니다. # Methods - **boolean GetBool(string key)** 지정한 키에 저장된 boolean 값을 조회합니다. - **Color GetColor(string key)** 지정한 키에 저장된 Color 값을 조회합니다. - **Component GetComponent(string key)** 지정한 키에 저장된 Component를 조회합니다. - **ComponentRef Get [chunk_id] | Misc:1385:0

[task] | diverse_qa [title] | ButtonClickEvent [category] | Events [rephrased] | 질문: `ButtonClickEvent`는 어떤 상황에서 발생하는 이벤트인가요? 답변: Button 클릭 시 발생하는 이벤트입니다. 질문: `ButtonClickEvent`는 어느 공간(Space)에서 발생하는 이벤트인가요? 답변: Client 공간에서 발생하는 이벤트입니다. 질문: `ButtonClickEvent`를 발생시키는 API는 무엇인가요? 답변: `ButtonComponent` API에 의해 발생합니다. 질문: `ButtonClickEvent`의 `Entity` 프로퍼티는 어떤 정보를 포함하나요? 답변: 클릭된 버튼 [original] | Button 클릭 시 발생하는 이벤트입니다. 이 Event는 아래 API에 의해 발생합니다. * ButtonComponent <img src="https://img.shields.io/static/v1?label=Space&message=Client&color=c4a484" alt="custom" title="Client에서 이벤트가 발생합니다." data-nodeid="4"> # Properties - **Entity Entity** 클릭된 버튼 엔티티입니다. # Constructors - **ButtonClickEv [chunk_id] | Events:398:0

[task] | diverse_qa [title] | PhysicsRigidbodyComponent [category] | Components [rephrased] | 질문: `PhysicsRigidbodyComponent`에서 물리 접촉 시작 시 이벤트를 처리하기 위해 사용하는 이벤트 핸들러의 이름은 무엇인가요? 답변: `HandlePhysicsContactBeginEvent`입니다. 질문: `HandlePhysicsContactBeginEvent` 이벤트 핸들러는 어떤 컴포넌트로부터 전송되는 네이티브 이벤트인가요? 답변: `PhysicsColliderComponent`로부터 전송됩니다. 질문: `HandlePhysicsContactBeginEvent` 이벤트는 서버와 클라이언트 중 어느 공 [original] | ```lua Event Handler: [self] HandlePhysicsContactBeginEvent (PhysicsContactBeginEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: PhysicsColliderComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local [chunk_id] | Components:776:2

[task] | distill [title] | Effective MSW 1 [category] | Guides [rephrased] | # MSW 최적화 가이드: 유효성 검사 및 Wait 함수 ## 1. `isvalid()` 사용 엔티티나 컴포넌트의 유효성을 검사할 때 `nil` 체크 대신 `isvalid()`를 사용해야 합니다. * **이유**: 엔티티 삭제는 즉시 `nil`이 되지 않으며, `삭제 요청 → 처리 대기 → 삭제 중 → 완료 → nil`의 단계를 거칩니다. `nil` 체크만으로는 삭제 처리 중 상태의 객체에 접근하여 에러나 비정상 동작을 유발할 수 있습니다. * **동작**: `isvalid()`는 객체의 실제 상태(유효성)를 보장합니다. [original] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민 [chunk_id] | Guides:559:0

[task] | extract_knowledge [title] | 애니메이션 재생 [category] | Guides [rephrased] | # UI에서 아바타 애니메이션 재생하기: 공격 동작 이름 데이터 조회 ## 개념 설명 `GetActionNameDatas` 메서드는 클라이언트에서만 실행되며, 주어진 무기 유형(`dataID`)에 따라 유효한 아바타 공격 애니메이션 이름(`ActionName`)을 반환하는 역할을 합니다. 이 메서드는 `dataID`의 값에 따라 다른 애니메이션 이름 목록(`AttackActionType_*_Names`)에서 무작위로 하나를 선택하는 `self:GetRandomButValidName` 메서드를 호출합니다. 선택된 이름은 `Cor [original] | ```lua [client only] ActionNameStruct GetActionNameDatas (string dataID) { local randomName ="" if dataID == "sword" or dataID == "dagger" then randomName = self:GetRandomButValidName(self.AttackActionType_OneHand_Names) local data = Action [chunk_id] | Guides:1144:1

[task] | extract_knowledge [title] | Maple GYM 만들기 Ⅱ [category] | Guides [rephrased] | # 상점 UI 제어 및 버튼 이벤트 연결 ## 1. 개념 설명 메이플스토리 월드에서 상점 UI를 구성하고 사용자 입력에 따라 UI의 표시/숨김을 제어하거나 특정 스탯 업그레이드 로직을 실행하기 위해서는 UI 엔티티의 계층 구조(Hierarchy)를 명확히 정의하고, `UIManager` 컴포넌트를 통해 이벤트 핸들러를 연결해야 합니다. ## 2. API 사용법 상점 UI를 제어하는 데에는 다음과 같은 API와 컴포넌트 프로퍼티가 사용됩니다. * **`_EntityService:GetEntityByPath(path)`**: [original] | # 상점 UI 제작 1. 새로운 **UI Group**을 추가하고, **DefaultShow** 값을 **true**로 설정합니다. 2. 아래와 같이 UI엔티티를 추가하고 배치합니다. UI엔티티의 이름은 이미지와 동일해야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1769512144899182516b8ee4d4248a16af41cc5d72f56.png "1") > **Tip.** > 이미지나 텍스트가 다른 UI엔티티에 가릴 경우 하이어라키 순서를 변경합니다. [chunk_id] | Guides:143:2

[task] | diverse_qa [title] | AI ToolKit [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 AI ToolKit 기능을 활성화하면 어떤 장점이 있나요? 답변: AI ToolKit 기능을 활성화하면 간단한 명령을 통해 월드를 제작할 수 있습니다. 질문: AI ToolKit을 사용하기 위해 반드시 사용해야 하는 환경과 형식은 무엇인가요? 답변: AI ToolKit을 사용하기 위해서는 반드시 로컬 워크스페이스와 ExtendedScriptFormat을 사용해야 합니다. 질문: AI ToolKit이 정상적으로 동작하기 위해 AI ToolKit Settings에서 어떤 탭들의 설정을 모두 마쳐야 하나요 [original] | 메이플스토리 월드에서 제공하는 AI ToolKit 기능을 활성화하면 간단한 명령을 통해 월드를 제작할 수 있습니다. AI ToolKit을 사용하기 위해서는 사전 준비 단계와 별도의 AI 에이전트 구독이 필요합니다. ## 로컬 워크스페이스 AI ToolKit을 사용하기 위해서는 반드시 **로컬 워크스페이스와 ExtendedScriptFormat**을 사용해야 합니다. 로컬 워크스페이스에 대한 내용은 [LocalWorkspace](docs/?postId=1165) 가이드를 참고하세요. AI ToolKit은 AI ToolKit Se [chunk_id] | Guides:1374:0

[task] | extract_knowledge [title] | 날짜와 시간 활용하기 [category] | Guides [rephrased] | # DateTime 포맷팅: 사용자 지정 서식 지정자 mLua에서 `DateTime` 객체의 문자열 표현을 제어하기 위해 `ToFormattedString` 메서드를 사용합니다. 이 메서드는 특정 패턴 문자열(서식 지정자)을 인수로 받아 날짜와 시간 정보를 원하는 형태로 변환합니다. ## 개념 설명 사용자 지정 서식 지정자는 문자열 내의 특정 기호를 통해 연도, 시간 구분, 날짜 구분 등 특정 정보를 출력합니다. 1. **AM/PM 지정자 (`tt`)** * `tt`: AM 또는 PM 문자를 출력합니다. [original] | "tt" 사용자 지정 서식 지정자는 AM/PM 지정자를 나타냅니다. AM 지정자는 0:00:00부터 11:59:59.999까지의 모든 시간에 사용되고 PM 지정자는 12:00:00부터 23:59:59.999까지의 모든 시간에 사용됩니다. ```lua local date = DateTime(2022, 8, 29, 19, 7, 5, 023) log(date:ToFormattedString("tt")) -- PM ``` #### "y" "y" 사용자 지정 서식 지정자는 연도를 한자리 또는 두 자리 숫자로 나타냅니다. 연도가 두 자리를 [chunk_id] | Guides:691:9

[task] | diverse_qa [title] | EntityDeselectEditorEvent [category] | Events [rephrased] | 질문: EntityDeselectEditorEvent는 언제 발생하는 에디터 이벤트인가요? 답변: 엔티티 선택 해제 시 발생하는 에디터 이벤트입니다. 질문: EntityDeselectEditorEvent를 발생시키는 API는 무엇이며, 해당 이벤트는 어떤 공간에서 발생하나요? 답변: EditorService API에 의해 발생하며, Editor 공간에서 이벤트가 발생합니다. 질문: EntityDeselectEditorEvent의 Property인 Entity의 역할은 무엇인가요? 답변: 클릭된 엔티티를 나타냅니다. 질문: En [original] | 엔티티 선택 해제 시 발생하는 에디터 이벤트입니다. 이 Event는 아래 API에 의해 발생합니다. * EditorService <img src="https://img.shields.io/static/v1?label=Space&message=Editor&color=c4a484" alt="custom" title="Editor에서 이벤트가 발생합니다." data-nodeid="4"> # Properties - **Entity Entity** 클릭된 엔티티입니다. # Constructors - **EntityDeselect [chunk_id] | Events:414:0

[task] | knowledge_list [title] | SoundComponent [category] | Components [rephrased] | ```lua -- SoundComponent 핵심 사실 목록 -- 각 항목은 독립적인 문장으로 작성되었으며, API 이름, 매개변수, 반환 타입, 동기화/서버·클라이언트 제약을 명시했습니다. -- 1. AudioClipRUID 프로퍼티 -- [Sync] string AudioClipRUID: 음원 재생에 사용할 AudioClipRUID를 설정하는 동기화 프로퍼티입니다. -- 2. Bgm 프로퍼티 -- [Sync] boolean Bgm: 재생할 음원이 배경음악으로 처리될지 여부를 설정하는 동기화 프로퍼티입니다. -- 3. Hea [original] | 효과음 또는 배경음악을 재생하고 관리합니다. # Properties - **string AudioClipRUID [Sync]** 음원 재생에 사용할 AudioClipRUID를 설정합니다. - **boolean Bgm [Sync]** 배경음악으로 재생될지 여부를 설정합니다. - **float HearingDistance [Sync]** 소리가 들리는 리스너 엔티티와의 최대 거리를 설정합니다. - **boolean KeepBGM [Sync]** 이전 BGM과 현재 BGM이 같다면 음원을 이어서 재생합니다. Bgm, P [chunk_id] | Components:373:0