Hooks
static bool BeforeCvUnit_createGreatWork(CvUnit* self, bool& result);static void AfterCvUnit_createGreatWork(CvUnit* self, bool& result);static bool ReplaceCvUnit_createGreatWork(bool (*original)(CvUnit*), CvUnit* self);CivRegisterBefore<CivHooks::CvUnit_createGreatWork>(host, &BeforeCvUnit_createGreatWork);CivRegisterAfter<CivHooks::CvUnit_createGreatWork>(host, &AfterCvUnit_createGreatWork);CivRegisterReplace<CivHooks::CvUnit_createGreatWork>(host, &ReplaceCvUnit_createGreatWork);
Code
7205bool CvUnit::createGreatWork()7206{7207 CvPlot* pPlot = plot();7208 if (!canCreateGreatWork(pPlot, false))7209 {7210 return false;7211 }72127213 CvGameCulture *pCulture = GC.getGame().GetGameCulture();7214 if(pCulture == NULL)7215 {7216 CvAssertMsg(pCulture != NULL, "This should never happen.");7217 return false;7218 }7219 7220#if defined(MOD_BUGFIX_USE_GETTERS)7221 CvPlayer &kPlayer = GET_MY_PLAYER();7222#else7223 CvPlayer &kPlayer = GET_PLAYER(m_eOwner);7224#endif7225 BuildingClassTypes eBuildingClass = NO_BUILDINGCLASS; // Passed by reference below7226 int iSlot = -1; // Passed by reference below7227 GreatWorkType eGreatWorkType = GetGreatWork();7228 GreatWorkClass eClass = CultureHelpers::GetGreatWorkClass(eGreatWorkType);7229 GreatWorkSlotType eGreatWorkSlot = CultureHelpers::GetGreatWorkSlot(eGreatWorkType);7230 7231 CvCity *pCity = kPlayer.GetCulture()->GetClosestAvailableGreatWorkSlot(getX(), getY(), eGreatWorkSlot, &eBuildingClass, &iSlot);7232 if (pCity)7233 {7234#if defined(MOD_BUGFIX_USE_GETTERS)7235 int iGWindex = pCulture->CreateGreatWork(eGreatWorkType, eClass, getOwner(), kPlayer.GetCurrentEra(), getName());7236#else7237 int iGWindex = pCulture->CreateGreatWork(eGreatWorkType, eClass, m_eOwner, kPlayer.GetCurrentEra(), getName());7238#endif7239 pCity->GetCityBuildings()->SetBuildingGreatWork(eBuildingClass, iSlot, iGWindex);72407241 if(pPlot->isActiveVisible(false))7242 {7243 auto_ptr<ICvUnit1> pDllUnit(new CvDllUnit(this));7244 gDLL->GameplayUnitActivate(pDllUnit.get());7245 }72467247 if(IsGreatPerson())7248 {7249#if defined(MOD_EVENTS_GREAT_PEOPLE)7250 kPlayer.DoGreatPersonExpended(getUnitType(), this);7251#else7252 kPlayer.DoGreatPersonExpended(getUnitType());7253#endif7254 }72557256 kill(true);72577258 bool bDontShowRewardPopup = GC.GetEngineUserInterface()->IsOptionNoRewardPopups();7259 Localization::String localizedText;72607261 // Notification in MP games7262#if defined(MOD_API_EXTENSIONS)7263 if(bDontShowRewardPopup || GC.getGame().isReallyNetworkMultiPlayer())7264#else7265 if(bDontShowRewardPopup || GC.getGame().isNetworkMultiPlayer())7266#endif7267 {7268 CvNotifications* pNotifications = kPlayer.GetNotifications();7269 if(pNotifications)7270 {7271 localizedText = Localization::Lookup("TXT_KEY_MISC_WONDER_COMPLETED");7272 localizedText << kPlayer.getNameKey() << pCulture->GetGreatWorkName(iGWindex);7273 pNotifications->Add(NOTIFICATION_GREAT_WORK_COMPLETED_ACTIVE_PLAYER, localizedText.toUTF8(), localizedText.toUTF8(), getX(), getY(), iGWindex, kPlayer.GetID());7274 }7275 }7276 // Popup in SP games7277 else7278 {7279 if(kPlayer.GetID() == GC.getGame().getActivePlayer())7280 {7281 CvPopupInfo kPopup(BUTTONPOPUP_GREAT_WORK_COMPLETED_ACTIVE_PLAYER, iGWindex);7282 GC.GetEngineUserInterface()->AddPopup(kPopup);7283 }7284 }72857286 return true;7287 }72887289 return false;7290}