월드 워프하기

# 학습 과정 소개

TeleportService의 함수를 활용해 월드에서 다른 월드로 이동할 수 있습니다.

# 다른 월드로 이동하기

TeleportService는 월드의 유저를 특정 장소로 이동시킬 때 사용할 수 있을 뿐 아니라, 접속 중인 월드에서 다른 월드로 이동시킬 수 있습니다. 접속 중인 월드와 이동할 월드가 공개 출시된 상태여야 이동이 가능합니다. 이 특성으로 인해 제작 중에는 워프를 테스트할 수 없습니다.

[{"현재 월드":"공개","이동할 월드":"공개","워프 여부":"◯"},{"현재 월드":"비공개","이동할 월드":"공개","워프 여부":"◯"},{"현재 월드":"공개","이동할 월드":"비공개","워프 여부":"X"},{"현재 월드":"비공개","이동할 월드":"비공개","워프 여부":"X"}]

  
유저를 다른 월드로 이동시킬 때는 `WarpUserToWorldAndWait()` 및 `WarpUserToWorldAsync()` 함수를 활용하며 이동시킬 유저 ID, 이동할 월드 ID 두 가지가 필요합니다. 다른 월드로 워프할 때 현재 머물던 월드에서 유저가 쌓은 데이터를 이동할 월드에서도 사용하고 싶다면 `WarpUserToWorldAndWait()`를 활용해 유저가 이동할 때 데이터를 함께 전달하고, GetWarpRecord()로 데이터에 접근하고 얻어올 수 있습니다. 자세한 내용은 [TeleportService](/apiReference?postId=315)를 참고하세요.  


> Tip. 크리에이터가 만든 월드가 아니더라도, 출시된 모든 월드로 워프할 수 있습니다.

# World ID 확인하기

WorldID는 메이플스토리 월드 공식 홈페이지에서 월드 정보 페이지의 URL로 확인할 수 있습니다. URL 끝의 번호가 월드 ID로써 활용할 수 있습니다.

  * https://maplestoryworlds.nexon.com/play/번호



[png](16751471942527842b0f88f594139ad4488f2bce289e0)

# 활용 예제

#### 워프시키기

유저가 포탈을 타고 다른 월드로 이동할 수 있게 만들어 봅시다.

[gif](1657775410700475de8c715464f52919606dd284b6f7e)

  1. 새로운 [png](Ect) Warp 컴포넌트를 생성하고, 포탈에 추가합니다.

  2. 프로퍼티에 WorldId를 추가하고, 월드 ID를 프로퍼티 에디터 창에서 입력합니다.  
