public void remotePlayerPutCard(Player p, Card c) {
		TurnContext cx = p.getCurrentContext();
		CardRange r = getCorrespondingCardRange(cx.currentPlayable, p);
		CardEntity ent = null;
		boolean found = false;
		cardsReadLock.lock();
		try {
			int remaining = r.getLength();
			for (Iterator<CardEntity> iter = cards.listIterator(r.getStart()); !found && remaining > 0; remaining--) {
				ent = iter.next();
				if (ent.getValue() == c)
					found = true;
			}
		} finally {
			cardsReadLock.unlock();
		}
		if (found) {
			ent.setShow(true);
			if (cx.choosingFaceUp) {
				removeCardFromHandAndPutOnFaceUp(p, ent);
				//playerIndices[p.getPlayerId()].getFaceUpRange().getLength() would work as well as p.getFaceUp().size()
				//but this way doesn't need cardsReadLock to be locked (remember, we're in the game loop thread)
				ent.mark(getFaceUpCardLocation(p, p.getFaceUp().size() - 1), getRotation(p), 1);
			} else {
				removeCardFromPlayerAndPutOnDiscardPile(cx, p, ent);
				//discardPileEntitiesRange.getLength() would work as well as model.discardPileSize()
				//but this way doesn't need cardsReadLock to be locked (remember, we're in the game loop thread)
				ent.mark(getDiscardPileLocation(model.discardPileSize() - 1), 0, 1);
			}
			ent.reset();
		}
	}