Bazaar developer reference

CvPlot::setOwner(PlayerTypes, int, bool, bool)

Defined in
CvPlot.cpp, line 5307
Class
CvPlot
Hook name
CivHooks::CvPlot_setOwner
Lua events
GameEvents.TileOwnershipChanged

Hooks

static bool BeforeCvPlot_setOwner(CvPlot* self, PlayerTypes eNewValue, int iAcquiringCityID, bool bCheckUnits, bool arg3);static void AfterCvPlot_setOwner(CvPlot* self, PlayerTypes eNewValue, int iAcquiringCityID, bool bCheckUnits, bool arg3);static void ReplaceCvPlot_setOwner(void (*original)(CvPlot*, PlayerTypes, int, bool, bool), CvPlot* self, PlayerTypes eNewValue, int iAcquiringCityID, bool bCheckUnits, bool arg3);CivRegisterBefore<CivHooks::CvPlot_setOwner>(host, &BeforeCvPlot_setOwner);CivRegisterAfter<CivHooks::CvPlot_setOwner>(host, &AfterCvPlot_setOwner);CivRegisterReplace<CivHooks::CvPlot_setOwner>(host, &ReplaceCvPlot_setOwner);

Code

5307void CvPlot::setOwner(PlayerTypes eNewValue, int iAcquiringCityID, bool bCheckUnits, bool)5308{5309	IDInfo* pUnitNode;5310	CvCity* pOldCity;5311	CvString strBuffer;5312	int iI;53135314	// Remove effects for old owner before changing the member5315	if(getOwner() != eNewValue)5316	{5317		PlayerTypes eOldOwner = getOwner();;53185319		GC.getGame().addReplayMessage(REPLAY_MESSAGE_PLOT_OWNER_CHANGE, eNewValue, "", getX(), getY());53205321		pOldCity = getPlotCity();53225323		{5324			setOwnershipDuration(0);53255326			// Plot was owned by someone else5327			if(isOwned())5328			{5329#if defined(MOD_API_EXTENSIONS)5330				changeAdjacentSight(getTeam(), GC.getPLOT_VISIBILITY_RANGE(), false, NO_INVISIBLE, NO_DIRECTION);5331#else5332				changeAdjacentSight(getTeam(), GC.getPLOT_VISIBILITY_RANGE(), false, NO_INVISIBLE, NO_DIRECTION, false);5333#endif53345335				// if this tile is owned by a minor share the visibility with my ally5336				if(pOldCity)5337				{5338					for(uint ui = 0; ui < MAX_MAJOR_CIVS; ui++)5339					{5340						PlayerTypes ePlayer = (PlayerTypes)ui;5341						if(GET_PLAYER(ePlayer).GetEspionage()->HasEstablishedSurveillanceInCity(pOldCity))5342						{5343#if defined(MOD_API_EXTENSIONS)5344							changeAdjacentSight(GET_PLAYER(ePlayer).getTeam(), GC.getESPIONAGE_SURVEILLANCE_SIGHT_RANGE(), false, NO_INVISIBLE, NO_DIRECTION);5345#else5346							changeAdjacentSight(GET_PLAYER(ePlayer).getTeam(), GC.getESPIONAGE_SURVEILLANCE_SIGHT_RANGE(), false, NO_INVISIBLE, NO_DIRECTION, false);5347#endif5348						}5349					}5350				}53515352				if(eOldOwner >= MAX_MAJOR_CIVS && eOldOwner != BARBARIAN_PLAYER)5353				{5354					CvPlayer& thisPlayer = GET_PLAYER(eOldOwner);5355					CvMinorCivAI* pMinorCivAI = thisPlayer.GetMinorCivAI();5356					if(pMinorCivAI && pMinorCivAI->GetAlly() != NO_PLAYER)5357					{5358#if defined(MOD_API_EXTENSIONS)5359						changeAdjacentSight(GET_PLAYER(pMinorCivAI->GetAlly()).getTeam(), GC.getPLOT_VISIBILITY_RANGE(), false, NO_INVISIBLE, NO_DIRECTION);5360#else5361						changeAdjacentSight(GET_PLAYER(pMinorCivAI->GetAlly()).getTeam(), GC.getPLOT_VISIBILITY_RANGE(), false, NO_INVISIBLE, NO_DIRECTION, false);5362#endif5363					}5364				}53655366				if(area())5367				{5368					area()->changeNumOwnedTiles(-1);5369				}5370				GC.getMap().changeOwnedPlots(-1);53715372				if(!isWater())5373				{5374					GET_PLAYER(getOwner()).changeTotalLand(-1);5375					GET_TEAM(getTeam()).changeTotalLand(-1);53765377					if(isOwnershipScore())5378					{5379						GET_PLAYER(getOwner()).changeTotalLandScored(-1);5380					}5381				}53825383				// Improvement is here5384				if(getImprovementType() != NO_IMPROVEMENT)5385				{5386					GET_PLAYER(getOwner()).changeImprovementCount(getImprovementType(), -1);53875388					// Remove siphoned resources5389					CvImprovementEntry* pImprovementInfo = GC.getImprovementInfo(getImprovementType());5390					if (pImprovementInfo != NULL && pImprovementInfo->GetLuxuryCopiesSiphonedFromMinor() > 0)5391					{5392						if (GetPlayerThatBuiltImprovement() != NO_PLAYER)5393						{5394							if (GET_PLAYER(eOldOwner).isMinorCiv())5395							{5396								GET_PLAYER(GetPlayerThatBuiltImprovement()).changeSiphonLuxuryCount(eOldOwner, -1 * pImprovementInfo->GetLuxuryCopiesSiphonedFromMinor());5397							}5398						}5399					}5400					// Maintenance change!5401					if(MustPayMaintenanceHere(getOwner()))5402					{5403						GET_PLAYER(getOwner()).GetTreasury()->ChangeBaseImprovementGoldMaintenance(-GC.getImprovementInfo(getImprovementType())->GetGoldMaintenance());5404					}5405				}54065407				// Route is here5408				if(getRouteType() != NO_ROUTE && !isCity())5409				{5410					// Maintenance change!5411					if(MustPayMaintenanceHere(getOwner()))5412					{5413						GET_PLAYER(getOwner()).GetTreasury()->ChangeBaseImprovementGoldMaintenance(-GC.getRouteInfo(getRouteType())->GetGoldMaintenance());5414					}5415				}54165417				// Remove Resource Quantity from total5418				if(getResourceType() != NO_RESOURCE)5419				{5420					// Disconnect resource link5421					if(GetResourceLinkedCity() != NULL)5422					{5423						SetResourceLinkedCity(NULL);5424					}54255426					if(GET_TEAM(getTeam()).GetTeamTechs()->HasTech((TechTypes) GC.getResourceInfo(getResourceType())->getTechCityTrade()))5427					{5428						if(getImprovementType() != NO_IMPROVEMENT && GC.getImprovementInfo(getImprovementType())->IsImprovementResourceTrade(getResourceType()))5429						{5430							if(!IsImprovementPillaged())5431							{5432								GET_PLAYER(getOwner()).changeNumResourceTotal(getResourceType(), -getNumResourceForPlayer(getOwner()));5433							}5434						}5435					}5436				}5437			}5438			// Plot is unowned5439			else5440			{5441				// Someone paying for this improvement5442				if(GetPlayerResponsibleForImprovement() != NO_PLAYER)5443				{5444					if(MustPayMaintenanceHere(GetPlayerResponsibleForImprovement()))5445					{5446						GET_PLAYER(GetPlayerResponsibleForImprovement()).GetTreasury()->ChangeBaseImprovementGoldMaintenance(-GC.getImprovementInfo(getImprovementType())->GetGoldMaintenance());5447					}5448					SetPlayerResponsibleForImprovement(NO_PLAYER);5449				}5450				// Someone paying for this Route5451				if(GetPlayerResponsibleForRoute() != NO_PLAYER)5452				{5453					if(MustPayMaintenanceHere(GetPlayerResponsibleForRoute()))5454					{5455						GET_PLAYER(GetPlayerResponsibleForRoute()).GetTreasury()->ChangeBaseImprovementGoldMaintenance(-GC.getRouteInfo(getRouteType())->GetGoldMaintenance());5456					}5457					SetPlayerResponsibleForRoute(NO_PLAYER);5458				}5459			}54605461			// This plot is ABOUT TO BE owned. Pop Goody Huts/remove barb camps, etc. Otherwise it will try to reduce the # of Improvements we have in our borders, and these guys shouldn't apply to that count5462			if(eNewValue != NO_PLAYER)5463			{5464				// Pop Goody Huts here5465				if(isGoody())5466				{5467					GET_PLAYER(eNewValue).doGoody(this, NULL);5468				}54695470				// If there's a camp here, clear it5471				if(getImprovementType() == GC.getBARBARIAN_CAMP_IMPROVEMENT())5472				{5473					setImprovementType(NO_IMPROVEMENT);5474					CvBarbarians::DoBarbCampCleared(this, eNewValue);5475					SetPlayerThatClearedBarbCampHere(eNewValue);54765477					// Don't give gold for Camps cleared by settling5478				}5479			}54805481			pUnitNode = headUnitNode();54825483			// ACTUALLY CHANGE OWNERSHIP HERE5484			m_eOwner = eNewValue;54855486			setWorkingCityOverride(NULL);5487			updateWorkingCity();54885489			// Post ownership switch54905491			if(isOwned())5492			{5493				CvPlayerAI& newPlayer = GET_PLAYER(eNewValue);5494				if(iAcquiringCityID >= 0)5495				{5496					m_purchaseCity.eOwner = eNewValue;5497					m_purchaseCity.iID = iAcquiringCityID;5498				}5499				else5500				{5501					m_purchaseCity.eOwner = NO_PLAYER;5502					m_purchaseCity.iID = -1;5503				}55045505#if defined(MOD_API_EXTENSIONS)5506				changeAdjacentSight(getTeam(), GC.getPLOT_VISIBILITY_RANGE(), true, NO_INVISIBLE, NO_DIRECTION);5507#else5508				changeAdjacentSight(getTeam(), GC.getPLOT_VISIBILITY_RANGE(), true, NO_INVISIBLE, NO_DIRECTION, false);5509#endif55105511				// if this tile is owned by a minor share the visibility with my ally5512				if(pOldCity)5513				{5514					for(uint ui = 0; ui < MAX_MAJOR_CIVS; ui++)5515					{5516						PlayerTypes ePlayer = (PlayerTypes)ui;5517						if(GET_PLAYER(ePlayer).GetEspionage()->HasEstablishedSurveillanceInCity(pOldCity))5518						{5519#if defined(MOD_API_EXTENSIONS)5520							changeAdjacentSight(GET_PLAYER(ePlayer).getTeam(), GC.getESPIONAGE_SURVEILLANCE_SIGHT_RANGE(), true, NO_INVISIBLE, NO_DIRECTION);5521#else5522							changeAdjacentSight(GET_PLAYER(ePlayer).getTeam(), GC.getESPIONAGE_SURVEILLANCE_SIGHT_RANGE(), true, NO_INVISIBLE, NO_DIRECTION, false);5523#endif5524						}5525					}5526				}55275528				if(eNewValue >= MAX_MAJOR_CIVS && eNewValue != BARBARIAN_PLAYER)5529				{5530					CvPlayer& thisPlayer = GET_PLAYER(eNewValue);5531					CvMinorCivAI* pMinorCivAI = thisPlayer.GetMinorCivAI();5532					if(pMinorCivAI && pMinorCivAI->GetAlly() != NO_PLAYER)5533					{5534#if defined(MOD_API_EXTENSIONS)5535						changeAdjacentSight(GET_PLAYER(pMinorCivAI->GetAlly()).getTeam(), GC.getPLOT_VISIBILITY_RANGE(), true, NO_INVISIBLE, NO_DIRECTION);5536#else5537						changeAdjacentSight(GET_PLAYER(pMinorCivAI->GetAlly()).getTeam(), GC.getPLOT_VISIBILITY_RANGE(), true, NO_INVISIBLE, NO_DIRECTION, false);5538#endif5539					}5540				}55415542				if(area())5543				{5544					area()->changeNumOwnedTiles(1);5545				}5546				GC.getMap().changeOwnedPlots(1);55475548				if(!isWater())5549				{5550					GET_PLAYER(getOwner()).changeTotalLand(1);5551					GET_TEAM(getTeam()).changeTotalLand(1);55525553					if(isOwnershipScore())5554					{5555						GET_PLAYER(getOwner()).changeTotalLandScored(1);5556					}5557				}55585559				// Improvement is here5560				if(getImprovementType() != NO_IMPROVEMENT)5561				{5562					GET_PLAYER(eNewValue).changeImprovementCount(getImprovementType(), 1);55635564					// Add siphoned resources5565					CvImprovementEntry* pImprovementInfo = GC.getImprovementInfo(getImprovementType());5566					if (pImprovementInfo != NULL && pImprovementInfo->GetLuxuryCopiesSiphonedFromMinor() > 0)5567					{5568						if (GetPlayerThatBuiltImprovement() != NO_PLAYER)5569						{5570							if (GET_PLAYER(eNewValue).isMinorCiv())5571							{5572								GET_PLAYER(GetPlayerThatBuiltImprovement()).changeSiphonLuxuryCount(eNewValue, pImprovementInfo->GetLuxuryCopiesSiphonedFromMinor());5573							}5574						}5575					}55765577					// Maintenance change!5578					if(MustPayMaintenanceHere(eNewValue))5579					{5580						GET_PLAYER(eNewValue).GetTreasury()->ChangeBaseImprovementGoldMaintenance(GC.getImprovementInfo(getImprovementType())->GetGoldMaintenance());5581					}5582				}55835584				// Route is here5585				if(getRouteType() != NO_ROUTE && !isCity())5586				{5587					// Maintenance change!5588					if(MustPayMaintenanceHere(eNewValue))5589					{5590						GET_PLAYER(eNewValue).GetTreasury()->ChangeBaseImprovementGoldMaintenance(GC.getRouteInfo(getRouteType())->GetGoldMaintenance());5591					}5592				}55935594				if(getResourceType() != NO_RESOURCE)5595				{5596					// Add Resource Quantity to total5597					if(GET_TEAM(getTeam()).GetTeamTechs()->HasTech((TechTypes) GC.getResourceInfo(getResourceType())->getTechCityTrade()))5598					{5599						if(getImprovementType() != NO_IMPROVEMENT && GC.getImprovementInfo(getImprovementType())->IsImprovementResourceTrade(getResourceType()))5600						{5601							if(!IsImprovementPillaged())5602							{5603								GET_PLAYER(getOwner()).changeNumResourceTotal(getResourceType(), getNumResourceForPlayer(getOwner()));5604							}5605						}5606					}56075608					// Should we link the Resource here with a City so special Buildings may be constructed?5609					if(GetResourceLinkedCity() == NULL)5610					{5611						DoFindCityToLinkResourceTo();5612					}5613				}56145615				// update the high water mark for player (if human)5616				int iMaxCityHighWaterMark = GC.getMAX_CITY_DIST_HIGHWATER_MARK();5617				if(newPlayer.isHuman() && newPlayer.GetCityDistanceHighwaterMark() < iMaxCityHighWaterMark)5618				{5619					int bestHighWaterMark = newPlayer.GetCityDistanceHighwaterMark();5620					for(int iDX = -iMaxCityHighWaterMark; iDX <= iMaxCityHighWaterMark && bestHighWaterMark < iMaxCityHighWaterMark; iDX++)5621					{5622						for(int iDY = -iMaxCityHighWaterMark; iDY <= iMaxCityHighWaterMark && bestHighWaterMark < iMaxCityHighWaterMark; iDY++)5623						{5624							int hexRange;56255626							// I'm assuming iDX and iDY are in hex-space5627							if((iDX >= 0) == (iDY >= 0))  // the signs match5628							{5629								int iAbsDX = iDX >= 0 ? iDX : -iDX;5630								int iAbsDY = iDY >= 0 ? iDY : -iDY;5631								hexRange = iAbsDX + iAbsDY;5632							}5633							else5634							{5635								int iAbsDX = iDX >= 0 ? iDX : -iDX;5636								int iAbsDY = iDY >= 0 ? iDY : -iDY;5637								hexRange = iAbsDX >= iAbsDY ? iAbsDX : iAbsDY;5638							}56395640							if(hexRange > bestHighWaterMark && hexRange <= iMaxCityHighWaterMark)5641							{5642								CvPlot* pLoopPlot = plotXY(getX(), getY(), iDX, iDY);5643								if(pLoopPlot)5644								{5645									CvCity* thisCity = pLoopPlot->getPlotCity();5646									if(thisCity)5647									{5648										if(thisCity->getOwner() == eNewValue)5649										{5650											bestHighWaterMark = hexRange;5651										}5652									}5653								}5654							}5655						}5656					}5657					if(bestHighWaterMark > newPlayer.GetCityDistanceHighwaterMark())5658					{5659						newPlayer.SetCityDistanceHighwaterMark(bestHighWaterMark);5660						if(GC.GetEngineUserInterface()->isCityScreenUp())5661						{5662							auto_ptr<ICvCity1> pHeadSelectedCity(GC.GetEngineUserInterface()->getHeadSelectedCity());5663							if(pHeadSelectedCity.get())5664							{5665								CvCity* pkHeadSelectedCity = GC.UnwrapCityPointer(pHeadSelectedCity.get());5666								auto_ptr<ICvPlot1> pDllPlot = GC.WrapPlotPointer(pkHeadSelectedCity->plot());5667								GC.GetEngineUserInterface()->lookAt(pDllPlot.get(), CAMERALOOKAT_CITY_ZOOM_IN);5668							}5669						}5670					}5671				}56725673#if defined(MOD_EVENTS_TILE_IMPROVEMENTS)5674				if (MOD_EVENTS_TILE_IMPROVEMENTS) {5675					GAMEEVENTINVOKE_HOOK(GAMEEVENT_TileOwnershipChanged, getX(), getY(), getOwner(), eOldOwner);5676				}5677#endif5678			}56795680			pUnitNode = headUnitNode();56815682			for(iI = 0; iI < MAX_TEAMS; ++iI)5683			{5684				if(GET_TEAM((TeamTypes)iI).isAlive())5685				{5686					updateRevealedOwner((TeamTypes)iI);5687				}5688			}56895690			updateYield();56915692			// Update happiness if there's a luxury or natural wonder here5693			if(isOwned())5694			{5695				bool bShouldUpdateHappiness = false;56965697				if(getFeatureType() != NO_FEATURE)5698				{5699					if(GC.getFeatureInfo(getFeatureType())->IsNaturalWonder())5700					{5701						bShouldUpdateHappiness = true;5702					}5703				}57045705				if(!bShouldUpdateHappiness && getResourceType(getTeam()) != NO_RESOURCE)5706				{5707					if(GC.getResourceInfo(getResourceType(getTeam()))->getResourceUsage() == RESOURCEUSAGE_LUXURY)5708					{5709						if(getImprovementType() != NO_IMPROVEMENT)5710						{5711							bShouldUpdateHappiness = true;5712						}5713					}5714				}57155716				if(bShouldUpdateHappiness)5717				{5718					GET_PLAYER(getOwner()).DoUpdateHappiness();5719				}5720			}57215722			if(bCheckUnits)5723			{5724				verifyUnitValidPlot();5725			}57265727			if(GC.getGame().isDebugMode())5728			{5729				auto_ptr<ICvPlot1> pDllPlot = GC.WrapPlotPointer(this);5730				GC.GetEngineUserInterface()->UpdateCountryBorder(pDllPlot.get());5731			}5732		}57335734		auto_ptr<ICvPlot1> pDllPlot = GC.WrapPlotPointer(this);5735		GC.GetEngineUserInterface()->UpdateCountryBorder(pDllPlot.get());5736		GC.GetEngineUserInterface()->setDirty(NationalBorders_DIRTY_BIT, true);5737		updateSymbols();5738	}5739}

Calls

Called by