@Override
 public boolean checkWalkStep(int lastX, int lastY, int nextX, int nextY) {
   if (npc != null && nextY < base.getY() + 28) {
     if (npc.getPhase() > 1) {
       for (int[] step : PLATFORM_STEPS[0]) {
         if (base.getX() + (step[0] - 64) == nextX && base.getY() + (step[1] - 64) == nextY) {
           return true;
         }
       }
       if (npc.getPhase() > 2) {
         for (int[] step : PLATFORM_STEPS[1]) {
           if (base.getX() + (step[0] - 64) == nextX && base.getY() + (step[1] - 64) == nextY) {
             return true;
           }
         }
         if (npc.getPhase() > 3) {
           for (int[] step : PLATFORM_STEPS[2]) {
             if (base.getX() + (step[0] - 64) == nextX && base.getY() + (step[1] - 64) == nextY) {
               return true;
             }
           }
         }
       }
     }
     return false;
   }
   return true;
 }
 /** Ends the controler. 0 - tele 1 - logout */
 private void end(int type) {
   player.setForceMultiArea(false);
   player.setLargeSceneView(false);
   if (type == 0) {
     boolean resizable = player.getInterfaceManager().hasRezizableScreen();
     player.getPackets().closeInterface(resizable ? 746 : 548, resizable ? 1 : 0);
     player.getPackets().sendGlobalConfig(184, -1);
   } else {
     player.setLocation(OUTSIDE);
   }
   removeControler();
   if (npc != null) player.getBank().addItems(npc.getRewards().toArray(), false);
   /*
    * 1200 delay because of leaving
    */
   CoresManager.slowExecutor.schedule(
       new Runnable() {
         @Override
         public void run() {
           RegionBuilder.destroyMap(regionBase[0], regionBase[1], 8, 8);
         }
       },
       1200,
       TimeUnit.MILLISECONDS);
 }
 @Override
 public void process() {
   if (npc == null) return;
   if (player.getY() < base.getY() + 28) {
     if (npc.hasFinished()) {
       return;
     }
     if (platformStand++ == 3) {
       player
           .getPackets()
           .sendGameMessage("You are damaged for standing too long on the raw magical platforms.");
       player.applyHit(new Hit(npc, 200, HitLook.REGULAR_DAMAGE));
       platformStand = 0;
     }
   } else {
     platformStand = 0;
   }
 }
 @Override
 public boolean processButtonClick(int interfaceId, int componentId, int slotId, int packetId) {
   if (npc == null) {
     return true;
   }
   switch (interfaceId) {
     case 1284:
       switch (componentId) {
         case 8:
           player.getBank().addItems(npc.getRewards().toArray(), false);
           npc.getRewards().clear();
           player.getPackets().sendGameMessage("All the items were moved to your bank.");
           break;
         case 9:
           npc.getRewards().clear();
           player.getPackets().sendGameMessage("All the items were removed from the chest.");
           break;
         case 10:
           for (int slot = 0; slot < npc.getRewards().toArray().length; slot++) {
             Item item = npc.getRewards().get(slot);
             if (item == null) {
               continue;
             }
             boolean added = true;
             if (item.getDefinitions().isStackable() || item.getAmount() < 2) {
               added = player.getInventory().addItem(item);
               if (added) {
                 npc.getRewards().toArray()[slot] = null;
               }
             } else {
               for (int i = 0; i < item.getAmount(); i++) {
                 Item single = new Item(item.getId());
                 if (!player.getInventory().addItem(single)) {
                   added = false;
                   break;
                 }
                 npc.getRewards().remove(single);
               }
             }
             if (!added) {
               player
                   .getPackets()
                   .sendGameMessage(
                       "You only had enough space in your inventory to accept some of the items.");
               break;
             }
           }
           break;
         case 7:
           Item item = npc.getRewards().get(slotId);
           if (item == null) {
             return true;
           }
           switch (packetId) {
             case 52:
               player.getPackets().sendGameMessage("It's a " + item.getDefinitions().getName());
               return false;
             case 4:
               npc.getRewards().toArray()[slotId] = null;
               break;
             case 64:
               player.getBank().addItems(new Item[] {npc.getRewards().toArray()[slotId]}, false);
               npc.getRewards().toArray()[slotId] = null;
               break;
             case 61:
               boolean added = true;
               if (item.getDefinitions().isStackable() || item.getAmount() < 2) {
                 added = player.getInventory().addItem(item);
                 if (added) {
                   npc.getRewards().toArray()[slotId] = null;
                 }
               } else {
                 for (int i = 0; i < item.getAmount(); i++) {
                   Item single = new Item(item.getId());
                   if (!player.getInventory().addItem(single)) {
                     added = false;
                     break;
                   }
                   npc.getRewards().remove(single);
                 }
               }
               if (!added) {
                 player
                     .getPackets()
                     .sendGameMessage(
                         "You only had enough space in your inventory to accept some of the items.");
                 break;
               }
               break;
             default:
               return true;
           }
           break;
         default:
           return true;
       }
       npc.openRewardChest(false);
       return false;
   }
   return true;
 }
 @Override
 public boolean processObjectClick1(WorldObject object) {
   if (npc == null) {
     return true;
   }
   if (object.getId() == 70790) {
     if (npc.getPhase() < 5) {
       return true;
     }
     player.lock();
     FadingScreen.fade(
         player,
         new Runnable() {
           @Override
           public void run() {
             player
                 .getPackets()
                 .sendGameMessage(
                     "You descend the stairs that appeared when you defeated the Queen Black Dragon.");
             player.getPackets().sendGlobalConfig(184, -1);
             npc.finish();
             RegionBuilder.copyAllPlanesMap(160, 760, regionBase[0], regionBase[1], 8, 8);
             player.setForceNextMapLoadRefresh(true);
             player.loadMapRegions();
             player
                 .getPackets()
                 .sendDestroyObject(new WorldObject(70849, 10, 0, base.transform(24, 21, -1)));
             player
                 .getPackets()
                 .sendDestroyObject(new WorldObject(70837, 10, 0, base.transform(22, 24, -1)));
             player
                 .getPackets()
                 .sendDestroyObject(new WorldObject(70840, 10, 0, base.transform(34, 24, -1)));
             World.removeObject(new WorldObject(70775, 10, 0, base.transform(31, 29, -1)), true);
             player
                 .getPackets()
                 .sendDestroyObject(new WorldObject(70822, 10, 0, base.transform(21, 35, -1)));
             player
                 .getPackets()
                 .sendDestroyObject(new WorldObject(70818, 10, 0, base.transform(39, 35, -1)));
             player.setNextWorldTile(base.transform(31, 36, -1));
             boolean resizable = player.getInterfaceManager().hasRezizableScreen();
             player.getPackets().closeInterface(resizable ? 746 : 548, resizable ? 1 : 0);
             player.unlock();
           }
         });
     return false;
   }
   if (object.getId() == 70813) {
     Magic.sendObjectTeleportSpell(player, true, Settings.RESPAWN_PLAYER_LOCATION);
     return false;
   }
   if (object.getId() == 70814) {
     player.getPackets().sendGameMessage("The gate is locked.");
     return false;
   }
   if (object.getId() == 70815) {
     player.getDialogueManager().startDialogue("RewardChest", npc);
     return false;
   }
   if (object.getId() == 70817) {
     npc.openRewardChest(false);
     return false;
   }
   if (object.getId() == npc.getActiveArtifact().getId()) {
     player.getMusicsManager().playMusic(1118); // QUEEN BLACK DRAGON
     npc.setSpawningWorms(false);
     npc.setNextAttack(20);
     npc.setActiveArtifact(new WorldObject(object.getId() + 1, 10, 0, object));
     npc.setHitpoints(npc.getMaxHitpoints());
     npc.setCantInteract(false);
     npc.setPhase(npc.getPhase() + 1);
     World.spawnObject(npc.getActiveArtifact(), false);
     switch (object.getId()) {
       case 70777:
         player.getPackets().sendGlobalConfig(1924, 2);
         player
             .getPackets()
             .sendSpawnedObject(new WorldObject(70843, 10, 0, base.transform(24, 21, -1)));
         break;
       case 70780:
         player.getPackets().sendGlobalConfig(1924, 4);
         player
             .getPackets()
             .sendSpawnedObject(new WorldObject(70845, 10, 0, base.transform(24, 21, -1)));
         break;
       case 70783:
         player.getPackets().sendGlobalConfig(1924, 6);
         player
             .getPackets()
             .sendSpawnedObject(new WorldObject(70847, 10, 0, base.transform(24, 21, -1)));
         break;
       case 70786:
         player.getPackets().sendGlobalConfig(1924, 8);
         player
             .getPackets()
             .sendSpawnedObject(new WorldObject(70849, 10, 0, base.transform(24, 21, -1)));
         break;
     }
     return false;
   }
   return true;
 }