Ware* nobBaseWarehouse::OrderWare(const GoodType good, noBaseBuilding* const goal)
{
    RTTR_Assert(goal);
    // Ware überhaupt hier vorhanden (Abfrage eigentlich nicht nötig, aber erstmal zur Sicherheit)
    if(!inventory[good])
    {
        LOG.lprintf("nobBaseWarehouse::OrderWare: WARNING: No ware type %u in warehouse!\n", static_cast<unsigned>(good));
        return NULL;
    }

    Ware* ware = new Ware(good, goal, this);
    inventory.Remove(good);

    // Abgeleitete Klasse fragen, ob die irgend etwas besonderes mit dieser Ware anfangen will
    if(!UseWareAtOnce(ware, *goal))
    {
        // Add to wating ware, but use copy of pointer, as AddWaitingWare takes ownership
        Ware* tmpWare = ware;
        AddWaitingWare(tmpWare);
    }

    // Evtl. keine Waffen/Bier mehr da, sodass das Rekrutieren gestoppt werden muss
    TryStopRecruiting();

    return ware;
}
/// Legt eine Ware im Lagerhaus ab
void nobHarborBuilding::AddWare(Ware*& ware)
{
    if(ware->GetGoal() && ware->GetGoal() != this)
    {
        // This is not the goal but we have one -> Get new route
        ware->RecalcRoute();

        // Will diese Ware mit dem Schiff irgendwo hin fahren?
        if(ware->GetNextDir() == SHIP_DIR)
        {
            // Dann fügen wir die mal bei uns hinzu
            AddWareForShip(ware);
            return;
        }else if(ware->GetNextDir() != INVALID_DIR)
        {
            // Travel on roads -> Carry out
            RTTR_Assert(ware->GetGoal() != this);
            AddWaitingWare(ware);
            return;
        }else
        {
            // Pathfinding failed -> Ware would want to go here
            RTTR_Assert(ware->GetGoal() == this);
            // Regular handling below
        }
    }

    // Brauchen wir die Ware?
    if(expedition.active)
    {
        if((ware->type == GD_BOARDS && expedition.boards < BUILDING_COSTS[nation][BLD_HARBORBUILDING].boards)
                || (ware->type == GD_STONES && expedition.stones < BUILDING_COSTS[nation][BLD_HARBORBUILDING].stones))
        {
            if(ware->type == GD_BOARDS)
                ++expedition.boards;
            else
                ++expedition.stones;

            // Ware nicht mehr abhängig
            if(ware->GetGoal())
                RemoveDependentWare(ware);
            // Dann zweigen wir die einfach mal für die Expedition ab
            gwg->GetPlayer(player).RemoveWare(ware);
            deletePtr(ware);

            // Ggf. ist jetzt alles benötigte da
            CheckExpeditionReady();
            return;
        }
    }

    nobBaseWarehouse::AddWare(ware);
}