← 목록

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

총 8,200개 · 페이지 240/274
🔀 랜덤
불러오는 중…

[task] | wikipedia [title] | 8. 상점 로직 만들기Ⅰ [category] | Guides [rephrased] | `Sell()` 함수는 인벤토리의 특정 슬롯에 있는 아이템을 지정된 수량만큼 판매하여 메소를 획득하는 로직을 구현합니다. 이 함수에는 `inventorySlotIndex`와 `itemCount` 두 개의 매개변수를 전달하며, 판매 가격은 해당 아이템의 구매 가격의 절반으로 계산됩니다. 아래 코드는 서버에서 실행되는 `Sell()` 함수의 구현 예시입니다. 함수는 먼저 발신자 ID를 통해 사용자 엔티티와 인벤토리를 조회합니다. 이후 `inventorySlotIndex`에 해당하는 `ItemStack`을 확인하여 아이템이 존재하지 않 [original] | 3. `Sell()` 함수를 추가하고 매개변수 **inventorySlotIndex, itemCount**를 추가합니다. inventorySlotIndex에 있는 인벤토리 아이템을 itemCount만큼 판매하고 메소를 획득하도록 작성합니다. 이때 판매 가격은 구매 가격의 절반이 되도록 함께 작성합니다. ```lua [server] void Sell (integer inventorySlotIndex integer itemCount) { -- inventorySlotIndex에 있는 인벤토리 [chunk_id] | Guides:1115:1

[task] | knowledge_list [title] | 8. 상점 로직 만들기Ⅰ [category] | Guides [rephrased] | 1. `Sell` 함수는 `[server]` 실행 공간에서 동작하며, 매개변수로 `integer` 타입의 `inventorySlotIndex`와 `itemCount`를 받아 특정 인벤토리 슬롯의 아이템을 판매하고 메소를 획득하는 로직을 수행합니다. 2. 함수 내부에서는 `senderUserId` 값을 `customerUserId` 로컬 변수에 대입하고, `_UserService` 서비스의 `GetUserEntityByUserId` 메서드를 호출하여 해당 사용자의 엔티티(`user`)를 조회합니다. 3. 조회된 사용자 엔티티의 `Si [original] | 3. `Sell()` 함수를 추가하고 매개변수 **inventorySlotIndex, itemCount**를 추가합니다. inventorySlotIndex에 있는 인벤토리 아이템을 itemCount만큼 판매하고 메소를 획득하도록 작성합니다. 이때 판매 가격은 구매 가격의 절반이 되도록 함께 작성합니다. ```lua [server] void Sell (integer inventorySlotIndex integer itemCount) { -- inventorySlotIndex에 있는 인벤토리 [chunk_id] | Guides:1115:1

[task] | knowledge_list [title] | 8. 상점 로직 만들기Ⅰ [category] | Guides [rephrased] | 1. `Buy` 함수는 `[server]` 실행 공간에서 실행되며, 매개변수로 `string` 타입의 `itemId`와 `integer` 타입의 `itemCount`를 받아 `void` 타입으로 반환합니다. 2. `_Data.ItemTable` 테이블을 통해 `itemId`를 인자로 사용하여 해당 아이템의 정보 객체인 `itemInfo`를 조회합니다. 3. 조회된 `itemInfo`가 `nil`인 경우, `log_error` 함수를 호출하여 "[Shop] (Buy) 아이템 Id 오류: " 문자열과 `itemId`를 연결한 메시지를 [original] | # 상점 로직 작성 1. **Workspace - MyDesk - Create Scripts - Create Logic**을 선택해 새로운 `Shop` 로직을 생성합니다. 2. `Buy()`함수를 생성해 itemId에 해당하는 상품을 itemCount만큼 구매하고, 메소를 차감하도록 작성합니다. ```lua Method: [server] void Buy (string itemId, integer itemCount) { -- itemId에 해당하는 상품을 itemCount만큼 구매 [chunk_id] | Guides:1115:0

[task] | wikipedia [title] | 8. 상점 로직 만들기Ⅰ [category] | Guides [rephrased] | **상점 로직 작성** 상점 로직을 구현하기 위해 먼저 워크스페이스(Workspace)의 `MyDesk` 노드에서 `Create Scripts` 메뉴를 통해 `Create Logic`을 선택하여 `Shop` 이름의 로직 컴포넌트를 생성합니다. 이 컴포넌트에는 상품 구매 및 메소 차감 기능을 수행하는 `Buy()` 함수를 정의합니다. `Buy()` 함수는 서버 측에서 실행되며, 매개변수로 상품 식별자(`itemId`)와 구매 수량(`itemCount`)을 전달받습니다. 함수 내부에서는 먼저 `_Data.ItemTable` 테이블을 [original] | # 상점 로직 작성 1. **Workspace - MyDesk - Create Scripts - Create Logic**을 선택해 새로운 `Shop` 로직을 생성합니다. 2. `Buy()`함수를 생성해 itemId에 해당하는 상품을 itemCount만큼 구매하고, 메소를 차감하도록 작성합니다. ```lua Method: [server] void Buy (string itemId, integer itemCount) { -- itemId에 해당하는 상품을 itemCount만큼 구매 [chunk_id] | Guides:1115:0

[task] | diverse_qa [title] | 8. 상점 로직 만들기Ⅰ [category] | Guides [rephrased] | 질문: 상점 로직을 생성하기 위해 Workspace에서 어떤 경로로 이동해야 하나요? 답변: Workspace - MyDesk - Create Scripts - Create Logic 경로를 선택해 새로운 Shop 로직을 생성합니다. 질문: Buy() 함수의 실행 공간은 어디로 설정되어 있나요? 답변: Buy() 함수는 [server] 실행 공간으로 설정되어 있습니다. 질문: Buy() 함수가 인자로 받는 파라미터는 무엇이며, 각각의 타입은 무엇인가요? 답변: Buy() 함수는 itemId(string)와 itemCount(in [original] | # 상점 로직 작성 1. **Workspace - MyDesk - Create Scripts - Create Logic**을 선택해 새로운 `Shop` 로직을 생성합니다. 2. `Buy()`함수를 생성해 itemId에 해당하는 상품을 itemCount만큼 구매하고, 메소를 차감하도록 작성합니다. ```lua Method: [server] void Buy (string itemId, integer itemCount) { -- itemId에 해당하는 상품을 itemCount만큼 구매 [chunk_id] | Guides:1115:0

[task] | diverse_qa [title] | 8. 상점 로직 만들기Ⅰ [category] | Guides [rephrased] | 질문: `Sell()` 함수에 전달되는 매개변수는 무엇이며 각각 어떤 의미를 가지나요? 답변: `Sell()` 함수에는 `inventorySlotIndex`와 `itemCount` 두 개의 매개변수가 전달됩니다. `inventorySlotIndex`는 판매할 아이템이 위치한 인벤토리 슬롯의 인덱스를 나타내며, `itemCount`는 판매할 아이템의 개수를 나타냅니다. 질문: `Sell()` 함수 내에서 판매 가격은 어떻게 계산되나요? 답변: 판매 가격은 해당 아이템의 구매 가격(`itemInfo.Price`)의 절반으로 계산됩니다 [original] | 3. `Sell()` 함수를 추가하고 매개변수 **inventorySlotIndex, itemCount**를 추가합니다. inventorySlotIndex에 있는 인벤토리 아이템을 itemCount만큼 판매하고 메소를 획득하도록 작성합니다. 이때 판매 가격은 구매 가격의 절반이 되도록 함께 작성합니다. ```lua [server] void Sell (integer inventorySlotIndex integer itemCount) { -- inventorySlotIndex에 있는 인벤토리 [chunk_id] | Guides:1115:1

[task] | wikipedia [title] | 4. 아이템을 인벤토리에 추가하기 [category] | Guides [rephrased] | # 아이템을 인벤토리에 추가하기 이 섹션은 `SimpleInventory` 컴포넌트에서 아이템의 추가, 수정, 제거 및 메소(meso) 변경 사항을 서버와 클라이언트 사이에 동기화하기 위한 이벤트 처리 메서드를 설명합니다. 이 메서드들은 서버 로직에서 상태 변경이 발생했을 때 해당 이벤트를 생성하여 클라이언트에 전송하고, 클라이언트는 수신된 이벤트를 처리하여 로컬 인벤토리 상태를 갱신하는 역할을 수행합니다. ## 아이템 추가 이벤트 처리 아이템이 인벤토리에 추가될 때, 서버는 `SimpleInventoryItemAddedEve [original] | [client] void SendItemAddedEventToClient (SimpleInventoryItemAddedEvent event) { local stack = ItemStack() stack.SlotIndex = event.SlotIndex stack.ItemId = event.ItemId stack.Count = event.ItemCount self.ItemStacks[event.SlotIndex] = stack self.Entity:SendEvent(event) } [chunk_id] | Guides:1114:12

[task] | extract_knowledge [title] | 4. 아이템을 인벤토리에 추가하기 [category] | Guides [rephrased] | # 인벤토리 데이터 저장: 유저 퇴장 시 처리 유저가 맵에서 나가거나 세션을 종료할 때, 해당 유저의 인벤토리 상태가 서버에 영구적으로 기록되어야 합니다. 이를 위해 `UserService`의 `UserLeaveEvent`를 구독하여 유저 ID를 검증한 후, `_DataStorageService`를 통해 데이터를 저장하는 로직을 구현합니다. ## 개념 설명 1. **이벤트 구독**: `UserService`는 유저가 월드를 떠날 때 `UserLeaveEvent`를 발생시킵니다. 2. **유저 식별**: 이벤트 객체(`eve [original] | Entity Event Handler: [service: UserService] HandleUserLeaveEvent (UserLeaveEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: UserService -- Space: Server --------------------------------------------------------- -- Parameters local User [chunk_id] | Guides:1114:13

[task] | wikipedia [title] | 4. 아이템을 인벤토리에 추가하기 [category] | Guides [rephrased] | # 인벤토리 컴포넌트의 아이템 관리 및 상태 동기화 본 섹션은 메이플스토리 월드의 `SimpleInventory` 컴포넌트에서 아이템을 인벤토리에 추가하고, 특정 슬롯의 아이템을 제거하며, 메소(Meso)와 아이템 상태를 클라이언트와 서버 간에 동기화하는 로직을 설명합니다. 모든 데이터 변경 및 상태 발화 이벤트는 서버 측에서만 처리되며, 클라이언트는 수신된 이벤트를 바탕으로 로컬 상태를 갱신합니다. ## 아이템 추가 및 스택 처리 인벤토리에 아이템을 추가할 때는 기존 스택의 여유 공간과 최대 스택 수(`maxStackCoun [original] | if stack == nil then remain = remain - maxStackCount elseif stack.ItemId == itemId then remain = remain - math.min(maxStackCount - stack.Count, remain) end end return (remain <= 0) } [server only] boolean RemoveItemAt (integer slotIndex, integer itemCount) { if sl [chunk_id] | Guides:1114:11

[task] | extract_knowledge [title] | 4. 아이템을 인벤토리에 추가하기 [category] | Guides [rephrased] | # 아이템 인벤토리 데이터 관리 및 영속화 본 절에서는 메이플스토리 월드(mLua)에서 플레이어의 아이템 인벤토리를 서버 측에 유지하고, 데이터 스토리지(Data Storage)를 통해 영구적으로 저장 및 복원하는 방법을 설명합니다. ## 1. 개념 설명 mLua에서 인벤토리 관리 컴포넌트는 다음 세 가지 핵심 프로퍼티를 기반으로 구성됩니다. * **Meso**: 플레이어가 보유한 메소(게임 화폐)의 수량을 나타내는 정수입니다. * **ItemStacks**: 슬롯 인덱스를 키로 하여 `ItemStack` 객체를 값으 [original] | ```lua Property: [None] integer Meso = 10000 [None] table ItemStacks = {} [None] integer Capacity = 16 Method: [server only] void OnBeginPlay() { -- 데이터 스토리지에서 인벤토리 데이터를 불러옴 local userId = self.Entity.PlayerComponent.UserId local userDataStorage = _DataStorageService:GetUserDataStor [chunk_id] | Guides:1114:9

[task] | distill [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # UIShop `ui - DefaultGroup - Shop` 하위에 `UIShop` 컴포넌트를 추가하여 상점 UI의 초기화 및 버튼 이벤트를 처리합니다. ### 1. Property ```lua Property: [None] Entity itemUI = nil [None] Entity scrollView = nil [None] string ShopBtnPath = "/ui/DefaultGroup/RPGButtons/btn_shop" [None] SyncTable<string, Entity> SlotItems ``` ### [original] | # UIShop 1. 새로운 `UIShop` 컴포넌트를 생성합니다. **ui - DefaultGroup - Shop**에 컴포넌트를 추가합니다. 1. 새로운 **itemUI, scrollView, ShopBtnPath, SyncTable** 프로퍼티를 추가합니다. ```lua Property: [None] Entity itemUI = nil [None] Entity scrollView = nil [None] string ShopBtnPath = "/ui/DefaultG [chunk_id] | Guides:1117:0

[task] | extract_knowledge [title] | 4. 아이템을 인벤토리에 추가하기 [category] | Guides [rephrased] | # 4. 아이템을 인벤토리에 추가하기 ## 개념 설명 인벤토리에 아이템을 추가할 때는 단순히 빈 슬롯에 넣는 것보다, 동일한 아이템 ID를 가진 기존 스택(Stack)의 남은 용량(스택 수)을 먼저 채우는 것이 효율적입니다. `AddItem` 메서드는 다음과 같은 순서로 동작합니다. 1. **검증**: 아이템 ID가 데이터 테이블에 존재하는지, 요청한 개수가 0보다 큰지 확인합니다. 2. **기존 스택 채우기**: 인벤토리의 모든 슬롯을 순회하며, 동일한 `ItemId`를 가진 스택을 찾습니다. 해당 스택의 최대 스택 수( [original] | [server only] integer AddItem (string itemId, integer itemCount) { local itemInfo = _Data.ItemTable[itemId] if itemInfo == nil then log_error("[SimpleInventory] (AddItem) 아이템 Id 오류: " .. itemId) return end if itemCount <= 0 then log_error("[SimpleInventory] ( [chunk_id] | Guides:1114:10

[task] | knowledge_list [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | * `InitializeItemList()` 메서드는 `[client only]` 실행 공간 제약이 있으며, `_Data.ItemTable`과 `_Data.ItemTableRowCount`를 참조하여 상품 리스트를 초기화하는 역할을 합니다. * 상품 리스트 초기화 과정에서 아이템 개수만큼의 빈 슬롯을 생성하기 위해 `_SpawnService:SpawnByEntity(self.itemUI, "Item", Vector3.zero, self.scrollView)` API를 호출하며, 이 호출은 `self.scrollView`를 부 [original] | ```lua [client only] void InitializeItemList() { -- 상품 리스트에 아이템을 인덱스 순서로 배치합니다. local itemTable = _Data.ItemTable local itemCount = _Data.ItemTableRowCount -- 아이템 개수만큼 빈 슬롯 준비 local shopItemSlots = {} for i = 1, itemCount [chunk_id] | Guides:1117:1

[task] | distill [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | **상점 로직: 상품 리스트 초기화** `InitializeItemList()` 메서드(client only)에서 `_Data.ItemTable`과 `_Data.ItemTableRowCount`를 사용해 상품 슬롯을 생성 및 배치합니다. 1. **슬롯 생성**: `itemCount`만큼 `shopItemSlots` 테이블에 슬롯을 생성합니다. - `_SpawnService:SpawnByEntity(self.itemUI, "Item", Vector3.zero, self.scrollView)` 호출. 2. **데이터 [original] | ```lua [client only] void InitializeItemList() { -- 상품 리스트에 아이템을 인덱스 순서로 배치합니다. local itemTable = _Data.ItemTable local itemCount = _Data.ItemTableRowCount -- 아이템 개수만큼 빈 슬롯 준비 local shopItemSlots = {} for i = 1, itemCount [chunk_id] | Guides:1117:1

[task] | wikipedia [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 상점 로직을 구현하기 위해 상품 목록을 초기화하는 `InitializeItemList()` 함수를 정의합니다. 이 함수는 클라이언트에서만 실행되도록 `[client only]` 속성이 적용되며, `_Data.ItemTable`과 `_Data.ItemTableRowCount`를 참조하여 상품 데이터를 처리합니다. 구체적인 동작은 다음과 같습니다. 먼저 `_Data.ItemTableRowCount` 값만큼 반복문을 수행하며, `_SpawnService:SpawnByEntity(self.itemUI, "Item", Vector3.zer [original] | ```lua [client only] void InitializeItemList() { -- 상품 리스트에 아이템을 인덱스 순서로 배치합니다. local itemTable = _Data.ItemTable local itemCount = _Data.ItemTableRowCount -- 아이템 개수만큼 빈 슬롯 준비 local shopItemSlots = {} for i = 1, itemCount [chunk_id] | Guides:1117:1

[task] | extract_knowledge [title] | 4. 아이템을 인벤토리에 추가하기 [category] | Guides [rephrased] | # 인벤토리 상태 동기화 이벤트 처리 ## 개념 설명 `SimpleInventory` 컴포넌트는 서버와 클라이언트 간의 아이템 및 메소(Meso) 상태 변경을 동기화하기 위해 전용 이벤트를 사용합니다. 서버에서 아이템 추가, 수정, 삭제 또는 메소 변경이 발생하면, 해당 상태를 담는 이벤트 객체를 생성하여 클라이언트로 전송합니다. 클라이언트는 수신된 이벤트를 처리하여 로컬 `ItemStacks` 테이블과 `Meso` 프로퍼티를 업데이트하고, UI 갱신을 트리거하기 위해 엔티티에 이벤트를 다시 방출합니다. ## API 사용법 동기 [original] | [client] void SendItemAddedEventToClient (SimpleInventoryItemAddedEvent event) { local stack = ItemStack() stack.SlotIndex = event.SlotIndex stack.ItemId = event.ItemId stack.Count = event.ItemCount self.ItemStacks[event.SlotIndex] = stack self.Entity:SendEvent(event) } [chunk_id] | Guides:1114:12

[task] | distill [title] | 7. 상점 UI 만들기 [category] | Guides [rephrased] | # 상점 UI 및 팝업 구성 가이드 인벤토리 프리셋을 기반으로 상점 UI를 구축하고, 구매/판매용 팝업 UI를 추가합니다. ## 1. 상점 UI (Shop) 1. **Preset List > UI > 인벤토리**를 `DefaultGroup`에 추가합니다. 2. 생성된 `inventory_1` UI 엔티티의 **UIInventory**, **UIItemSlot** 컴포넌트를 삭제합니다. 3. `CoinPanel` 및 하위 `coin_count`, `coin_icon`, `item_count` UI 엔티티를 삭제합니다. 4. [original] | # 상점 UI 만들기 인벤토리 프리셋을 활용해 상점 UI를 만들어 봅시다. 1. **Preset List - UI - 인벤토리**를 선택해 DefaultGroup에 추가해 배치합니다. 2. 자동으로 inventory_1 UI엔티티에 추가된 UIInventory 컴포넌트를 **제거**합니다. 3. UIItemSlot 컴포넌트를 **삭제**합니다. > **Tip.** > 인벤토리 프리셋을 UI 그룹에 추가하면, UIInventory, UIItemSlot 컴포넌트가 자동으로 생성됩니다. 3. 상점에서 필요하지 [chunk_id] | Guides:1116:0

[task] | knowledge_list [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 제시된 문서 내용(`UIShop` 컴포넌트 생성, 프로퍼티 정의, `OnBeginPlay` 함수 구현)만을 기반으로 핵심 사실을 추출하여 정리한 목록입니다. * `UIShop` 컴포넌트는 **ui - DefaultGroup - Shop** 경로에 추가되어 생성됩니다. * `itemUI` 프로퍼티는 `[None]` 동기화 속성을 가지며, 타입은 `Entity`이고 기본값은 `nil`입니다. * `scrollView` 프로퍼티는 `[None]` 동기화 속성을 가지며, 타입은 `Entity`이고 기본값은 `nil`입니다. * [original] | # UIShop 1. 새로운 `UIShop` 컴포넌트를 생성합니다. **ui - DefaultGroup - Shop**에 컴포넌트를 추가합니다. 1. 새로운 **itemUI, scrollView, ShopBtnPath, SyncTable** 프로퍼티를 추가합니다. ```lua Property: [None] Entity itemUI = nil [None] Entity scrollView = nil [None] string ShopBtnPath = "/ui/DefaultG [chunk_id] | Guides:1117:0

[task] | distill [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # UIShopItemSlot **UI 경로**: `ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot` ### 프로퍼티 ```lua Property: [None] string ItemId = "" ``` ### 메서드: SetData 아이템 정보(아이콘, 이름, 가격)를 UI에 표시하고 `ItemId`를 저장합니다. ```lua void SetData (string itemId, integer itemPrice) { ---@type ItemInfo [original] | # UIShopItemSlot 1. UIShopItemSlot 컴포넌트를 생성하고, **ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot**에 추가합니다. 2. **ItemId** 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 3. `SetData()` 함수를 생성하고, **itemId, itemPrice** 매개변수를 추가합니다. UI에서 데이터 값이 보이도록 [chunk_id] | Guides:1117:2

[task] | knowledge_list [title] | 7. 상점 UI 만들기 [category] | Guides [rephrased] | 제시된 문서에는 mLua 스크립트 코드, API 메서드, 이벤트 핸들러, 또는 서버/클라이언트 실행 공간 제한에 대한 정보가 포함되어 있지 않습니다. 해당 문서는 메이플스토리 월드 에디터에서 UI 엔티티와 컴포넌트를 시각적으로 편집하는 절차(인벤토리 및 대화창 프리셋 활용, 엔티티 이름 변경, 특정 UI 요소 삭제, 텍스트 및 스프라이트 값 설정 등)만을 설명하고 있습니다. 따라서 요청하신 "API 이름·매개변수·반환 타입·동기화/서버·클라이언트 제약"을 명시하는 기술적 사실은 원문에 존재하지 않으며, 지어낼 수 없습니다. 원문에 [original] | # 상점 UI 만들기 인벤토리 프리셋을 활용해 상점 UI를 만들어 봅시다. 1. **Preset List - UI - 인벤토리**를 선택해 DefaultGroup에 추가해 배치합니다. 2. 자동으로 inventory_1 UI엔티티에 추가된 UIInventory 컴포넌트를 **제거**합니다. 3. UIItemSlot 컴포넌트를 **삭제**합니다. > **Tip.** > 인벤토리 프리셋을 UI 그룹에 추가하면, UIInventory, UIItemSlot 컴포넌트가 자동으로 생성됩니다. 3. 상점에서 필요하지 [chunk_id] | Guides:1116:0

[task] | diverse_qa [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 질문: `InitializeItemList()` 함수의 실행 공간은 어디인가요? 답변: `InitializeItemList()` 함수는 `[client only]` 실행 공간에서 동작합니다. 질문: `InitializeItemList()` 함수 내에서 아이템 정보를 가져오기 위해 참조하는 데이터 변수는 무엇인가요? 답변: `_Data.ItemTable`과 `_Data.ItemTableRowCount` 변수를 참조합니다. 질문: `shopItemSlots` 테이블에 슬롯을 생성하기 위해 어떤 서비스와 메서드를 사용하나요? 답변: [original] | ```lua [client only] void InitializeItemList() { -- 상품 리스트에 아이템을 인덱스 순서로 배치합니다. local itemTable = _Data.ItemTable local itemCount = _Data.ItemTableRowCount -- 아이템 개수만큼 빈 슬롯 준비 local shopItemSlots = {} for i = 1, itemCount [chunk_id] | Guides:1117:1

[task] | wikipedia [title] | 7. 상점 UI 만들기 [category] | Guides [rephrased] | # 상점 UI 만들기 메이플스토리 월드에서 상점 기능을 구현하기 위해 인벤토리 프리셋을 활용하여 사용자 인터페이스(UI)를 구성할 수 있습니다. 이 과정은 상점의 기본 레이아웃을 설정하고, 구매 및 판매를 위한 팝업 창을 추가하는 단계로 나뉩니다. ## 상점 기본 UI 구성 상점의 기본 UI를 구성하려면 먼저 프리셋 리스트에서 **UI - 인벤토리**를 선택하여 `DefaultGroup`에 추가하고 배치합니다. 인벤토리 프리셋을 UI 그룹에 추가하면 `UIInventory`와 `UIItemSlot` 컴포넌트가 자동으로 생성됩니 [original] | # 상점 UI 만들기 인벤토리 프리셋을 활용해 상점 UI를 만들어 봅시다. 1. **Preset List - UI - 인벤토리**를 선택해 DefaultGroup에 추가해 배치합니다. 2. 자동으로 inventory_1 UI엔티티에 추가된 UIInventory 컴포넌트를 **제거**합니다. 3. UIItemSlot 컴포넌트를 **삭제**합니다. > **Tip.** > 인벤토리 프리셋을 UI 그룹에 추가하면, UIInventory, UIItemSlot 컴포넌트가 자동으로 생성됩니다. 3. 상점에서 필요하지 [chunk_id] | Guides:1116:0

[task] | extract_knowledge [title] | 4. 아이템을 인벤토리에 추가하기 [category] | Guides [rephrased] | # 4. 아이템을 인벤토리에 추가하기 ## 개념 설명 `SimpleInventory` 컴포넌트는 서버에서 아이템의 추가, 제거, 및 메소(Meso) 관리를 담당합니다. 아이템은 `ItemStack` 객체로 표현되며, 특정 슬롯(`slotIndex`)에 저장됩니다. 클라이언트는 서버에서 발생한 인벤토리 상태 변경 사항을 이벤트(`Event`)를 통해 수신하여 로컬 데이터를 동기화합니다. ## API 사용법 ### 1. 아이템 추가 로직 (`AddItem` 관련 로직) 기존 스택에 아이템을 추가하거나, 빈 슬롯에 새로운 스택을 생 [original] | if stack == nil then remain = remain - maxStackCount elseif stack.ItemId == itemId then remain = remain - math.min(maxStackCount - stack.Count, remain) end end return (remain <= 0) } [server only] boolean RemoveItemAt (integer slotIndex, integer itemCount) { if sl [chunk_id] | Guides:1114:11

[task] | extract_knowledge [title] | 8. 상점 로직 만들기Ⅰ [category] | Guides [rephrased] | # 8. 상점 로직 만들기 Ⅰ ## 1. 개념 설명 메이플스토리 월드에서 상점 기능을 구현하기 위해서는 서버 측 로직이 필요합니다. 본 절에서는 `Shop` 로직 컴포넌트를 생성하여, 사용자가 특정 아이템(`itemId`)을 지정된 수량(`itemCount`)만큼 구매할 때 필요한 메소(`Meso`)를 차감하고 인벤토리에 아이템을 추가하는 기본적인 구매 처리 프로세스를 다룹니다. 이 과정은 `_Data` 서비스를 통해 아이템 정보를 조회하고, `_UserService`를 통해 해당 사용자의 인벤토리 상태를 확인 및 수정하는 방식 [original] | # 상점 로직 작성 1. **Workspace - MyDesk - Create Scripts - Create Logic**을 선택해 새로운 `Shop` 로직을 생성합니다. 2. `Buy()`함수를 생성해 itemId에 해당하는 상품을 itemCount만큼 구매하고, 메소를 차감하도록 작성합니다. ```lua Method: [server] void Buy (string itemId, integer itemCount) { -- itemId에 해당하는 상품을 itemCount만큼 구매 [chunk_id] | Guides:1115:0

[task] | wikipedia [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # UIShop 컴포넌트 구현 가이드 `UIShop` 컴포넌트는 메이플스토리 월드 환경에서 상점 UI를 제어하는 데 사용되는 스크립트 컴포넌트입니다. 이 섹션에서는 `UIShop` 컴포넌트의 생성부터 초기화 로직 설정까지의 과정을 단계별로 설명합니다. ## 1. 컴포넌트 생성 및 배치 먼저 새로운 `UIShop` 컴포넌트를 생성합니다. 이 컴포넌트는 씬 히에라키에서 **ui - DefaultGroup - Shop** 엔티티에 추가되어야 합니다. ## 2. 프로퍼티 정의 `UIShop` 컴포넌트에는 상점 UI 요소를 참조하기 [original] | # UIShop 1. 새로운 `UIShop` 컴포넌트를 생성합니다. **ui - DefaultGroup - Shop**에 컴포넌트를 추가합니다. 1. 새로운 **itemUI, scrollView, ShopBtnPath, SyncTable** 프로퍼티를 추가합니다. ```lua Property: [None] Entity itemUI = nil [None] Entity scrollView = nil [None] string ShopBtnPath = "/ui/DefaultG [chunk_id] | Guides:1117:0

[task] | diverse_qa [title] | 7. 상점 UI 만들기 [category] | Guides [rephrased] | 질문: 상점 UI를 만들기 위해 인벤토리 프리셋을 추가한 후, `inventory_1` UI 엔티티에 자동으로 추가된 `UIInventory` 컴포넌트는 어떻게 처리해야 하나요? 답변: `UIInventory` 컴포넌트를 제거해야 합니다. 질문: 인벤토리 프리셋을 UI 그룹에 추가하면 어떤 컴포넌트들이 자동으로 생성되나요? 답변: `UIInventory`와 `UIItemSlot` 컴포넌트가 자동으로 생성됩니다. 질문: 상점 UI에서 메소(Coin) 표시와 관련된 `CoinPanel` UI 엔티티와 그 하위 엔티티들은 어떻게 처리 [original] | # 상점 UI 만들기 인벤토리 프리셋을 활용해 상점 UI를 만들어 봅시다. 1. **Preset List - UI - 인벤토리**를 선택해 DefaultGroup에 추가해 배치합니다. 2. 자동으로 inventory_1 UI엔티티에 추가된 UIInventory 컴포넌트를 **제거**합니다. 3. UIItemSlot 컴포넌트를 **삭제**합니다. > **Tip.** > 인벤토리 프리셋을 UI 그룹에 추가하면, UIInventory, UIItemSlot 컴포넌트가 자동으로 생성됩니다. 3. 상점에서 필요하지 [chunk_id] | Guides:1116:0

[task] | knowledge_list [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 제시된 문서 내용(`UIShopItemSlot` 및 `UIBuyPopup` 관련 부분)에 기반하여 추출한 핵심 사실 목록입니다. ```lua -- 참고: 아래 목록은 문서에 명시된 정보만 기반으로 작성되었습니다. -- 1. 컴포넌트 생성 및 배치 1. `UIShopItemSlot` 컴포넌트를 생성하여 `ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot` 경로에 추가해야 합니다. -- 2. 프로퍼티 정의 2. `UIShopItemSlot`에 `[None]` 동 [original] | # UIShopItemSlot 1. UIShopItemSlot 컴포넌트를 생성하고, **ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot**에 추가합니다. 2. **ItemId** 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 3. `SetData()` 함수를 생성하고, **itemId, itemPrice** 매개변수를 추가합니다. UI에서 데이터 값이 보이도록 [chunk_id] | Guides:1117:2

[task] | diverse_qa [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 질문: `UIShop` 컴포넌트를 생성할 때, 이 컴포넌트를 어떤 경로에 추가해야 하나요? 답변: **ui - DefaultGroup - Shop** 경로에 컴포넌트를 추가해야 합니다. 질문: `UIShop` 컴포넌트에서 선언된 `ShopBtnPath` 프로퍼티의 기본 값은 무엇인가요? 답변: `ShopBtnPath` 프로퍼티의 기본 값은 `"/ui/DefaultGroup/RPGButtons/btn_shop"` 입니다. 질문: `UIShop` 컴포넌트의 `SlotItems` 프로퍼티는 어떤 데이터 타입을 사용하나요? 답변: `S [original] | # UIShop 1. 새로운 `UIShop` 컴포넌트를 생성합니다. **ui - DefaultGroup - Shop**에 컴포넌트를 추가합니다. 1. 새로운 **itemUI, scrollView, ShopBtnPath, SyncTable** 프로퍼티를 추가합니다. ```lua Property: [None] Entity itemUI = nil [None] Entity scrollView = nil [None] string ShopBtnPath = "/ui/DefaultG [chunk_id] | Guides:1117:0

[task] | distill [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | ### 상점 로직 만들기 II: 구매 처리 **이벤트 핸들러** `[entity: btn_accept(/ui/DefaultGroup/Shop/BuyPopup/btn_accept)]`에서 `HandleButtonClickEvent`를 구현합니다. **동작 규칙** 1. `event.Entity`를 통해 이벤트 발생 엔티티를 참조합니다. 2. `self.Entity`의 자식 중 `"input_count"` 이름을 가진 엔티티를 검색합니다. 3. 해당 엔티티의 `TextInputComponent.Text`를 `tonumber`로 변환 [original] | ```lua Event Handler: [entity: btn_accept(/ui/DefaultGroup/Shop/BuyPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------- [chunk_id] | Guides:1117:4

[task] | extract_knowledge [title] | 8. 상점 로직 만들기Ⅰ [category] | Guides [rephrased] | # 8. 상점 로직 만들기 Ⅰ: 판매(Sell) 기능 구현 ## 1. 개념 설명 상점 시스템의 판매(Sell) 로직은 플레이어가 인벤토리에 보유하고 있는 아이템을 지정된 수량만큼 제거하고, 그 대가로 메소(Meso)를 지급하는 과정입니다. 이 문서에서는 `Sell()` 함수를 통해 다음과 같은 규칙을 적용합니다: * **입력**: 판매할 인벤토리 슬롯 인덱스(`inventorySlotIndex`)와 판매 수량(`itemCount`). * **가격 정책**: 판매 가격은 해당 아이템의 **구매 가격의 절반**으로 결정됩니 [original] | 3. `Sell()` 함수를 추가하고 매개변수 **inventorySlotIndex, itemCount**를 추가합니다. inventorySlotIndex에 있는 인벤토리 아이템을 itemCount만큼 판매하고 메소를 획득하도록 작성합니다. 이때 판매 가격은 구매 가격의 절반이 되도록 함께 작성합니다. ```lua [server] void Sell (integer inventorySlotIndex integer itemCount) { -- inventorySlotIndex에 있는 인벤토리 [chunk_id] | Guides:1115:1

← → 방향키로 페이지 이동 · 숫자 입력 후 Enter로 점프