해당 분류 : 자바에 대한 이야기    플레이어 이동은 어떻게 하는거야!    글을 기록한 날 : 2011/05/03 01:49

그렇게 이동을 하는것이구나!
라고 하는 말이 나오기를 기대하면서 teleportTo라는 메소드에 대해서 설명하겠습니다.
일반적으로 명령어 //텔레포트 또는 텔, 이동 이라는 것으로 많이 접하셨을텐데요.
이 명령어 내용을 살펴보면
TeleportService.teleportTo(admin, WorldMapType.POETA.getId(),
 806, 1242, 119, 0);
위와같이 텔레포트 서비스에 있는 메소드를 사용하여 플레이어를 이동시키게 됩니다.

TeleportService.teleportTo(플레이어, 맵번호, X좌표, Y좌표, Z좌표, 지연시간)
한글로 풀어쓰자면 위와 같은 구조입니다.

이 teleportTo라는 메소드는 총 3단계로 구성되어 있습니다.
위에서 본 구조로 이루어진 메소드가 인스턴스ID가 빠진 1단계 메소드
그 다음이 헤딩(바라보고있는 방향)이 빠진 2단계 메소드
그 모든것을 다 포함한 최종 3단계 메소드입니다.

1단계 메소드로는 인스턴스 던전에 들어가 있는 유저 옆으로는 갈 수가 없습니다.
해당 인던은 다른 인스턴스번호가 있기때문이죠.
그럴때는 2단계 메소드를 사용해서 인스턴스번호를 동일하게 맞춰주어야 하고,
만약에 도착지점에서 바라보는 방향까지 맞출려면 3단계 메소드를 사용하는 것 입니다.

자 그럼 실제 이동을 시작하는 3단계 최종 메소드 구조를 살펴보겠습니다.
소스에 직접 주석처리를 해서 설명해드리고 마치도록 하겠습니다.

  public static boolean teleportTo(final Player player, final int worldId, final int instanceId, final float x,
    final float y, final float z, final byte heading, final int delay)
  {/* 역시 이 3단계 메소드에는 플레이어,맵번호,인스턴스번호,X,Y,Z좌표,방향,지연시간까지
     필요한 정보가 모두 인수로 들어가있습니다. */
    boolean arena = ArenaService.getInstance().isInArena(player);
    boolean dead = player.getLifeStats().isAlreadyDead();
    if(!arena)
    { /* 결투장에 있는지 확인하고 */
      if(dead || !player.isSpawned())
        return false; /* 죽었거나, 플레이어가 월드에 존재하지 않으면 이동 불가 값을 반환합니다.*/
    }

    if(DuelService.getInstance().isDueling(player.getObjectId()))
    { /* 플레이어간 결투중인지 확인하고 */
      if(arena) /* 결투장이면 결투장에서 패배한것으로 처리하고 */
        DuelService.getInstance().loseArenaDuel(player);
      else /* 플레이어간 결투이면 결투에서 패배한것으로 처리합니다. */
        DuelService.getInstance().loseDuel(player);
    }

    if(player.getToyPet() != null) /* 펫을 소유하고 있다면 펫을 소환해제 합니다.*/
      ToyPetService.getInstance().dismissPet(player, player.getToyPet().getPetId());

    if(delay == 0)
    { /* 이동 지연시간이 0이면 */
      changePosition(player, worldId, instanceId, x, y, z, heading); /* 바로 위치를 바꾸고 */
      if(arena && dead)
        player.getReviveController().skillRevive(); /* 결투장에서 죽었다면 부활시킵니다. */
      return true; /* 이동을 성공적으로 완료했음을 알립니다. 메소드 종료.*/
    }

    PacketSendUtility.sendPacket(player, new SM_ITEM_USAGE_ANIMATION(player.getObjectId(), 0, 0, delay, 0, 0));
    /* 이동 지연시간에 따른 캐스팅바를 표시합니다. */
    ThreadPoolManager.getInstance().schedule(new Runnable(){
      @Override
      public void run()
      { /* 정상적으로 지연시간만큼 지났다면 */
        if(player.getLifeStats().isAlreadyDead() || !player.isSpawned())
          return; /* 플레이어가 죽었거나 월드에 존재하지 않는지 확인하고 */

        PacketSendUtility.sendPacket(player, new SM_ITEM_USAGE_ANIMATION(0, 0, 0, 0, 1, 0));
        /* 캐스팅바를 없애고 */
        changePosition(player, worldId, instanceId, x, y, z, heading);
        /* 플레이어의 위치를 변경합니다. */
      }
    }, delay);

    return true;
  }
Creative Commons License
Creative Commons License

트랙백 주소 : http://www.barahime.org/trackback/9

  1. Subject : travail a domicile

    Tracked from travail a domicile / 2014/09/01 00:22  삭제

    아이온으로 풀어보는 자바이야기 :: 플레이어 이동은 어떻게 하는거야!

Notice

Blogroll

Counter

· Total
: 272554
· Today
: 38
· Yesterday
: 36