/// <summary>Does the ingestion outcome special.</summary> /// <param name="pawn">The pawn.</param> /// <param name="ingested">The ingested.</param> protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested) { var gComp = Find.World.GetComponent <PawnmorphGameComp>(); var status = gComp.GetPawnStatus(pawn); if (status == TransformedStatus.Transformed) { foreach (MutagenDef mutagenDef in DefDatabase <MutagenDef> .AllDefs) { if (blackList.Contains(mutagenDef)) { return; // Make it so this reverted can not revert certain kinds of transformations. } if (mutagenDef.MutagenCached.TryRevert(pawn)) { return; } } } TransformerUtility.RemoveAllMutations(pawn); pawn.RefreshGraphics(); AspectTracker aT = pawn.GetAspectTracker(); if (aT != null) { RemoveAspects(aT); } }
private void TransformPawn(Pawn pawn) { TransformationRequest request; Mutagen mutagen; switch (_state) { case ChamberState.Transforming: request = new TransformationRequest(pawnTFKind, pawn) { forcedGender = TFGender.Switch, forcedGenderChance = 50, manhunterSettingsOverride = ManhunterTfSettings.Never, factionResponsible = Faction, forcedFaction = Faction }; mutagen = MutagenDefOf.defaultMutagen.MutagenCached; break; case ChamberState.MergeInto: request = new TransformationRequest(pawnTFKind, pawn, (Pawn)linkTo.innerContainer[0]) { forcedGender = TFGender.Switch, forcedGenderChance = 50, manhunterSettingsOverride = ManhunterTfSettings.Never, factionResponsible = Faction, forcedFaction = Faction }; mutagen = MutagenDefOf.MergeMutagen.MutagenCached; break; case ChamberState.MergeOutOf: return; case ChamberState.Idle: default: throw new ArgumentOutOfRangeException(); } TransformedPawn pmInst = mutagen.Transform(request); if (pmInst == null) { Log.Error($"mutagenic chamber could not transform pawns {string.Join(",",request.originals.Select(p => p.Name.ToStringFull).ToArray())} using mutagen {mutagen.def.defName}"); return; } SendLetter(pawn); base.EjectContents(); if (_state == ChamberState.MergeInto) { linkTo.EjectContents(); } foreach (Pawn pmInstOriginalPawn in pmInst.OriginalPawns) { if (pmInstOriginalPawn == null) { continue; } TransformerUtility.CleanUpHumanPawnPostTf(pmInstOriginalPawn, null); } foreach (Pawn pmInstOriginalPawn in pmInst.OriginalPawns) { pmInstOriginalPawn.DeSpawn(); } var comp = Find.World.GetComponent <PawnmorphGameComp>(); comp.AddTransformedPawn(pmInst); Find.TickManager.slower.SignalForceNormalSpeedShort(); PawnComponentsUtility.AddComponentsForSpawn(pmInst.TransformedPawns.First()); pawn.ownership.UnclaimAll(); if (modulator != null) { modulator.triggered = true; if (modulator.merging) { modulator.merging = false; modulator.random = true; } } if (!Destroyed) { SoundDefOf.CryptosleepCasket_Eject.PlayOneShot(SoundInfo.InMap(new TargetInfo(base.Position, base.Map))); fuelComp.ConsumeFuel(fuelComp.Fuel); } }