private void handleScreenCloseCancelled(SpoutPlayer player, ScreenCloseEvent e, boolean update) {
   this.action = (byte) ScreenAction.Close.getId();
   PopupScreen screen = player.getMainScreen().getActivePopup();
   if (screen != null) {
     if (update) {
       screen.onScreenClose(e);
     }
     if (!e.isCancelled() && ScreenType.getType(this.screen) == ScreenType.CUSTOM_SCREEN) {
       handleScreenClose(player, e, false);
       return;
     }
     screen.setDirty(true);
     player.sendImmediatePacket(new PacketWidget(screen, screen.getId()));
   }
 }
 @Override
 public void run(int playerId) {
   SpoutPlayer player = SpoutManager.getPlayerFromId(playerId);
   ScreenEvent event;
   switch (ScreenAction.getScreenActionFromId(action)) {
     case Close:
       event =
           new ScreenCloseEvent(
               player, player.getMainScreen().getActivePopup(), ScreenType.getType(this.screen));
       Bukkit.getServer().getPluginManager().callEvent(event);
       if (event.isCancelled()) {
         handleScreenCloseCancelled(player, (ScreenCloseEvent) event, true);
       } else if (ScreenType.getType(this.screen) == ScreenType.CUSTOM_SCREEN) {
         handleScreenClose(player, (ScreenCloseEvent) event, true);
       }
       if (!event.isCancelled()) {
         player.openScreen(ScreenType.GAME_SCREEN, false);
       }
       break;
     case Open:
       event =
           new ScreenOpenEvent(
               player, player.getMainScreen().getActivePopup(), ScreenType.getType(this.screen));
       Bukkit.getServer().getPluginManager().callEvent(event);
       if (event.isCancelled()) {
         PopupScreen screen = player.getMainScreen().getActivePopup();
         if (screen != null) {
           screen.setDirty(true);
           player.sendImmediatePacket(new PacketWidget(screen, screen.getId()));
         }
       } else {
         player.openScreen(ScreenType.getType(this.screen), false);
       }
       break;
   }
 }