/// A ware changed its route and doesn't want to use the ship anymore
void nobHarborBuilding::WareDontWantToTravelByShip(Ware * ware)
{
	// Maybe this building is already destroyed
	if(gwg->GetGOT(x,y) != GOT_NOB_HARBORBUILDING)
		return;

	// Ware aus unserer Liste streichen
	wares_for_ships.remove(ware);
	// Will die Ware jetzt vielleicht zu uns?
	if(ware->goal == this)
	{
		// Dann hier gleich einliefern
		AddWare(ware);
		// and dont forget to reduce our visual count - addware will increase both and the ware waiting for a ship added to the visual count!
		--goods.goods[ConvertShields(ware->type)];

	}
	// Oder will sie wieder raus?
	else
	{
		waiting_wares.push_back(ware);
		AddLeavingEvent();
	}
	
}
/// Erhält die Waren von einem Schiff und nimmt diese in den Warenbestand auf
void nobHarborBuilding::ReceiveGoodsFromShip(std::list<noFigure*>& figures, std::list<Ware*>& wares)
{
    // Menschen zur Ausgehliste hinzufügen
    for(std::list<noFigure*>::const_iterator it = figures.begin(); it != figures.end(); ++it)
    {
        (*it)->ArrivedByShip(pos);

        // Wenn es kein Ziel mehr hat, sprich keinen weiteren Weg, kann es direkt hier gelagert werden
        if((*it)->GetGoal() == this)
            (*it)->SetGoalToNULL();
        else if(!(*it)->HasNoGoal())
        {
            unsigned char nextDir;
            MapPoint next_harbor = (*it)->ExamineRouteBeforeShipping(nextDir);

            if (nextDir == 4)
            {
                // Increase visual count
                if((*it)->GetJobType() == JOB_BOATCARRIER)
                {
                    inventory.visual.Add(JOB_HELPER);
                    inventory.visual.Add(GD_BOAT);
                }
                else
                    inventory.visual.Add((*it)->GetJobType());
                AddLeavingFigure(*it);
                (*it)->ShipJourneyEnded();
            }
            else if (nextDir == SHIP_DIR)
            {
                AddFigureForShip(*it, next_harbor);
            }else
            {
                // No or invalid path -> Store here
                RTTR_Assert(nextDir == 0xFF);
                (*it)->SetGoalToNULL();
                AddDependentFigure(*it);
            }
        }else
            AddDependentFigure(*it); // No goal? We take it
        if ((*it)->HasNoGoal())
             AddFigure(*it, true);
    }
    figures.clear();

    // Waren zur Warteliste hinzufügen
    for(std::list<Ware*>::iterator it = wares.begin(); it != wares.end(); ++it)
    {
        (*it)->ShipJorneyEnded(this);
        AddWare(*it);
    }
    wares.clear();
}