@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
   public void onPlayerItemPickup(PlayerPickupItemEvent event)
   {
      // CAUTION:This event fires, BEFORE the picked up item is added to the inventory!
      // therefore, delay all checks for 1 tick because "itemInHand()" is needed for checks

      // this event can be potentially fired every tick, so make sure the handling (with schedulers...) is as
      // efficient as possible for normal players

      // check if this player is already scheduled for a pickup check (must be happened last tick) and if so,
      // if the check has not yet been executed.
      // if so, cancel the scheduler and re-schedule the check
      // otherwise do some preconditions checks and if successful, schedule the check for next tick

      if(playersScheduledForDelayedServiceModeCheck.containsKey(event.getPlayer().getName()) &&
            (null != playersScheduledForDelayedServiceModeCheck.get(event.getPlayer().getName())))
      {
         // a new itemPickUpEvent has fired while the check routine that is scheduled for the
         // current tick has not yet been called for this player
         // so cancel the task and re-schedule it for the next tick
         playersScheduledForDelayedServiceModeCheck.get(event.getPlayer().getName()).cancel();         
      }

      if(preconditionsOK(event.getPlayer())) // may player use MG at all in current situation?
      {
         if(!playersInSM.contains(event.getPlayer().getName()) &&
               !playersInGracePeriod.containsKey(event.getPlayer().getName()) &&
               !playersOnWarmup.containsKey(event.getPlayer().getName())) // check only if player is NOT in SM and not already handled by any check timer
         {
            playersScheduledForDelayedServiceModeCheck.put(event.getPlayer().getName(),
                  plugin.startDelayedServiceModeCheckTimer_Task(event.getPlayer())); // this will schedule the check handling for next tick
         }
      }
   }