/* static */ int32 ScriptCargoMonitor::GetTownPickupAmount(ScriptCompany::CompanyID company, CargoID cargo, TownID town_id, bool keep_monitoring) { CompanyID cid = static_cast<CompanyID>(company); if (cid < OWNER_BEGIN || cid >= MAX_COMPANIES) return -1; if (!ScriptCargo::IsValidCargo(cargo)) return -1; if (!::Town::IsValidID(town_id)) return -1; CargoMonitorID monitor = EncodeCargoTownMonitor(cid, cargo, town_id); return GetPickupAmount(monitor, keep_monitoring); }
/** * Cargo was delivered to its final destination, update the pickup and delivery maps. * @param cargo_type type of cargo. * @param company company delivering the cargo. * @param amount Amount of cargo delivered. * @param src_type type of \a src. * @param src index of source. * @param st station where the cargo is delivered to. */ void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st) { if (amount == 0) return; if (src != INVALID_SOURCE) { /* Handle pickup update. */ switch (src_type) { case ST_INDUSTRY: { CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, src); CargoMonitorMap::iterator iter = _cargo_pickups.find(num); if (iter != _cargo_pickups.end()) iter->second += amount; break; } case ST_TOWN: { CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, src); CargoMonitorMap::iterator iter = _cargo_pickups.find(num); if (iter != _cargo_pickups.end()) iter->second += amount; break; } default: break; } } /* Handle delivery. * Note that delivery in the right area is sufficient to prevent trouble with neighbouring industries or houses. */ /* Town delivery. */ CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, st->town->index); CargoMonitorMap::iterator iter = _cargo_deliveries.find(num); if (iter != _cargo_deliveries.end()) iter->second += amount; /* Industry delivery. */ for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) { CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, (*ip)->index); CargoMonitorMap::iterator iter = _cargo_deliveries.find(num); if (iter != _cargo_deliveries.end()) iter->second += amount; } }
/* static */ uint32 ScriptCargoMonitor::GetTownPickupAmount(ScriptCompany::CompanyID company, CargoID cargo, TownID town_id, bool keep_monitoring) { CargoMonitorID monitor = EncodeCargoTownMonitor(static_cast<CompanyID>(company), cargo, town_id); return GetPickupAmount(monitor, keep_monitoring); }