[png](16577946836778dbd808244d6421e99a67c482d4aa1b8)

  3. 아래와 같이 포탈 이벤트가 발생할 때 지정한 월드로 이동할 수 있게 작성합니다.
         
         @Component
         script PortalWorldWarp extends Component
         @Sync
         property string WorldId = ""
         
         @ExecSpace("ServerOnly")
         method void Warp(string userId)
         local warpDataTable = {}
         warpDataTable.userId = userId
         
         local serializedData = _UtilLogic:TableToString(warpDataTable)
         
         _TeleportService:WarpUserToWorldAndWait(userId, self.WorldId, serializedData)
         end
         
         @EventSender("Self")
         handler HandlePortalUseEvent(PortalUseEvent event)
         --------------- Native Event Sender Info ----------------
         -- Sender: PortalComponent
         -- Space: Client
         ---------------------------------------------------------
         
         -- Parameters
         local PortalUser = event.PortalUser
         ---------------------------------------------------------
         
         self:Warp(PortalUser.Name)
         end
         end
         



    
    
    #### 워프로 월드에 입장했는지 확인하기
    이동한 월드에서 입장한 유저가 워프로 입장한 것인지 `GetWarpRecord()`를 활용해 확인할 수 있습니다. 
    
    1. 새로운 스크립트 컴포넌트를 생성하고,  Common에 추가합니다.
    2. 월드에 입장한 유저가 워프로 입장했는지 확인할 수 있도록 아래와 같이 작성합니다.
        ```lua
    @Component
    script WarpEntryHandler extends Component
        @ExecSpace("ServerOnly")
        @EventSender("Service", "UserService")
        handler HandleUserEnterEvent(UserEnterEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: UserService
        -- Space: Server
        ---------------------------------------------------------
    
        -- Parameters
        -- local ProfileCode = event.ProfileCode
        local UserId = event.UserId
        ---------------------------------------------------------
    
        local warpRecord = _TeleportService:GetWarpRecord(UserId)
    
        -- 일반적인 월드 입장이라면, GetWarpRecord() 함수는 nil을 반환합니다.
        if warpRecord == nil then 
            return
        end
        end
    end
    

#### 워프해 온 월드 확인하기

`GetWarpRecord()`를 활용해 워프로 이동한 유저가 어떤 월드에서 온 것인지 확인할 수 있습니다.

  1. 새로운 스크립트 컴포넌트를 생성하고,  Common에 추가합니다.
  2. 워프로 이동한 유저가 어떤 월드로부터 왔는지 확인할 수 있도록 아래와 같이 작성합니다. 
         
         @Component
         script UserWarpDataLoader extends Component
         @ExecSpace("ServerOnly")
         @EventSender("Service", "UserService")
         handler HandleUserEnterEvent(UserEnterEvent event)
         --------------- Native Event Sender Info ----------------
         -- Sender: UserService
         -- Space: Server
         ---------------------------------------------------------
         
         -- Parameters
         -- local ProfileCode = event.ProfileCode
         local UserId = event.UserId
         ---------------------------------------------------------
         
         local warpRecord = _TeleportService:GetWarpRecord(UserId)
         if warpRecord == nil then
             return
         end
         
         local currentWorldId = warpRecord.CurrentWorldId
         local prevWorldId = warpRecord.PreviousWorldId -- 이전 월드를 확인할 수 있습니다.
         end
         end
         



    
    
    #### 다른 월드에 데이터 전달하기
    유저의 데이터를 이동할 월드로 전달할 수 있습니다.
    
    1. 새로운 스크립트 컴포넌트를 생성합니다.
    2. 맵에 포탈을 추가한 뒤, 만든 스크립트 컴포넌트를 포탈에 추가합니다.
    3. 아래와 같이 `WarpUserToWorldAndWait()`와 `UtilLogic`을 활용해 다른 월드에 데이터를 전달할 수 있게 작성합니다. 
        ```lua
    @Component
    script PortalWarper extends Component
        @Sync
        property string WorldId = ""
    
        @ExecSpace("ServerOnly")
        method void Warp(string userId)
        local warpDataTable = {}
        warpDataTable.testData = "test"
    
        local warpData= _UtilLogic:TableToString(warpDataTable)
    
        _TeleportService:WarpUserToWorldAndWait(userId, self.WorldId, warpData)
        end
    
        @EventSender("Self")
        handler HandlePortalUseEvent(PortalUseEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: PortalComponent
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local PortalUser = event.PortalUser
        ---------------------------------------------------------
    
        self:Warp(PortalUser.Name)
        end
    end
    

#### 이전 월드에서 전달한 데이터 얻어오기

이전 월드에서 전달한 값을 받을 수 있습니다.

  1. 새로운 스크립트 컴포넌트를 생성하고,  Common에 추가합니다

  2. 아래와 같이 `WarpUserToWorldAndWait()`와 `UtilLogic`을 활용해 작성합니다.
         
         @Component
         script UserWarpDataHandler extends Component
         @ExecSpace("ServerOnly")
         @EventSender("Service", "UserService")
         handler HandleUserEnterEvent(UserEnterEvent event)
         --------------- Native Event Sender Info ----------------
         -- Sender: UserService
         -- Space: Server
         ---------------------------------------------------------
         
         -- Parameters
         -- local ProfileCode = event.ProfileCode
         local UserId = event.UserId
         ---------------------------------------------------------
         
         local warpRecord = _TeleportService:GetWarpRecord(UserId)
         if warpRecord == nil then
             return
         end
         
         local warpDataTable = _UtilLogic:StringToTable(warpRecord.Data)
         log(warpDataTable.testData)
         end
         end
         



    
    
    
    ##### 참고 가이드
    * [텔레포트](/docs/?postId=59)