해당 분류 : 자바에 대한 이야기    텔레포트 시도중 플레이어가 이동하면 취소시켜보자!    글을 기록한 날 : 2011/05/08 01:27

일단 자세한 패치내역이나 SVN은 아래 주소에서 참고하시기 바랍니다.
http://code.google.com/p/barahime/source/detail?r=41


아래와 같이 기존에는 일정시간이 흐르면 무조건 이동시키게 되던것을
이동감지 옵저버와 태스크를 추가해서 해당 태스크를 강제 취소하게 만듬으로써
플레이어를 이동시키지 않도록 했습니다.
아래 사항을 응용한다면 보다 많은 분야에 사용할 수 있습니다. ^^
궁금하거나 보충설명이 필요한점이 있다면 다음 주제로 다루겠습니다.
많은 홍보와 댓글 부탁드립니다.

PacketSendUtility.sendPacket(player,
 
new SM_ITEM_USAGE_ANIMATION(player.getObjectId(), 0, 0, delay, 0, 0));
//delay 만큼 캐스팅하도록 텔레포트 캐스팅을 하도록 사용자에게 패킷을 보낸다.
player.getController().cancelTask(TaskId.ITEM_USE);
//ITEM_USE 태스크를 취소한다. 만약 해당 태스크로 등록되어 있는 아이템사용이나 텔레포트가 있다면 취소된다.
final ActionObserver observer = new StartMovingListener(){ //이동을 감지하는 옵저버를 생성한다.
  @Override
  public void moved() //이동했다면
  {
    player.getController().cancelTask(TaskId.ITEM_USE); //태스크를 취소한다.
    PacketSendUtility.sendMessage(player, "플레이어 이동으로 인해 텔레포트가 취소되었습니다."); //취소되었음을 알린다.
    PacketSendUtility.sendPacket(player, new SM_ITEM_USAGE_ANIMATION(player.getObjectId(), 0, 0, 0, 2, 0));
    //캐스팅바를 없앤다.
  }
};
player.getObserveController().attach(observer); //좀전에 생성한 옵저버를 플레이어에게 추가한다.

player.getController().addTask(TaskId.ITEM_USE, ThreadPoolManager.getInstance().schedule(new Runnable(){
//ITEM_USE라는 형식의 태스크를 플레이어에게 추가한다.
  @Override
  public void run() //delay 시간만큼 흐른다음에 실행한다.
  {
    if(player.getLifeStats().isAlreadyDead() || !player.isSpawned())
      //플레이어가 죽었거나 게임상에 존재하지 않으면 아무것도 하지 않고 끝낸다.
      return;
    player.getObserveController().removeMoveObserver(observer); //이전에 등록한 옵저버를 제거한다.
    PacketSendUtility.sendPacket(player, new SM_ITEM_USAGE_ANIMATION(0, 0, 0, 0, 1, 0));
    //캐스팅바를 없앤다.
    changePosition(player, worldId, instanceId, x, y, z, heading);
    //플레이어를 이동시킨다.
  }
}, delay));
Creative Commons License
Creative Commons License

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

Notice

Blogroll

Counter

· Total
: 274246
· Today
: 20
· Yesterday
: 36