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