Example #1
0
void Ware::GoalDestroyed()
{

    if(state == STATE_WAITINWAREHOUSE)
    {
        // Ware ist noch im Lagerhaus auf der Warteliste
    }
    // Ist sie evtl. gerade mit dem Schiff unterwegs?
    else if(state == STATE_ONSHIP)
    {
        // Ziel zunächst auf NULL setzen, was dann vom Zielhafen erkannt wird,
        // woraufhin dieser die Ware gleich in sein Inventar mit übernimmt
        goal = NULL;
    }
    // Oder wartet sie im Hafen noch auf ein Schiff
    else if(state == STATE_WAITFORSHIP)
    {
        // Dann dem Hafen Bescheid sagen
        dynamic_cast<nobHarborBuilding*>(location)->CancelWareForShip(this);
        GAMECLIENT.GetPlayer(location->GetPlayer())->RemoveWare(this);
        em->AddToKillList(this);
    }
    else
    {
        // Ware ist unterwegs, Lagerhaus finden und Ware dort einliefern
        assert(location);
        assert(location->GetPlayer() < MAX_PLAYERS);

        // Wird sie gerade aus einem Lagerhaus rausgetragen?
        if(location->GetGOT() == GOT_NOB_STOREHOUSE ||
                /*location->GetGOT() == GOT_NOB_HARBOUR || */
                location->GetGOT() == GOT_NOB_HQ)
        {
            if(location != goal)
            {
                goal = static_cast<noBaseBuilding*>(location);
                // Lagerhaus ggf. Bescheid sagen
                goal->TakeWare(this);
            }
            else
            {
                goal = NULL;
                next_dir = 0xFF;
            }
        }
        // Wenn sie an einer Flagge liegt, muss der Weg neu berechnet werden und dem Träger Bescheid gesagt werden
        else if(state == STATE_WAITATFLAG)
        {
            goal = gwg->GetPlayer(location->GetPlayer())->FindWarehouse(location,FW::Condition_StoreWare,0,true,&type,true);

            unsigned char last_next_dir = next_dir;
            next_dir = gwg->FindPathForWareOnRoads(location,goal,NULL,&next_harbor);
            RemoveWareJobForCurrentDir(last_next_dir);


            // Kein Lagerhaus gefunden bzw kein Weg dorthin?
            if(!goal || next_dir == 0xFF)
            {
                //// Mich aus der globalen Warenliste rausnehmen und in die WareLost Liste einfügen
                //gwg->GetPlayer((location->GetPlayer()].RemoveWare(this);
                //gwg->GetPlayer((location->GetPlayer()].RegisterLostWare(this);
                return;
            }

            // Es wurde ein gültiger Weg gefunden! Dann muss aber noch dem nächsten Träger Bescheid gesagt werden
            location->routes[next_dir]->AddWareJob(location);

            // Lagerhaus Bescheid sagen
            goal->TakeWare(this);
        }
        else if(state == STATE_CARRIED)
        {
            // Ziel = aktuelle Position, d.h. der Träger, der die Ware trägt, geht gerade in das Zielgebäude rein
            // d.h. es ist sowieso zu spät
            if(goal != location)
            {
                goal = gwg->GetPlayer(location->GetPlayer())->FindWarehouse(location,FW::Condition_StoreWare,0,true,&type,true);

                if(goal)
                    // Lagerhaus ggf. Bescheid sagen
                    goal->TakeWare(this);
            }
        }
    }
}
Example #2
0
void Ware::GoalDestroyed()
{
    if(state == STATE_WAITINWAREHOUSE)
    {
        // Ware ist noch im Lagerhaus auf der Warteliste
    }
    // Ist sie evtl. gerade mit dem Schiff unterwegs?
    else if(state == STATE_ONSHIP)
    {
        // Ziel zunächst auf NULL setzen, was dann vom Zielhafen erkannt wird,
        // woraufhin dieser die Ware gleich in sein Inventar mit übernimmt		
        goal = NULL;
    }
    // Oder wartet sie im Hafen noch auf ein Schiff
    else if(state == STATE_WAITFORSHIP)
    {
        // Dann dem Hafen Bescheid sagen
        dynamic_cast<nobHarborBuilding*>(location)->CancelWareForShip(this);
        GAMECLIENT.GetPlayer(location->GetPlayer()).RemoveWare(this);
        em->AddToKillList(this);
    }
    else
    {
        // Ware ist unterwegs, Lagerhaus finden und Ware dort einliefern
        assert(location);
        assert(location->GetPlayer() < MAX_PLAYERS);

        // Wird sie gerade aus einem Lagerhaus rausgetragen?
        if(location->GetGOT() == GOT_NOB_STOREHOUSE || location->GetGOT() == GOT_NOB_HARBORBUILDING || location->GetGOT() == GOT_NOB_HQ)
        {
            if(location != goal)
            {
                goal = static_cast<noBaseBuilding*>(location);
                // Lagerhaus ggf. Bescheid sagen
                goal->TakeWare(this);
            }
            else //at the goal (which was just destroyed) and get carried out right now? -> we are about to get destroyed...
            {
                goal = NULL;
                next_dir = 0xFF;
            }
        }
        // Wenn sie an einer Flagge liegt, muss der Weg neu berechnet werden und dem Träger Bescheid gesagt werden
        else if(state == STATE_WAITATFLAG)
        {
            goal = gwg->GetPlayer(location->GetPlayer()).FindWarehouse(location, FW::Condition_StoreWare, 0, true, &type, true);

            unsigned char last_next_dir = next_dir;
            next_dir = gwg->FindPathForWareOnRoads(location, goal, NULL, &next_harbor);
            RemoveWareJobForCurrentDir(last_next_dir);


            // Kein Lagerhaus gefunden bzw kein Weg dorthin?
            if(!goal || next_dir == 0xFF)
            {
                //// Mich aus der globalen Warenliste rausnehmen und in die WareLost Liste einfügen
                //gwg->GetPlayer((location->GetPlayer()].RemoveWare(this);
                //gwg->GetPlayer((location->GetPlayer()].RegisterLostWare(this);
                return;
            }

            // Es wurde ein gültiger Weg gefunden! Dann muss aber noch dem nächsten Träger Bescheid gesagt werden
            location->routes[next_dir]->AddWareJob(location);

            // Lagerhaus Bescheid sagen
            goal->TakeWare(this);
        }
        else if(state == STATE_CARRIED)
        {
            // if goal = current location -> too late to do anything our road will be removed and ware destroyed when the carrier starts walking about
			// goal != current location -> find a warehouse for us (if we are entering a warehouse already set this as new goal (should only happen if its a harbor for shipping as the building wasnt our goal))

            if(goal != location)
            {
				if(location->GetGOT() == GOT_NOB_STOREHOUSE || location->GetGOT() == GOT_NOB_HARBORBUILDING || location->GetGOT() == GOT_NOB_HQ) //currently carried into a warehouse? -> add ware (pathfinding will not return this wh because of path lengths 0)
				{
					if(location->GetGOT()!=GOT_NOB_HARBORBUILDING)
						LOG.lprintf("WARNING: Ware::GoalDestroyed() -- ware is currently being carried into warehouse or hq that was not it's goal! ware id %i, type %i, player %i, wareloc %i,%i, goal loc %i,%i \n",GetObjId(),type,location->GetPlayer(),GetLocation()->GetX(),GetLocation()->GetY(), goal->GetX(), goal->GetY());
					goal = static_cast<noBaseBuilding*>(location);
					goal->TakeWare(this);
				}
				else
				{
					goal = gwg->GetPlayer(location->GetPlayer()).FindWarehouse(location, FW::Condition_StoreWare, 0, true, &type, true);

					if(goal)
						// Lagerhaus ggf. Bescheid sagen
						goal->TakeWare(this);
				}
            }
        }
    }
}