public static Mesh GetAlienPawnMesh(bool portrait, Pawn pawn, Rot4 facing, bool wantsBody) { AlienRace.AlienPartGenerator.AlienComp comp = pawn.GetComp <AlienRace.AlienPartGenerator.AlienComp>(); if (comp == null) { if (!wantsBody) { return(MeshPool.humanlikeHeadSet.MeshAt(facing)); } return(MeshPool.humanlikeBodySet.MeshAt(facing)); } else if (!portrait) { if (!wantsBody) { return(comp.alienHeadGraphics.headSet.MeshAt(facing)); } return(comp.alienGraphics.bodySet.MeshAt(facing)); } else { if (!wantsBody) { return(comp.alienPortraitHeadGraphics.headSet.MeshAt(facing)); } return(comp.alienPortraitGraphics.bodySet.MeshAt(facing)); } }
static void AlienRacesPatch(ref PawnRenderer __instance, Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, Rot4 headFacing, out Mesh mesh, RotDrawMode bodyDrawType = RotDrawMode.Fresh, bool portrait = false, bool headStump = false) { mesh = null; Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); AlienRace.ThingDef_AlienRace alienDef = pawn.def as AlienRace.ThingDef_AlienRace; if (alienDef != null) { Mesh mesh2; if (bodyDrawType == RotDrawMode.Rotting) { if (__instance.graphics.dessicatedGraphic.ShouldDrawRotated) { mesh2 = MeshPool.GridPlane(portrait ? alienDef.alienRace.generalSettings.alienPartGenerator.customPortraitDrawSize : alienDef.alienRace.generalSettings.alienPartGenerator.customDrawSize); } else { Vector2 size = portrait ? alienDef.alienRace.generalSettings.alienPartGenerator.customPortraitDrawSize : alienDef.alienRace.generalSettings.alienPartGenerator.customDrawSize; if (bodyFacing.IsHorizontal) { size = size.Rotated(); } if (bodyFacing == Rot4.West && (__instance.graphics.dessicatedGraphic.data == null || __instance.graphics.dessicatedGraphic.data.allowFlip)) { mesh = MeshPool.GridPlaneFlip(size); } mesh = MeshPool.GridPlane(size); } } else { AlienRace.AlienPartGenerator.AlienComp comp = pawn.TryGetComp <AlienRace.AlienPartGenerator.AlienComp>(); if (comp != null) { mesh = (portrait ? comp.alienPortraitGraphics.bodySet.MeshAt(bodyFacing) : comp.alienGraphics.bodySet.MeshAt(bodyFacing)); } } } else { if (pawn.RaceProps.Humanlike) { mesh = MeshPool.humanlikeBodySet.MeshAt(bodyFacing); } else { mesh = __instance.graphics.nakedGraphic.MeshAt(bodyFacing); } } }
public static void AlienRacesPatch(Pawn pawn, Rot4 bodyFacing, out Vector2 size, bool portrait) { AlienRace.ThingDef_AlienRace alienDef = pawn.def as AlienRace.ThingDef_AlienRace; Vector2 d; if (alienDef != null) { AlienRace.AlienPartGenerator.AlienComp comp = pawn.TryGetCompFast <AlienRace.AlienPartGenerator.AlienComp>(); if (comp != null) { // d = (portrait ? comp.alienPortraitGraphics.bodySet.MeshAt(bodyFacing).bounds.size : comp.alienGraphics.bodySet.MeshAt(bodyFacing).bounds.size); d = (portrait ? comp.customPortraitDrawSize : comp.customDrawSize); size = new Vector2(d.x * 1.5f, d.y * 1.5f); return; } } size = new Vector2(1.5f, 1.5f); return; }
private void TransformPawn(bool changeDef = true, bool keep = false) { //sets position, faction and map IntVec3 intv = parent.pawn.Position; Faction faction = parent.pawn.Faction; Map map = parent.pawn.Map; RegionListersUpdater.DeregisterInRegions(parent.pawn, map); //Change Race to Props.raceDef var thingDef = Props.raceDef ?? null; if (changeDef && thingDef != null && thingDef != parent.pawn.def) { parent.pawn.def = thingDef; long ageB = Pawn.ageTracker.AgeBiologicalTicks; long ageC = Pawn.ageTracker.AgeChronologicalTicks; Pawn.ageTracker = new Pawn_AgeTracker(Pawn); Pawn.ageTracker.AgeBiologicalTicks = ageB; Pawn.ageTracker.AgeChronologicalTicks = ageC; AlienRace.ThingDef_AlienRace alienRace = (AlienRace.ThingDef_AlienRace)thingDef; AlienRace.AlienPartGenerator.AlienComp alien = parent.pawn.TryGetComp <AlienRace.AlienPartGenerator.AlienComp>(); if (Props.colourSkinTwo || Props.colourSkin) { if (Props.colourSkin) { if (alien != null) { alien.skinColor = alienRace.alienRace.generalSettings.alienPartGenerator.SkinColor(parent.pawn); } } if (Props.colourSkinTwo) { if (alien != null) { alien.skinColorSecond = alienRace.alienRace.generalSettings.alienPartGenerator.SkinColor(parent.pawn, false); } } parent.pawn.Notify_ColorChanged(); } if (Props.removeHair) { parent.pawn.story.hairDef = PawnHairChooser.RandomHairDefFor(Pawn, noHairFaction); } else { if (Props.colourHairTwo || Props.colourHair) { if (Props.colourHair) { if (alien != null) { Pawn.story.hairColor = alienRace.alienRace.generalSettings.alienPartGenerator.alienhaircolorgen.NewRandomizedColor();; } } if (Props.colourHairTwo) { if (alien != null) { alien.hairColorSecond = alienRace.alienRace.generalSettings.alienPartGenerator.alienhaircolorgen.NewRandomizedColor(); } } parent.pawn.Notify_ColorChanged(); } } string head = alienRace.alienRace.graphicPaths.GetCurrentGraphicPath(Pawn.ageTracker.CurLifeStageRace.def).head; Traverse.Create(Pawn.story).Field("headGraphicPath").SetValue(alienRace.alienRace.generalSettings.alienPartGenerator.RandomAlienHead(head, Pawn)); } //Remove Disallowed Traits int maxTraits; if (MoreTraitSlotsUtil.TryGetMaxTraitSlots(out int max)) { maxTraits = max; } else { maxTraits = 4; } if (parent.pawn.story.traits.allTraits.Any(x => Props.traitsToRemove.Any(y => y.def == x.def))) { foreach (ExtendedTraitEntry item in Props.traitsToRemove) { if (parent.pawn.story.traits.HasTrait(item.def)) { Rand.PushState(); if (Rand.Chance(item.Chance)) { parent.pawn.story.traits.allTraits.Remove(parent.pawn.story.traits.allTraits.Find(x => x.def == item.def)); } Rand.PopState(); } } } if (Props.traitsToAdd.Any(x => !parent.pawn.story.traits.HasTrait(x.def))) { foreach (ExtendedTraitEntry item in Props.traitsToAdd) { if (!parent.pawn.story.traits.HasTrait(item.def)) { Rand.PushState(); if (Rand.Chance(item.Chance)) { bool replace = false; int countTraits = parent.pawn.story.traits.allTraits.Count; if (countTraits >= maxTraits) { replace = true; } // Log.Message(string.Format("i have {0} of a max of {1} traits", countTraits, maxTraits)); Trait replacedTrait = parent.pawn.story.traits.allTraits.Where(x => Props.traitsToAdd.Any(y => y.def != x.def)).RandomElement(); if (replace) { parent.pawn.story.traits.allTraits.Remove(replacedTrait); } parent.pawn.story.traits.allTraits.Add(new Trait(item.def, item.degree)); } Rand.PopState(); } } } RegionListersUpdater.RegisterInRegions(parent.pawn, map); map.mapPawns.UpdateRegistryForPawn(parent.pawn); //Change BodyType to Props.bodyTypeDef if (!Pawn.RaceProps.hasGenders) { Pawn.gender = Gender.None; } if (Props.bodyTypeDef != null) { ChangeBodyType(parent.pawn, Props.bodyTypeDef); } //decache graphics parent.pawn.Drawer.renderer.graphics.ResolveAllGraphics(); Find.ColonistBar.drawer.Notify_RecachedEntries(); //save the pawn parent.pawn.ExposeData(); if (parent.pawn.Faction != faction) { parent.pawn.SetFaction(faction); } // pawn.Position = intv; }