Hooks
static bool BeforeCvUnit_read(CvUnit* self, FDataStream& kStream);static void AfterCvUnit_read(CvUnit* self, FDataStream& kStream);static void ReplaceCvUnit_read(void (*original)(CvUnit*, FDataStream&), CvUnit* self, FDataStream& kStream);CivRegisterBefore<CivHooks::CvUnit_read>(host, &BeforeCvUnit_read);CivRegisterAfter<CivHooks::CvUnit_read>(host, &AfterCvUnit_read);CivRegisterReplace<CivHooks::CvUnit_read>(host, &ReplaceCvUnit_read);
Code
21272void CvUnit::read(FDataStream& kStream)21273{21274 VALIDATE_OBJECT21275 // Init data before load21276 reset();2127721278 // Version number to maintain backwards compatibility21279 uint uiVersion;21280 kStream >> uiVersion;21281 MOD_SERIALIZE_INIT_READ(kStream);2128221283 // all FAutoVariables in the m_syncArchive will be read21284 // automagically, no need to explicitly load them here21285 kStream >> m_syncArchive;2128621287 // anything not in m_syncArchive needs to be explicitly21288 // read2128921290 // The 'automagic' sync archive saves out the unit type index, which is bad since that can change.21291 // Read in the hash and update the value.21292 {21293 uint idUnitType;21294 kStream >> idUnitType;21295 if (idUnitType != 0)21296 {21297 UnitTypes eUnitIndex = (UnitTypes)GC.getInfoTypeForHash(idUnitType);21298 if (NO_UNIT != eUnitIndex)21299 m_eUnitType = eUnitIndex;21300 }21301 }2130221303 kStream >> m_iLastMoveTurn;21304#if defined(MOD_API_UNIT_STATS)21305 MOD_SERIALIZE_READ(73, kStream, m_iStatsTravelled, 0);21306 MOD_SERIALIZE_READ(73, kStream, m_iStatsKilled, 0);21307#endif21308 m_Promotions.Read(kStream);21309 m_pUnitInfo = (NO_UNIT != m_eUnitType) ? GC.getUnitInfo(m_eUnitType) : NULL;21310 kStream >> m_combatUnit.eOwner;21311 kStream >> m_combatUnit.iID;21312 kStream >> m_transportUnit.eOwner;21313 kStream >> m_transportUnit.iID;21314 kStream >> m_missionAIUnit.eOwner;21315 kStream >> m_missionAIUnit.iID;21316 kStream >> m_extraDomainModifiers;21317 kStream >> m_iEverSelectedCount;21318 kStream >> m_iMapLayer;21319 if (uiVersion >= 9)21320 {21321 kStream >> m_iNumGoodyHutsPopped;21322 }21323 else21324 {21325 m_iNumGoodyHutsPopped = 0;21326 }2132721328 kStream >> m_bIgnoreDangerWakeup;2132921330 kStream >> m_iEmbarkedAllWaterCount;21331 kStream >> m_iEmbarkExtraVisibility;2133221333#if defined(MOD_PROMOTIONS_DEEP_WATER_EMBARKATION)21334 MOD_SERIALIZE_READ(23, kStream, m_iEmbarkedDeepWaterCount, 0);21335#endif21336 kStream >> m_iEmbarkDefensiveModifier;2133721338#if defined(MOD_API_EXTENSIONS)21339 MOD_SERIALIZE_READ(58, kStream, m_iBaseRangedCombat, ((NO_UNIT != m_eUnitType) ? m_pUnitInfo->GetRangedCombat() : 0));21340#endif2134121342 kStream >> m_iCapitalDefenseModifier;21343 kStream >> m_iCapitalDefenseFalloff;2134421345 kStream >> m_iCityAttackPlunderModifier;2134621347 kStream >> m_iReligiousStrengthLossRivalTerritory;2134821349 kStream >> m_iTradeMissionInfluenceModifier;21350 kStream >> m_iTradeMissionGoldModifier;2135121352 kStream >> m_iEnemyDamageChance;21353 kStream >> m_iNeutralDamageChance;2135421355 kStream >> m_iEnemyDamage;21356 kStream >> m_iNeutralDamage;2135721358 kStream >> m_iNearbyEnemyCombatMod;21359 kStream >> m_iNearbyEnemyCombatRange;2136021361 kStream >> m_iHealOnPillageCount;21362 kStream >> m_iFlankAttackModifier;2136321364 if (uiVersion >= 3)21365 {21366 kStream >> m_iGoldenAgeValueFromKills;21367 }21368 else21369 {21370 m_iGoldenAgeValueFromKills = 0;21371 }2137221373 kStream >> m_iGreatGeneralReceivesMovementCount;21374 kStream >> m_iGreatGeneralCombatModifier;21375 kStream >> m_iIgnoreGreatGeneralBenefit;2137621377 if (uiVersion >= 8)21378 {21379 kStream >> m_iIgnoreZOC;21380 }21381 else21382 {21383 m_iIgnoreZOC = 0;21384 }2138521386#if defined(MOD_UNITS_NO_SUPPLY)21387 MOD_SERIALIZE_READ(77, kStream, m_iNoSupply, 0);21388#endif2138921390#if defined(MOD_UNITS_MAX_HP)21391 MOD_SERIALIZE_READ(78, kStream, m_iMaxHitPointsBase, m_pUnitInfo->GetMaxHitPoints());21392 MOD_SERIALIZE_READ(77, kStream, m_iMaxHitPointsChange, 0);21393 MOD_SERIALIZE_READ(77, kStream, m_iMaxHitPointsModifier, 0)21394#endif2139521396 if (uiVersion >= 2)21397 {21398 kStream >> m_iSapperCount;21399 }21400 else21401 {21402 m_iSapperCount = 0;21403 }2140421405 kStream >> m_iCanHeavyCharge;2140621407 if (uiVersion >= 5)21408 {21409 kStream >> m_iNumExoticGoods;21410 }21411 else21412 {21413 m_iNumExoticGoods = 0;21414 }2141521416#if defined(MOD_UNITS_XP_TIMES_100)21417 MOD_SERIALIZE_READ(74, kStream, m_iExperienceTimes100, m_iExperience * 100);21418#endif2141921420 kStream >> m_iCityAttackOnlyCount;2142121422 kStream >> m_iCaptureDefeatedEnemyCount;2142321424 kStream >> m_iGreatAdmiralCount;2142521426#if defined(MOD_PROMOTIONS_AURA_CHANGE)21427 MOD_SERIALIZE_READ(83, kStream, m_iAuraRangeChange, 0);21428 MOD_SERIALIZE_READ(83, kStream, m_iAuraEffectChange, 0);21429#endif2143021431#if defined(MOD_PROMOTIONS_UNIT_NAMING)21432 MOD_SERIALIZE_READ(46, kStream, m_strUnitName, getNameKey());21433#endif21434 kStream >> m_strName;21435#if defined(MOD_GLOBAL_NO_LOST_GREATWORKS)21436 MOD_SERIALIZE_READ(84, kStream, m_strGreatName, "");21437#endif2143821439 kStream >> m_iScenarioData;2144021441 kStream >> *m_pReligion;2144221443 m_eGreatWork = NO_GREAT_WORK;21444 if(uiVersion > 3)21445 {21446 if(uiVersion > 5)21447 {21448 uint uiGreatWorkType = 0;21449 kStream >> uiGreatWorkType;21450 21451 if (uiGreatWorkType != 0)21452 {21453 m_eGreatWork = (GreatWorkType)GC.getInfoTypeForHash(uiGreatWorkType);21454 }21455 }21456 else21457 {21458 CvString strGreatWorkType;21459 kStream >> strGreatWorkType;21460 m_eGreatWork = static_cast<GreatWorkType>(GC.getInfoTypeForString(strGreatWorkType.c_str()));21461 }21462 }2146321464 if (uiVersion >= 7)21465 {21466 kStream >> m_iTourismBlastStrength;21467 }21468 else21469 {21470 m_iTourismBlastStrength = 0;21471 }2147221473 // Read mission queue21474 UINT uSize;21475 kStream >> uSize;21476 for(UINT uIdx = 0; uIdx < uSize; ++uIdx)21477 {21478 MissionQueueNode Node;2147921480 kStream >> Node.eMissionType;21481 kStream >> Node.iData1;21482 kStream >> Node.iData2;21483 kStream >> Node.iFlags;21484 kStream >> Node.iPushTurn;2148521486 m_missionQueue.insertAtEnd(&Node);21487 }2148821489 // Re-attach to the map layer.21490 if (m_iMapLayer != DEFAULT_UNIT_MAP_LAYER)21491 {21492 GC.getMap().plotManager().AddUnit(GetIDInfo(), m_iX, m_iY, m_iMapLayer);21493 }21494}