// From OccultManager protected static bool AddOccultType(OccultManager ths, OccultTypes type, bool addOutfit, bool isReward, bool fromRestore, OccultBaseClass overrideOccultToAdd) { OccultBaseClass newOccult = null; OccultBaseClass oldOccult = ths.VerifyOccultList(type); if (overrideOccultToAdd != null) { newOccult = overrideOccultToAdd; } else { switch (type) { case OccultTypes.Mummy: newOccult = new OccultMummy(); break; case OccultTypes.Frankenstein: newOccult = new OccultFrankenstein(); break; case OccultTypes.Vampire: newOccult = new OccultVampire(); break; case OccultTypes.ImaginaryFriend: OccultImaginaryFriend oldImFr = oldOccult as OccultImaginaryFriend; if (oldImFr == null) { newOccult = new OccultImaginaryFriend(); } else { newOccult = new OccultImaginaryFriend(oldImFr); } break; case OccultTypes.Unicorn: newOccult = new OccultUnicorn(); break; case OccultTypes.Fairy: newOccult = new OccultFairy(); break; case OccultTypes.Witch: newOccult = new OccultWitch(); break; case OccultTypes.Genie: newOccult = new OccultGenie(); break; case OccultTypes.Werewolf: newOccult = new OccultWerewolf(); break; case OccultTypes.PlantSim: newOccult = new OccultPlantSim(); break; case OccultTypes.Mermaid: newOccult = new OccultMermaid(); break; case OccultTypes.TimeTraveler: newOccult = new OccultTimeTraveler(); break; case OccultTypes.Robot: newOccult = new OccultRobot(); break; } } if (newOccult == null) { return false; } OccultTypes originalTypes = ths.mCurrentOccultTypes; Role assignedRole = ths.mOwnerDescription.AssignedRole; float alienDNAPercentage = ths.mOwnerDescription.AlienDNAPercentage; try { ths.mCurrentOccultTypes = OccultTypes.None; ths.mOwnerDescription.AssignedRole = null; ths.mOwnerDescription.mAlienDNAPercentage = 0f; if (!newOccult.CanAdd(ths.mOwnerDescription, fromRestore)) { return false; } } finally { ths.mCurrentOccultTypes = originalTypes; ths.mOwnerDescription.AssignedRole = assignedRole; ths.mOwnerDescription.mAlienDNAPercentage = alienDNAPercentage; } if ((ths.mOwnerDescription.SupernaturalData == null) || ((type == OccultTypes.Fairy) && (ths.mOwnerDescription.SupernaturalData.OccultType != OccultTypes.Fairy)) || ((type == OccultTypes.Robot) && (ths.mOwnerDescription.SupernaturalData.OccultType != OccultTypes.Robot)) || ((type == OccultTypes.PlantSim) && (ths.mOwnerDescription.SupernaturalData.OccultType != OccultTypes.PlantSim))) { ths.mOwnerDescription.AddSupernaturalData(type); } ths.mIsLifetimeReward = isReward; if (type == OccultTypes.Genie) { // Corrections for improper handling of the special outfits by OccultGenie if (ths.mOwnerDescription.mSpecialOutfitIndices == null) { ths.mOwnerDescription.mSpecialOutfitIndices = new Dictionary<uint, int>(); } addOutfit = false; } if (type == OccultTypes.Unicorn) { OccultUnicornEx.OnAddition(newOccult as OccultUnicorn, ths.mOwnerDescription, addOutfit); } ApplyTrait(ths.mOwnerDescription, type); MidlifeCrisisManager midlifeCrisisManager = ths.mOwnerDescription.MidlifeCrisisManager; try { // Inactive mummies don't agree with mid-life crisis managers ths.mOwnerDescription.MidlifeCrisisManager = null; newOccult.OnAddition(ths.mOwnerDescription, addOutfit, ths.mIsLifetimeReward, fromRestore); } finally { ths.mOwnerDescription.MidlifeCrisisManager = midlifeCrisisManager; } ths.mOccultList.Add(newOccult); ths.mCurrentOccultTypes |= type; EventTracker.SendEvent(new BeAnOccultEvent(EventTypeId.kBeAnOccult, ths.mOwnerDescription.CreatedSim, (uint)type)); if (ths.mOwnerDescription.CreatedSim != null) { if (!Cane.IsAllowedToUseCane(ths.mOwnerDescription.CreatedSim)) { Cane.StopUsingAnyActiveCanes(ths.mOwnerDescription.CreatedSim); } if (!Backpack.IsAllowedToUseBackpack(ths.mOwnerDescription.CreatedSim)) { Backpack.StopUsingAnyActiveBackpacks(ths.mOwnerDescription.CreatedSim); } if (!Jetpack.IsAllowedToUseJetpack(ths.mOwnerDescription.CreatedSim)) { Jetpack.StopUsingAnyActiveJetpacks(ths.mOwnerDescription.CreatedSim); } } (Responder.Instance.HudModel as Sims3.Gameplay.UI.HudModel).OnSimDaysPerAgingYearChanged(); ths.ClearOneShot(); ths.UpdateOccultUI(); if (!fromRestore) { EventTracker.SendEvent(EventTypeId.kBecameOccult, ths.mOwnerDescription.CreatedSim); } if (oldOccult != null) { newOccult.MergeOccultData(oldOccult); } if (ths.mOwnerDescription.CreatedSim != null) { Sim.StandingPosture standing = ths.mOwnerDescription.CreatedSim.Standing as Sim.StandingPosture; if (standing != null) { standing.SetDefaultIdleAnim(); } } return true; }
// From OccultManager protected static bool AddOccultType(OccultManager ths, OccultTypes type, bool addOutfit, bool isReward, bool fromRestore, OccultBaseClass overrideOccultToAdd) { OccultBaseClass newOccult = null; OccultBaseClass oldOccult = ths.VerifyOccultList(type); if (overrideOccultToAdd != null) { newOccult = overrideOccultToAdd; } else { switch (type) { case OccultTypes.Mummy: newOccult = new OccultMummy(); break; case OccultTypes.Frankenstein: newOccult = new OccultFrankenstein(); break; case OccultTypes.Vampire: newOccult = new OccultVampire(); break; case OccultTypes.ImaginaryFriend: OccultImaginaryFriend oldImFr = oldOccult as OccultImaginaryFriend; if (oldImFr == null) { newOccult = new OccultImaginaryFriend(); } else { newOccult = new OccultImaginaryFriend(oldImFr); } break; case OccultTypes.Unicorn: newOccult = new OccultUnicorn(); break; case OccultTypes.Fairy: newOccult = new OccultFairy(); break; case OccultTypes.Witch: newOccult = new OccultWitch(); break; case OccultTypes.Genie: newOccult = new OccultGenie(); break; case OccultTypes.Werewolf: newOccult = new OccultWerewolf(); break; case OccultTypes.PlantSim: newOccult = new OccultPlantSim(); break; case OccultTypes.Mermaid: newOccult = new OccultMermaid(); break; case OccultTypes.TimeTraveler: newOccult = new OccultTimeTraveler(); break; case OccultTypes.Robot: newOccult = new OccultRobot(); break; } } if (newOccult == null) { return(false); } OccultTypes originalTypes = ths.mCurrentOccultTypes; Role assignedRole = ths.mOwnerDescription.AssignedRole; float alienDNAPercentage = ths.mOwnerDescription.AlienDNAPercentage; try { ths.mCurrentOccultTypes = OccultTypes.None; ths.mOwnerDescription.AssignedRole = null; ths.mOwnerDescription.mAlienDNAPercentage = 0f; if (!newOccult.CanAdd(ths.mOwnerDescription, fromRestore)) { return(false); } } finally { ths.mCurrentOccultTypes = originalTypes; ths.mOwnerDescription.AssignedRole = assignedRole; ths.mOwnerDescription.mAlienDNAPercentage = alienDNAPercentage; } if ((ths.mOwnerDescription.SupernaturalData == null) || ((type == OccultTypes.Fairy) && (ths.mOwnerDescription.SupernaturalData.OccultType != OccultTypes.Fairy)) || ((type == OccultTypes.Robot) && (ths.mOwnerDescription.SupernaturalData.OccultType != OccultTypes.Robot)) || ((type == OccultTypes.PlantSim) && (ths.mOwnerDescription.SupernaturalData.OccultType != OccultTypes.PlantSim))) { ths.mOwnerDescription.AddSupernaturalData(type); } ths.mIsLifetimeReward = isReward; if (type == OccultTypes.Genie) { // Corrections for improper handling of the special outfits by OccultGenie if (ths.mOwnerDescription.mSpecialOutfitIndices == null) { ths.mOwnerDescription.mSpecialOutfitIndices = new Dictionary <uint, int>(); } addOutfit = false; } if (type == OccultTypes.Unicorn) { OccultUnicornEx.OnAddition(newOccult as OccultUnicorn, ths.mOwnerDescription, addOutfit); } ApplyTrait(ths.mOwnerDescription, type); MidlifeCrisisManager midlifeCrisisManager = ths.mOwnerDescription.MidlifeCrisisManager; try { // Inactive mummies don't agree with mid-life crisis managers ths.mOwnerDescription.MidlifeCrisisManager = null; newOccult.OnAddition(ths.mOwnerDescription, addOutfit, ths.mIsLifetimeReward, fromRestore); } finally { ths.mOwnerDescription.MidlifeCrisisManager = midlifeCrisisManager; } ths.mOccultList.Add(newOccult); ths.mCurrentOccultTypes |= type; EventTracker.SendEvent(new BeAnOccultEvent(EventTypeId.kBeAnOccult, ths.mOwnerDescription.CreatedSim, (uint)type)); if (ths.mOwnerDescription.CreatedSim != null) { if (!Cane.IsAllowedToUseCane(ths.mOwnerDescription.CreatedSim)) { Cane.StopUsingAnyActiveCanes(ths.mOwnerDescription.CreatedSim); } if (!Backpack.IsAllowedToUseBackpack(ths.mOwnerDescription.CreatedSim)) { Backpack.StopUsingAnyActiveBackpacks(ths.mOwnerDescription.CreatedSim); } if (!Jetpack.IsAllowedToUseJetpack(ths.mOwnerDescription.CreatedSim)) { Jetpack.StopUsingAnyActiveJetpacks(ths.mOwnerDescription.CreatedSim); } } (Responder.Instance.HudModel as Sims3.Gameplay.UI.HudModel).OnSimDaysPerAgingYearChanged(); ths.ClearOneShot(); ths.UpdateOccultUI(); if (!fromRestore) { EventTracker.SendEvent(EventTypeId.kBecameOccult, ths.mOwnerDescription.CreatedSim); } if (oldOccult != null) { newOccult.MergeOccultData(oldOccult); } if (ths.mOwnerDescription.CreatedSim != null) { Sim.StandingPosture standing = ths.mOwnerDescription.CreatedSim.Standing as Sim.StandingPosture; if (standing != null) { standing.SetDefaultIdleAnim(); } } return(true); }
public static bool Remove(SimDescription sim, OccultTypes type, bool alterOutfit) { if (sim.OccultManager == null) { return(false); } if (sim.CreatedSim != null) { try { if (sim.CreatedSim.CurrentOutfitCategory == OutfitCategories.Special) { sim.CreatedSim.SwitchToOutfitWithoutSpin(OutfitCategories.Everyday); } } catch { } } OccultVampire vampire = sim.OccultManager.GetOccultType(type) as OccultVampire; if (vampire != null) { if ((vampire.mOwningSim == null) || (vampire.mOwningSim.MapTagManager == null)) { vampire.mPreyMapTag = null; } } if (sim.GetOutfitCount(OutfitCategories.Everyday) == 1) { SimOutfit outfit = sim.GetOutfit(OutfitCategories.Everyday, 0); using (CASParts.OutfitBuilder builder = new CASParts.OutfitBuilder(sim, new CASParts.Key(OutfitCategories.Everyday, 1), outfit)) { } } if (type == OccultTypes.Unicorn) { OccultUnicornEx.OnRemoval(sim); } bool success = false; OccultManager occultManager = sim.OccultManager; try { if (occultManager.HasOccultType(type)) { occultManager.mCurrentOccultTypes ^= type; foreach (OccultBaseClass occultClass in occultManager.mOccultList) { if (type == occultClass.ClassOccultType) { if ((occultManager.mOwnerDescription.SupernaturalData != null) && (occultManager.mOwnerDescription.SupernaturalData.OccultType == type)) { occultManager.mOwnerDescription.RemoveSupernaturalData(); } OccultGenie genie = occultClass as OccultGenie; if (genie != null) { OccultGenieEx.OnRemoval(genie, occultManager.mOwnerDescription, alterOutfit); } else { OccultPlantSim plantSim = occultClass as OccultPlantSim; if (plantSim != null) { OccultPlantSimEx.OnRemoval(plantSim, occultManager.mOwnerDescription, alterOutfit); } else { occultClass.OnRemoval(occultManager.mOwnerDescription); } } occultManager.mOccultList.Remove(occultClass); occultManager.mIsLifetimeReward = false; if (occultManager.mOccultList.Count == 0x0) { occultManager.mOccultList = null; } break; } } (Responder.Instance.HudModel as Sims3.Gameplay.UI.HudModel).OnSimDaysPerAgingYearChanged(); occultManager.UpdateOccultUI(); EventTracker.SendEvent(EventTypeId.kLostOccult, occultManager.mOwnerDescription.CreatedSim); } //occultManager.RemoveOccultType(type); success = true; } catch (Exception e) { bool showError = true; switch (type) { case OccultTypes.Genie: case OccultTypes.ImaginaryFriend: if (sim.CreatedSim == null) { showError = false; } break; } if (showError) { Common.Exception(sim, e); } } if (!success) { for (int i = occultManager.mOccultList.Count - 1; i >= 0; i--) { if (type == occultManager.mOccultList[i].ClassOccultType) { occultManager.mOccultList.RemoveAt(i); } (Sims3.UI.Responder.Instance.HudModel as Sims3.Gameplay.UI.HudModel).OnSimDaysPerAgingYearChanged(); sim.OccultManager.UpdateOccultUI(); } } TraitNames trait = TraitFromOccult(type); if (trait != TraitNames.Unknown) { sim.TraitManager.RemoveElement(trait); } return(success); }
public static void OnRemoval(OccultPlantSim ths, SimDescription simDes, bool alterOutfit) { Sim createdSim = simDes.CreatedSim; int index = simDes.HasOutfit(OutfitCategories.Everyday, ths.mOccultOutfitKey); if (index >= 0x0) { simDes.RemoveOutfit(OutfitCategories.Everyday, index, true); } if (createdSim != null) { createdSim.Motives.RemoveMotive(CommodityKind.BePlantSim); createdSim.Motives.EnableMotive(CommodityKind.Bladder); createdSim.Motives.EnableMotive(CommodityKind.Hunger); createdSim.BuffManager.RemoveElement(BuffNames.PlantSimDehydrated); createdSim.BuffManager.RemoveElement(BuffNames.PlantSimHydrated); createdSim.TraitManager.RemoveElement(TraitNames.PlantSim); ActiveTopic.RemoveTopicFromSim(createdSim, "PlantSim Trait Topic"); createdSim.Motives.UpdateMotives(1f, createdSim); (createdSim.RoutingComponent as SimRoutingComponent).RemoveOccultWalkingEffects(OccultTypes.PlantSim); ResourceKey skinToneKey = new ResourceKey(0xe8a7d5f0fec3d90bL, 0x354796a, 0x0); if (ths.mOldSkinToneKey != ResourceKey.kInvalidResourceKey) { skinToneKey = ths.mOldSkinToneKey; } if (alterOutfit) { simDes.SetSkinAndHairForAllOutfits(simDes.Age, skinToneKey, ths.mOldSkinIndex, ResourceKey.kInvalidResourceKey, true, ths.mOldHairColor); simDes.RemoveBodyTypeFromAllOutfits(BodyTypes.BirthMark); simDes.RemoveBodyTypeFromAllOutfits(BodyTypes.Beard); } HudModel hudModel = Responder.Instance.HudModel as HudModel; if ((hudModel != null) && (hudModel.GetSimInfo(createdSim.ObjectId) != null)) { if (alterOutfit) { SimBuilder builder = new SimBuilder(); builder.Clear(); SimOutfit outfit = simDes.GetOutfit(OutfitCategories.Everyday, 0x0); OutfitUtils.SetOutfit(builder, outfit, null); OutfitUtils.ExtractOutfitHairColor(simDes, builder); ths.mOutfitIsReady = false; createdSim.SwitchToOutfitDelayed(outfit, new CASUtils.SwapReadyCallback(ths.PlayConcealEffectAndSwapOutfit)); for (int i = 0x0; !ths.mOutfitIsReady && (i < 0xc350); i++) { Common.Sleep(0xa); } ths.SwapOutfit(); } hudModel.OnSimAppearanceChanged(createdSim.ObjectId); hudModel.NotifyNameChanged(createdSim.ObjectId); } else { createdSim.SwitchToOutfitWithoutSpin(Sim.ClothesChangeReason.Force, createdSim.CurrentOutfitCategory, true); } createdSim.Motives.RemoveMotive(CommodityKind.BePlantSim); createdSim.Motives.EnableMotive(CommodityKind.Bladder); createdSim.Motives.EnableMotive(CommodityKind.Hunger); createdSim.BuffManager.RemoveElement(BuffNames.PlantSimDehydrated); createdSim.BuffManager.RemoveElement(BuffNames.PlantSimHydrated); createdSim.TraitManager.RemoveElement(TraitNames.PlantSim); ActiveTopic.RemoveTopicFromSim(createdSim, "PlantSim Trait Topic"); hudModel.NotifyNameChanged(createdSim.ObjectId); createdSim.Motives.UpdateMotives(1f, createdSim); } }