/** @param npcAI */
 public static void onThink(NpcAI2 npcAI) {
   if (npcAI.isLogging()) {
     AI2Logger.info(npcAI, "think");
   }
   if (npcAI.isAlreadyDead()) {
     AI2Logger.info(npcAI, "can't think in dead state");
     return;
   }
   if (!npcAI.tryLockThink()) {
     AI2Logger.info(npcAI, "can't acquire lock");
     return;
   }
   try {
     if (!npcAI.getOwner().getPosition().isMapRegionActive()
         || npcAI.getSubState() == AISubState.FREEZE) {
       thinkInInactiveRegion(npcAI);
       return;
     }
     if (npcAI.isLogging()) {
       AI2Logger.info(npcAI, "think state " + npcAI.getState());
     }
     switch (npcAI.getState()) {
       case FIGHT:
         thinkAttack(npcAI);
         break;
       case WALKING:
         thinkWalking(npcAI);
         break;
       case IDLE:
         thinkIdle(npcAI);
         break;
       default:
         break;
     }
   } finally {
     npcAI.unlockThink();
   }
 }