private void handleAddCard(IServerPlayer p, CardInterface c) throws IOException {
        try {
            if (t.getNumberOfCardsOnTable() == 0) {
                data.clearCardsOnTable();
                LOG.info("Cleared table on beginning of round!");
            }
            pm.sendSuccessPacket(p.getName(), Language.getTrans("play-success", "Card successfully played!"));
            log.addLine(String.format("%s played %s", p.getName(), c.toString()));
            t.addCard(p, c);
            data.addCardToTable(p, c);
            p.removeCard(c);
            order.advanceCurrentPlayer();
            data.setActivePlayer(order.getCurrentPlayer());
            if (t.isSubRoundFinished()) {
                stats.addMade(t.getSubRoundWinner(), stats.getCurrentRoundNo());
                log.addLine(String.format("%s has won %d of %d trick(s)! (Trump was %s)", t.getSubRoundWinner().getName(), stats.getTricksMadeIn(t.getSubRoundWinner(), stats.getCurrentRoundNo()), stats.getForecastIn(t.getSubRoundWinner(), stats.getCurrentRoundNo()), CardNames.getNationName(t.getTrump())));
                order.setNextPlayer(t.getSubRoundWinner());
                data.setActivePlayer(order.getCurrentPlayer());
                t.startSubRound();
            }
            data.setNation(t.getNationOnTable());
        } catch (SubRoundAlreadyFinished e) {
            pm.sendErrorPacket(p.getName(), "Round not started yet!", ErrorReason.ROUND_NOT_STARTED_YET);
        } catch (PlayerAlreadyLaidCard e) {
            pm.sendErrorPacket(p.getName(), "You alreay laid your card for this round!", ErrorReason.PLAYER_ALREADY_PLAYED_CARD);
        } catch (SubRoundNotFinished e) {
            LOG.fatal("SubRoundNotFinished in playCard method!");
        } catch (RoundAlreadyFinished e) {
            handleRoundAlreadyFinished();
        }
        pm.updateClients(data);
    }