← 목록

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

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

[task] | knowledge_list [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | 제시된 원문은 코드 조각의 일부(이벤트 핸들러)와 제작 가이드의 절차 설명(2~3단계)만 포함하고 있으며, `NpcComponent`의 생성 API, 대화 열기/닫기 메서드(`OnRequestOpenDialog`)의 정확한 시그니처, `CollisionGroups` 상수 정의, 또는 골드 교환 로직의 구체적 구현 코드가 원문에 명시되어 있지 않습니다. 따라서 **원문에 명확히 기술된 사실**만을 기반으로, 해당 코드 블록에서 드러나는 API 사용 패턴과 제약 사항을 추출하여 정리합니다. (원문에 없는 API 명세나 로직은 추측하지 [original] | --------------------------------- log('triggerLeave') -- Parameters local TriggerBodyEntity = event.TriggerBodyEntity --------------------------------------------------------- if self.triggerNpcEntity == TriggerBodyEntity then self.triggerNpcEntity [chunk_id] | Guides:1084:2

[task] | knowledge_list [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | 제시된 문서에 기반하여 추출한 핵심 사실 목록은 다음과 같습니다. 1. 서버 함수에서 로컬 Client가 아닌 다른 Client에서 요청이 오지 않았는지 검증하기 위해, 패킷을 보낸 `senderUserId`가 현재 엔티티의 `self.Entity.PlayerComponent.UserId`와 일치하는지 비교해야 하며, 일치하지 않을 경우 로깅 후 함수를 종료해야 합니다. 2. 로컬 Client 검증의 대안으로 WorldConfig의 `PlayerEntityAuthority` 설정을 활용할 수 있습니다. 3. 비정상적인 반복 요청을 [original] | #### 서버 함수 검증 요소 알아보기 열쇠 아이템을 소지한 플레이어가 열쇠를 메소로 교환해주는 NPC와 상호 작용할 때의 서버 검증 예시를 살펴봅시다. 플레이어가 NPC에게 열쇠를 1000메소로 교환할 때 확인해야 할 서버 검증 요소는 4가지입니다. 1. **로컬 Client가 아닌 다른 Client에서 요청을 보내지는 않았는지 검증합니다.** 검증할 수 있는 방법은 두 가지 입니다. 첫 번째는 [WorldConfig](/docs/?postId=1101)의 **PlayerEntityAuthority**를 활용해 대비합니다. 두 [chunk_id] | Guides:1084:4

[task] | extract_knowledge [title] | Tables [category] | Guides [rephrased] | # 광부 시뮬레이터 리메이크: 광맥 데이터셋(Tables) 구성 가이드 본 절에서는 메이플스토리 월드의 '광부 시뮬레이터 리메이크' 월드에서 사용되는 광맥 정보 데이터셋(Tables)의 구조와 필드 정의에 대해 설명합니다. 해당 데이터셋은 광맥의 레벨별 특성, 체력, 보너스 게임 발생 확률 및 보상 확률 등을 관리하는 데 사용됩니다. 기본 제공 데이터는 레벨 3까지의 광맥 정보를 포함하며, 더 높은 레벨의 광맥을 추가할 경우 데이터셋에 새로운 행을 직접 입력하여 확장할 수 있습니다. ## 1. 데이터셋 필드 정의 광맥 데이터셋 [original] | 광맥 정보를 담은 데이터셋입니다. 광부 시뮬레이터 리메이크 월드에는 레벨 3까지의 광맥 데이터가 기입되어 있습니다. 더 높은 레벨의 광백이 필요한 경우 행을 추가해 데이터를 입력합니다. | 이름 | 설명 | | --- | --- | |Level | 광맥의 레벨입니다. | | HP | 광맥의 최대 체력입니다. 반드시 **숫자**만 입력해야 합니다. | | BonusGameChance | 광맥을 캘 때 보너스 게임이 등장하는 확률입니다. 반드시 **실수**로만 입력해야 합니다. 예) 0.1 | | Bonus_JewerlyChanc [chunk_id] | Guides:1083:2

[task] | wikipedia [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 검증: NPC 상호작용 및 보안 최적화 본 섹션은 메이플스토리 월드 스크립트 언어(mLua)에서 NPC와 플레이어의 상호작용을 구현하는 과정을 통해, 클라이언트 입력을 서버가 검증하여 처리하는 보안 및 최적화 패턴을 설명합니다. 이 예제는 NPC의 트리거 범위에 플레이어가 진입했을 때 `E` 키를 누르면 UI가 열리고, `ESC` 키를 누르면 UI가 닫히도록 구성됩니다. ## 구현 절차 구현을 위해 먼저 새로운 `MyPlayerComponent`를 생성하고 이를 `DefaultPlayer` 엔티티에 추가해야 합니다. [original] | NPC와 플레이어가 상호작용할 수 있게 만들어봅시다. NPC의 trigger 범위에 플레이어가 있을 때 `E` 키를 누르면 UI가 열리고, `ESC` 키를 누르면 UI가 닫히도록 만듭니다. 1. 새로운 **MyPlayerComponent**를 생성하고, **DefaultPlayer**에 추가합니다. 2. **MyPlayerComponent**에 아래와 같이 작성합니다. ```lua Property: [None] Entity triggerNpcEntity = nil [Sync] numb [chunk_id] | Guides:1084:1

[task] | distill [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 검증: ExchangeKeyToGold 클라이언트 요청을 그대로 신뢰하지 말고, 서버 측에서 자산 변경 로직을 수행해야 합니다. ```lua [server only] void ExchangeKeyToGold(number keyQuantity) { self.key = self.key - keyQuantity self.gold = self.gold + keyQuantity * 1000 self.lastExchangeTime = DateTime.UtcNow.Elapsed } ``` * **실행 공간 [original] | ```lua [server only] void ExchangeKeyToGold(number keyQuantity) { self.key = self.key - keyQuantity self.gold = self.gold + keyQuantity * 1000 self.lastExchangeTime = DateTime.UtcNow.Elapsed } ``` [chunk_id] | Guides:1084:6

[task] | distill [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | ### 서버 검증 예시: 열쇠-메소 교환 NPC 열쇠 아이템을 메소로 교환하는 시나리오에서, 서버는 다음 4가지 요소를 반드시 검증해야 합니다. #### 1. 요청 발신자 정합성 검증 로컬 클라이언트가 아닌 제3의 클라이언트에서 요청이 오지 않았는지 확인합니다. * **방법**: `senderUserId`와 `self.Entity.PlayerComponent.UserId`가 일치하는지 비교합니다. ```lua -- 로컬 Client가 아닌 다른 Client에서 요청이 오지 않았는지 검증 if senderUserId ~= s [original] | #### 서버 함수 검증 요소 알아보기 열쇠 아이템을 소지한 플레이어가 열쇠를 메소로 교환해주는 NPC와 상호 작용할 때의 서버 검증 예시를 살펴봅시다. 플레이어가 NPC에게 열쇠를 1000메소로 교환할 때 확인해야 할 서버 검증 요소는 4가지입니다. 1. **로컬 Client가 아닌 다른 Client에서 요청을 보내지는 않았는지 검증합니다.** 검증할 수 있는 방법은 두 가지 입니다. 첫 번째는 [WorldConfig](/docs/?postId=1101)의 **PlayerEntityAuthority**를 활용해 대비합니다. 두 [chunk_id] | Guides:1084:4

[task] | knowledge_list [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | 제공된 문서 원문에 포함된 정보만으로 핵심 사실을 추출하여 정리한 목록입니다. 1. `ExchangeKeyToGold` 메서드는 `[server only]` 실행 공간 제약이 적용되어 서버에서만 실행됩니다. 2. `ExchangeKeyToGold` 메서드는 `number` 타입의 매개변수 `keyQuantity`를 하나만 받습니다. 3. `ExchangeKeyToGold` 메서드는 반환 타입이 `void`입니다. 4. 메서드 실행 시 `self.key` 프로퍼티 값에서 매개변수 `keyQuantity`의 값을 차감합니다. 5. 메 [original] | ```lua [server only] void ExchangeKeyToGold(number keyQuantity) { self.key = self.key - keyQuantity self.gold = self.gold + keyQuantity * 1000 self.lastExchangeTime = DateTime.UtcNow.Elapsed } ``` [chunk_id] | Guides:1084:6

[task] | diverse_qa [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | 질문: 위 코드에서 `DialogEntity` 프로퍼티의 동기화(Sync) 상태는 무엇인가요? 답변: `DialogEntity` 프로퍼티는 `[None]` 속성이 지정되어 있어 동기화되지 않습니다. 질문: `OnRequestOpenDialog` 메서드의 실행 공간은 어디인가요? 답변: `OnRequestOpenDialog` 메서드는 `[client]` 실행 공간에서 동작합니다. 질문: `OnRequestOpenDialog` 메서드가 수행하는 주요 기능은 무엇인가요? 답변: 전달받은 `isOpen` boolean 값에 따라 `se [original] | ```lua Property: [None] Entity DialogEntity = ui/DefaultGroup/DialogBackground [None] TextInputComponent QuantityInput = ui/DefaultGroup/DialogBackground/Dialog/Count Method: [client] void OnRequestOpenDialog (boolean isOpen) { self.DialogEntity.Enabl [chunk_id] | Guides:1084:3

[task] | wikipedia [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | ### [Guides] 기본 제작 가이드 > 보안 및 최적화 예시로 알아보는 서버 검증 메이플스토리 월드의 mLua 스크립트 환경에서는 클라이언트와 서버 간의 신뢰성 문제를 방지하기 위해 중요한 비즈니스 로직을 반드시 서버 측에서 처리해야 합니다. 클라이언트는 사용자가 조작할 수 있으므로, 아이템의 소모 또는 화폐의 지급과 같은 핵심 상태 변경 로직을 클라이언트에서 실행하면 악용될 위험이 있습니다. 따라서 이러한 검증 및 처리 로직은 `[server only]` 실행 공간에 배치하여 서버가 직접 상태를 변경하도록 설계하는 것이 표 [original] | ```lua [server only] void ExchangeKeyToGold(number keyQuantity) { self.key = self.key - keyQuantity self.gold = self.gold + keyQuantity * 1000 self.lastExchangeTime = DateTime.UtcNow.Elapsed } ``` [chunk_id] | Guides:1084:6

[task] | extract_knowledge [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 트리거 기반 NPC 상호작용 및 서버 검증 ## 1. 개념 설명 메이플스토리 월드에서 NPC와 플레이어 간의 상호작용(대화 열기, 아이템 교환 등)은 **TriggerComponent**와 **NpcComponent**의 결합을 통해 구현됩니다. * **TriggerComponent**: 물리적 충돌 영역을 감지하여 특정 엔티티가 진입(Enter)하거나 이탈(Leave)하는 이벤트를 발생시킵니다. * **NpcComponent**: NPC 엔티티에 부여되는 컴포넌트로, 대화(Dialog)를 열고 닫거나 NPC 고유 동작 [original] | --------------------------------- log('triggerLeave') -- Parameters local TriggerBodyEntity = event.TriggerBodyEntity --------------------------------------------------------- if self.triggerNpcEntity == TriggerBodyEntity then self.triggerNpcEntity [chunk_id] | Guides:1084:2

[task] | diverse_qa [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | 질문: 열쇠 아이템을 메소로 교환하는 NPC 상호작용 시 서버에서 검증해야 하는 요소는 총 몇 가지이며, 각각 무엇인가요? 답변: 총 4가지입니다. 1) 로컬 Client가 아닌 다른 Client에서 요청을 보내지는 않았는지, 2) 비정상적으로 많은 반복 요청이 있는지, 3) 플레이어 엔티티가 해당 NPC의 트리거가 발동되는 위치에 있는지, 4) 교환 요청 온 열쇠 개수가 플레이어가 가진 열쇠 개수보다 적지 않은지 검증해야 합니다. 질문: 로컬 Client가 아닌 다른 Client에서 요청을 보내지 않았는지 검증하는 방법으로 제시 [original] | #### 서버 함수 검증 요소 알아보기 열쇠 아이템을 소지한 플레이어가 열쇠를 메소로 교환해주는 NPC와 상호 작용할 때의 서버 검증 예시를 살펴봅시다. 플레이어가 NPC에게 열쇠를 1000메소로 교환할 때 확인해야 할 서버 검증 요소는 4가지입니다. 1. **로컬 Client가 아닌 다른 Client에서 요청을 보내지는 않았는지 검증합니다.** 검증할 수 있는 방법은 두 가지 입니다. 첫 번째는 [WorldConfig](/docs/?postId=1101)의 **PlayerEntityAuthority**를 활용해 대비합니다. 두 [chunk_id] | Guides:1084:4

[task] | distill [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | ## 서버 검증 및 최적화: 열쇠-골드 교환 클라이언트 요청을 서버에서 검증하여 부정 사용을 방지하는 패턴입니다. ### 1. 초기화 (`MyPlayerComponent`) 월드 입장 시 인벤토리 초기화. ```lua [server only] void OnBeginPlay() { self.key = 10 self.gold = 0 } ``` ### 2. 요청 검증 (`VerifyExchangeKeyToGold`) 클라이언트에서 호출 가능한 `[server]` 메서드로, 4가지 검증 후 실제 지급 함수를 호출합니다 [original] | 위의 4가지 검증 요소 확인하고, 열쇠를 메소로 교환할 수 있는 서버 함수들을 작성해봅시다. 1. MyPlayerComponent에 `OnBeginPlay()` 함수를 생성합니다. 월드 입장 시 열쇠를 10개를 지급하고, 골드는 0으로 초기화할 수 있도록 아래와 같이 작성합니다. ```lua [server only] void OnBeginPlay() { -- key, gold 값 세팅 self.key = 10 self.gold = 0 } `` [chunk_id] | Guides:1084:5

[task] | extract_knowledge [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # NPC 상호작용 및 서버 검증: 키 입력과 트리거 관리 ## 1. 개념 설명 본 절에서는 플레이어가 NPC와 상호작용하는 메커니즘을 구현하는 방법을 다룹니다. 구현은 두 가지 주요 조건에 기반합니다. 1. **공간적 조건**: 플레이어가 NPC의 `TriggerComponent` 범위에 진입해야 함. 2. **입력 조건**: `E` 키를 누르면 대화 UI가 열리고, `ESC` 키를 누르면 닫힘. 이 과정에서 클라이언트와 서버 간의 상태 동기화(`[Sync]` 프로퍼티)와 로컬 플레이어 식별(`_UserService.Lo [original] | NPC와 플레이어가 상호작용할 수 있게 만들어봅시다. NPC의 trigger 범위에 플레이어가 있을 때 `E` 키를 누르면 UI가 열리고, `ESC` 키를 누르면 UI가 닫히도록 만듭니다. 1. 새로운 **MyPlayerComponent**를 생성하고, **DefaultPlayer**에 추가합니다. 2. **MyPlayerComponent**에 아래와 같이 작성합니다. ```lua Property: [None] Entity triggerNpcEntity = nil [Sync] numb [chunk_id] | Guides:1084:1

[task] | wikipedia [title] | UI Components/Logics [category] | Guides [rephrased] | ## 실행제어 및 이벤트 중계자 본 섹션에서는 UI 컴포넌트와 로직을 연결하기 위해 사용된 이벤트 중계자 및 실행제어 항목들을 설명합니다. 첫 번째 항목은 `InputService` 서비스를 통해 수신하는 `KeyDownEvent`입니다. 이 이벤트는 사용자가 Esc 키를 누르거나 닫기 버튼을 클릭했을 때 발생하며, 해당 동작을 감지하여 현재 표시 중인 UI를 닫는 역할을 수행합니다. 두 번째 항목은 특정 엔티티 경로에 위치한 버튼 객체에 바인딩된 `ButtonClick` 이벤트입니다. 대상 엔티티의 경로는 `/ui/Equip [original] | | 실행제어 | 이벤트 중계자 | 이름 | 설명 | | --- | --- | --- | --- | | - | InputService| KeyDownEvent | Esc 키를 누르거나, 닫기 버튼을 눌러 UI를 닫습니다. | | -| [entity] /ui/EquipmentShopGroup/EquipmentShop /DetailInfoPopup/Panel/Button_Buy | ButtonClick | 상세 정보 팝업에 있는 구매 버튼을 눌렀을 때 실행합니다. `self.FilterIdx`와 `self.ShowingEquipmen [chunk_id] | Guides:1085:1

[task] | distill [title] | UI Components/Logics [category] | Guides [rephrased] | **이벤트 중계자 (Event Handlers)** * **UI 종료** * **소스**: `InputService` * **이벤트**: `KeyDownEvent` * **동작**: `Esc` 키 입력 또는 닫기 버튼 클릭 시 UI를 닫습니다. * **장비 구매** * **소스**: `[entity]` `/ui/EquipmentShopGroup/EquipmentShop/DetailInfoPopup/Panel/Button_Buy` * **이벤트**: `ButtonClic [original] | | 실행제어 | 이벤트 중계자 | 이름 | 설명 | | --- | --- | --- | --- | | - | InputService| KeyDownEvent | Esc 키를 누르거나, 닫기 버튼을 눌러 UI를 닫습니다. | | -| [entity] /ui/EquipmentShopGroup/EquipmentShop /DetailInfoPopup/Panel/Button_Buy | ButtonClick | 상세 정보 팝업에 있는 구매 버튼을 눌렀을 때 실행합니다. `self.FilterIdx`와 `self.ShowingEquipmen [chunk_id] | Guides:1085:1

[task] | wikipedia [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 검증 이 섹션은 메이플스토리 월드(MapleStory Worlds) 스크립트 언어 mLua에서 서버 함수의 보안을 강화하기 위한 검증 로직을 다룹니다. 특히, 열쇠 아이템을 소지한 플레이어가 NPC와 상호 작용하여 해당 열쇠를 메소로 교환하는 시나리오를 예시로 삼아, 서버 측에서 반드시 확인해야 하는 4가지 검증 요소를 제시합니다. ## 1. 요청 출처 검증 첫 번째 검증 요소는 요청이 로컬 클라이언트에서 발생한 것인지, 아니면 다른 클라이언트에서 무단으로 전송된 것인지 확인하는 것입니다. 이를 위해 두 가지 방법을 [original] | #### 서버 함수 검증 요소 알아보기 열쇠 아이템을 소지한 플레이어가 열쇠를 메소로 교환해주는 NPC와 상호 작용할 때의 서버 검증 예시를 살펴봅시다. 플레이어가 NPC에게 열쇠를 1000메소로 교환할 때 확인해야 할 서버 검증 요소는 4가지입니다. 1. **로컬 Client가 아닌 다른 Client에서 요청을 보내지는 않았는지 검증합니다.** 검증할 수 있는 방법은 두 가지 입니다. 첫 번째는 [WorldConfig](/docs/?postId=1101)의 **PlayerEntityAuthority**를 활용해 대비합니다. 두 [chunk_id] | Guides:1084:4

[task] | diverse_qa [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | 질문: 주어진 코드 블록 `ExchangeKeyToGold`의 실행 공간은 어디인가요? 답변: 주어진 코드 블록의 실행 공간은 서버 전용([server only])입니다. 질문: `ExchangeKeyToGold` 메서드가 실행될 때 `self.gold` 값은 어떻게 변경되나요? 답변: `self.gold` 값은 전달된 `keyQuantity` 값에 1000을 곱한 만큼 증가합니다. 질문: `ExchangeKeyToGold` 메서드 내에서 `self.lastExchangeTime` 변수에는 어떤 값이 저장되나요? 답변: `sel [original] | ```lua [server only] void ExchangeKeyToGold(number keyQuantity) { self.key = self.key - keyQuantity self.gold = self.gold + keyQuantity * 1000 self.lastExchangeTime = DateTime.UtcNow.Elapsed } ``` [chunk_id] | Guides:1084:6

[task] | knowledge_list [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | 제시된 원문 문서에 기반하여 `MyPlayerComponent`의 서버 검증 및 메소 교환 로직에 대한 핵심 사실을 정리합니다. ```lua [server only] void OnBeginPlay() { self.key = 10 self.gold = 0 } [server] void VerifyExchangeKeyToGold(number keyQuantity, Entity npcEntity) { if senderUserId ~= self.Entity.PlayerComponent.UserId then [original] | 위의 4가지 검증 요소 확인하고, 열쇠를 메소로 교환할 수 있는 서버 함수들을 작성해봅시다. 1. MyPlayerComponent에 `OnBeginPlay()` 함수를 생성합니다. 월드 입장 시 열쇠를 10개를 지급하고, 골드는 0으로 초기화할 수 있도록 아래와 같이 작성합니다. ```lua [server only] void OnBeginPlay() { -- key, gold 값 세팅 self.key = 10 self.gold = 0 } `` [chunk_id] | Guides:1084:5

[task] | knowledge_list [title] | UI Components/Logics [category] | Guides [rephrased] | * `InputService` 서비스의 `KeyDownEvent` 이벤트 핸들러는 Esc 키 입력 또는 UI 닫기 버튼 클릭 시 해당 UI를 닫는 동작을 수행합니다. * `[entity] /ui/EquipmentShopGroup/EquipmentShop/DetailInfoPopup/Panel/Button_Buy` 엔티티의 `ButtonClick` 이벤트 핸들러는 상세 정보 팝업 내 구매 버튼 클릭 시 실행되며, `self.FilterIdx` 및 `self.ShowingEquipmentLevel` 프로퍼티 값을 기반으로 장비 [original] | | 실행제어 | 이벤트 중계자 | 이름 | 설명 | | --- | --- | --- | --- | | - | InputService| KeyDownEvent | Esc 키를 누르거나, 닫기 버튼을 눌러 UI를 닫습니다. | | -| [entity] /ui/EquipmentShopGroup/EquipmentShop /DetailInfoPopup/Panel/Button_Buy | ButtonClick | 상세 정보 팝업에 있는 구매 버튼을 눌렀을 때 실행합니다. `self.FilterIdx`와 `self.ShowingEquipmen [chunk_id] | Guides:1085:1

[task] | wikipedia [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 측 검증 및 최적화: 열쇠-메소 교환 예제 메이플스토리 월드(MapleStory Worlds)의 mLua 스크립트에서 클라이언트가 보내는 요청을 서버가 안전하게 처리하기 위해서는 여러 보안 검증을 수행해야 합니다. 이 섹션에서는 열쇠(Key)를 메소(Gold)로 교환하는 기능을 구현하면서, 4가지 핵심 검증 요소를 적용하는 방법을 다룹니다. ## 1. 초기 상태 설정: `OnBeginPlay` 플레이어가 월드에 입장할 때 초기 자원을 설정하기 위해 `MyPlayerComponent`에 `OnBeginPlay()` 함수 [original] | 위의 4가지 검증 요소 확인하고, 열쇠를 메소로 교환할 수 있는 서버 함수들을 작성해봅시다. 1. MyPlayerComponent에 `OnBeginPlay()` 함수를 생성합니다. 월드 입장 시 열쇠를 10개를 지급하고, 골드는 0으로 초기화할 수 있도록 아래와 같이 작성합니다. ```lua [server only] void OnBeginPlay() { -- key, gold 값 세팅 self.key = 10 self.gold = 0 } `` [chunk_id] | Guides:1084:5

[task] | extract_knowledge [title] | Tables [category] | Guides [rephrased] | # 광부 시뮬레이터 리메이크 데이터 테이블 구성 ## 1. 개념 설명 광부 시뮬레이터 리메이크 프로젝트는 게임의 콘텐츠(마을, 광산, 광물, 도구)를 데이터 테이블(Data Table)로 관리합니다. 각 테이블은 특정 도메인의 정보를 행(Row) 단위로 저장하며, 새로운 콘텐츠를 추가하기 위해서는 해당 테이블에 새로운 행을 추가해야 합니다. 주요 테이블은 다음과 같습니다: * **MapInfo (맵 정보)**: 마을과 광산의 기본 설정, 권장 채광력, 체력 소모량, 깊이 정보를 관리합니다. * **MineralInfo [original] | 맵 정보에 대한 테이블입니다. 새로운 마을, 광산을 추가하기 위해선 행을 추가해야 합니다. **TownName, MineName** 열에는 **Key** 값을 입력하고, 번역 결과는 LocalizationTable에 입력합니다. | 이름 | 설명 | | --- | --- | |TownName| 마을 이름입니다. **key** 값을 입력해야 합니다.| |MineName| 광산 이름입니다. **key** 값을 입력해야 합니다. | |RecPower_min1| 광산 1층의 최소 권장 채광력입니다. 광산에 필요한 채광력은 광맥의 [chunk_id] | Guides:1083:1

[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] | diverse_qa [title] | UI Components/Logics [category] | Guides [rephrased] | 질문: Esc 키를 누르거나 닫기 버튼을 눌렀을 때 어떤 이벤트가 발생하며, 그 결과로 어떤 동작이 수행됩니까? 답변: `InputService`의 `KeyDownEvent`가 발생하며, 이는 UI를 닫는 동작을 수행합니다. 질문: 상세 정보 팝업의 구매 버튼 클릭 시 실행되는 이벤트의 이름은 무엇입니까? 답변: `ButtonClick` 이벤트입니다. 질문: `self.FilterIdx`와 `self.ShowingEquipmentLevel` 값에 따라 어떤 동작이 시도됩니까? 답변: 장비 구매가 시도됩니다. 질문: 장비 구매를 [original] | | 실행제어 | 이벤트 중계자 | 이름 | 설명 | | --- | --- | --- | --- | | - | InputService| KeyDownEvent | Esc 키를 누르거나, 닫기 버튼을 눌러 UI를 닫습니다. | | -| [entity] /ui/EquipmentShopGroup/EquipmentShop /DetailInfoPopup/Panel/Button_Buy | ButtonClick | 상세 정보 팝업에 있는 구매 버튼을 눌렀을 때 실행합니다. `self.FilterIdx`와 `self.ShowingEquipmen [chunk_id] | Guides:1085:1

[task] | diverse_qa [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | 질문: `OnBeginPlay()` 함수에서 월드 입장 시 열쇠(key)와 골드로(gold) 각각 몇 개를 초기화합니까? 답변: 월드 입장 시 열쇠(key)는 10개, 골드(gold)는 0으로 초기화합니다. 질문: `VerifyExchangeKeyToGold()` 함수의 실행 제어(Execution Space)는 어떻게 설정해야 합니까? 답변: `VerifyExchangeKeyToGold()` 함수의 실행 제어는 **server**로 설정해야 합니다. 질문: `ExchangeKeyToGold()` 함수의 실행 제어는 어떻게 설정 [original] | 위의 4가지 검증 요소 확인하고, 열쇠를 메소로 교환할 수 있는 서버 함수들을 작성해봅시다. 1. MyPlayerComponent에 `OnBeginPlay()` 함수를 생성합니다. 월드 입장 시 열쇠를 10개를 지급하고, 골드는 0으로 초기화할 수 있도록 아래와 같이 작성합니다. ```lua [server only] void OnBeginPlay() { -- key, gold 값 세팅 self.key = 10 self.gold = 0 } `` [chunk_id] | Guides:1084:5

[task] | distill [title] | UI Components/Logics [category] | Guides [rephrased] | # ItemToastMessage Logic **동작 규칙** - `MessageTable`, `RUIDTable`, `TimeTable`은 1:1:1로 대응되는 쌍입니다. - 새 메시지 추가 시 **반드시 테이블 맨 앞(index 1)**에 3개 프로퍼티를 동시에 추가해야 합니다. **Property** | 실행제어 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | None | SyncTable < string > | MessageTable | 표시할 메시지 텍스트 | | None | SyncTa [original] | # ItemToastMessage Logic **아이템 ?개 획득**과 같은 토스트 메시지를 띄우는 로직입니다. UI 엔티티를 배치한 상태로 사용하기 위해 SyncTable을 활용해 관리합니다. `{MessageTable, RUIDTable, TimeTable}`이 한 쌍이며, 새로운 메시지를 추가할 때 반드시 3개를 한 쌍으로 추가해야 합니다. 또한 새로운 메시지는 반드시 테이블 맨 앞에 추가해야 합니다. #### Property | 실행제어 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | N [chunk_id] | Guides:1085:0

[task] | wikipedia [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 검증: 보안 및 최적화 예시 메이플스토리 월드(mLua) 스크립트에서 클라이언트와 서버 간의 데이터 교환을 처리할 때, 클라이언트에서 직접 아이템이나 재화의 증감을 수행하는 것은 보안상 위험하며, 네트워크 지연이나 클라이언트 조작으로 인한 불일치가 발생할 수 있습니다. 이를 방지하기 위해 클라이언트는 사용자의 입력 값만 서버로 전달하고, 실제 검증 및 처리 로직은 서버에서 수행하는 패턴을 사용해야 합니다. 본 섹션에서는 'ExchangeButton'이라는 버튼 컴포넌트를 통해 'ExchangeKeyToGold'라는 서버 [original] | ```lua Property: [None] Entity DialogEntity = ui/DefaultGroup/DialogBackground [None] TextInputComponent QuantityInput = ui/DefaultGroup/DialogBackground/Dialog/Count Method: [client] void OnRequestOpenDialog (boolean isOpen) { self.DialogEntity.Enabl [chunk_id] | Guides:1084:3

[task] | extract_knowledge [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 검증과 데이터 무결성 보장 ## 개념 설명 클라이언트(사용자)에서 전송된 값은 신뢰할 수 있는 출처가 아닙니다. 클라이언트는 네트워크 패킷을 수정하거나 스크립트를 역공학하여 임의의 값을 서버에 전달할 수 있습니다. 따라서 자원(골드, 아이템 등)의 생성 또는 소모가 발생하는 로직은 반드시 `[server only]` 환경에서 실행되어야 하며, 클라이언트가 전달한 수량을 그대로 적용하기 전에 서버 측의 상태와 일관성을 검증하는 과정이 필요합니다. ## API 사용법 서버 측 로직을 구현하기 위해 다음 요소들을 활용합니다. [original] | ```lua [server only] void ExchangeKeyToGold(number keyQuantity) { self.key = self.key - keyQuantity self.gold = self.gold + keyQuantity * 1000 self.lastExchangeTime = DateTime.UtcNow.Elapsed } ``` [chunk_id] | Guides:1084:6

[task] | extract_knowledge [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 검증 및 클라이언트 쿨타임 처리 본 절에서는 클라이언트에서 발생하는 사용자 입력을 서버로 전달하기 전에 기본적인 유효성 검사(쿨타임)를 수행하는 방법을 다룹니다. 이는 서버 부하를 줄이고, 비정상적인 요청 빈도를 방지하기 위한 표준적인 패턴입니다. ## 1. 개념 설명 mLua 스크립트 환경에서는 클라이언트(`[client]`)에서 이벤트를 수신하여 서버 로직을 호출할 때, 로컬 상태(`MyPlayerComponent` 등)를 활용하여 요청 간격을 제한할 수 있습니다. * **클라이언트 측 쿨타임**: `Date [original] | ```lua Property: [None] Entity DialogEntity = ui/DefaultGroup/DialogBackground [None] TextInputComponent QuantityInput = ui/DefaultGroup/DialogBackground/Dialog/Count Method: [client] void OnRequestOpenDialog (boolean isOpen) { self.DialogEntity.Enabl [chunk_id] | Guides:1084:3

[task] | extract_knowledge [title] | 예시로 알아보는 서버 검증 [category] | Guides [rephrased] | # 서버 검증: 클라이언트 요청 신뢰성 확보 ## 개념 설명 멀티플레이어 환경에서 클라이언트는 조작 가능한 영역이므로, 클라이언트가 서버에 보낸 모든 요청은 잠재적으로 위조되거나 변조되었을 수 있습니다. 따라서 서버 측 함수에서는 클라이언트의 입력을 맹목적으로 신뢰하지 않고, 요청의 출처, 빈도, 물리적 위치, 그리고 자원 보유 상태에 대한 독립적인 검증을 수행해야 합니다. 이 절에서는 플레이어가 NPC와 상호작용하여 아이템(열쇠)을 메소로 교환하는 시나리오를 기준으로, 서버에서 수행해야 할 4가지 핵심 검증 로직을 다룹니다. [original] | #### 서버 함수 검증 요소 알아보기 열쇠 아이템을 소지한 플레이어가 열쇠를 메소로 교환해주는 NPC와 상호 작용할 때의 서버 검증 예시를 살펴봅시다. 플레이어가 NPC에게 열쇠를 1000메소로 교환할 때 확인해야 할 서버 검증 요소는 4가지입니다. 1. **로컬 Client가 아닌 다른 Client에서 요청을 보내지는 않았는지 검증합니다.** 검증할 수 있는 방법은 두 가지 입니다. 첫 번째는 [WorldConfig](/docs/?postId=1101)의 **PlayerEntityAuthority**를 활용해 대비합니다. 두 [chunk_id] | Guides:1084:4

[task] | distill [title] | UI Components/Logics [category] | Guides [rephrased] | # UI_EquipmentShop_FilterButton 장비 상점 UI의 장비 타입 필터 버튼 컴포넌트입니다. **Event Handler** - `[self] HandleButtonClickEvent(ButtonClickEvent event)`: 버튼 클릭 시 `UI_EquipmentShop`의 `FilterIdx`를 변경하고 `RefreshUI()`를 실행합니다. # UI_EquipmentShop_SlotButton 장비 상점 UI 내 상품 목록 버튼 컴포넌트입니다. **Event Handler** - `[self] [original] | # UI_EquipmentShop_FilterButton 장비 상점 UI의 **장비 타입 필터** 버튼에 붙어있는 컴포넌트입니다. #### Entity Event Handler | 실행제어 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | - | self | ButtonClickEvent | 버튼을 누르면 UI_EquipmentShop의 `FilterIdx`를 변경하고, `RefreshUI()`를 실행합니다. | # UI_EquipmentShop_SlotButton 장비 상점 UI 내 상품 [chunk_id] | Guides:1085:2

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