예제 #1
0
  public static final void MoveDragon(final LittleEndianAccessor slea, final MapleCharacter chr) {
    slea.skip(8); // POS
    final List<LifeMovementFragment> res = MovementParse.parseMovement(slea, 5);
    if (chr != null && chr.getDragon() != null && res.size() > 0) {
      final Point pos = chr.getDragon().getPosition();
      MovementParse.updatePosition(res, chr.getDragon(), 0);
      if (!chr.isHidden()) {
        chr.getMap()
            .broadcastMessage(
                chr, CField.moveDragon(chr.getDragon(), pos, res), chr.getTruePosition());
      }

      WeakReference<MapleCharacter>[] clones = chr.getClones();
      for (int i = 0; i < clones.length; i++) {
        if (clones[i].get() != null) {
          final MapleMap map = chr.getMap();
          final MapleCharacter clone = clones[i].get();
          CloneTimer.getInstance()
              .schedule(
                  new Runnable() {

                    public void run() {
                      try {
                        if (clone.getMap() == map && clone.getDragon() != null) {
                          final Point startPos = clone.getDragon().getPosition();
                          MovementParse.updatePosition(res, clone.getDragon(), 0);
                          if (!clone.isHidden()) {
                            map.broadcastMessage(
                                clone,
                                CField.moveDragon(clone.getDragon(), startPos, res),
                                clone.getTruePosition());
                          }
                        }
                      } catch (Exception e) {
                        // very rarely swallowed
                      }
                    }
                  },
                  500 * i + 500);
        }
      }
    }
  }