public Card draw(boolean from_throwpile)
		{
			synchronized(Rummy.this)
			{
				if (Rummy.this.getCurrentPlayer() != p.getPlayer())
					return null;
			}
			
			if ((player_state != PlayerState.EXPECTING_DRAW) && (player_state != PlayerState.DEALING))
				return null;
			
			Card c = null;
			if (!hand.holdingExtraCards())
			{
				if (from_throwpile)
					c = throw_pile.pop();
				else
					c = game_deck.draw();
				
				if (from_throwpile)
					Rummy.this.sendEventToPlayers(new CardEvent(RummyEvents.DRAW_FROM_PILE, c), Rummy.this.current_player);
				else
					Rummy.this.sendEventToPlayers(new RummyEvent(RummyEvents.DRAW_FROM_DECK), Rummy.this.current_player);

				try {
					hand.add(c);
				} 
				catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
			
			if (player_state != PlayerState.DEALING)
				player_state = PlayerState.EXPECTING_DISCARD;
			return c;
		}