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); } } } }
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); } } } } }