public static bool RenderVampire(PawnRenderer __instance, Vector3 rootLoc, float angle, bool renderBody, Rot4 bodyFacing, RotDrawMode bodyDrawType, PawnRenderFlags flags) { Quaternion quat = Quaternion.AngleAxis(angle, Vector3.up); Pawn p = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (p?.Map?.GetComponent <MapComponent_HiddenTracker>()?.hiddenCharacters?.Contains(p) ?? false) { //<texPath>Things/Pawn/Animal/Tenebrous/tenebrous</texPath> //<drawSize>2.0</drawSize> if (VampireGraphicUtility.invisibleForm == null) { var graphicData = new GraphicData(); graphicData.drawSize = new Vector2(2, 2); graphicData.texPath = "Things/Pawn/Hidden/hidden"; VampireGraphicUtility.invisibleForm = graphicData.Graphic; } __instance.graphics.nakedGraphic = VampireGraphicUtility.invisibleForm; return(false); } if (p?.Map?.GetComponent <MapComponent_HiddenTracker>()?.toRemoveCharacters?.Contains(p) ?? false) { __instance.graphics.nakedGraphic = null; if (p.IsVampire() && p.VampComp() is CompVampire vampCompy) { vampCompy.atDirty = true; } p?.Map?.GetComponent <MapComponent_HiddenTracker>()?.toRemoveCharacters.Remove(p); //return false; } if (p?.VampComp() is CompVampire v) { if (v.Transformed) { if (__instance.graphics.nakedGraphic == null || v.CurFormGraphic == null || v.atDirty) { if (v.CurrentForm != null) { if (v.CurrentForm.GetCompProperties <CompAnimated.CompProperties_Animated>() is CompAnimated.CompProperties_Animated Props) { Graphic curGraphic = v.CurFormGraphic; v.CurFormGraphic = CompAnimated.CompAnimated.ResolveCurGraphic(p, Props, ref curGraphic, ref v.atCurIndex, ref v.atCurTicks, ref v.atDirty, false); } else { v.CurFormGraphic = v.CurrentForm.bodyGraphicData.Graphic; } } else { v.CurFormGraphic = p.kindDef.lifeStages[p.ageTracker.CurLifeStageIndex].bodyGraphicData.Graphic;// v.CurrentForm.lifeStages[0].bodyGraphicData.Graphic; } __instance.graphics.nakedGraphic = v.CurFormGraphic; __instance.graphics.ResolveApparelGraphics(); } Mesh mesh = null; if (renderBody) { Vector3 loc = rootLoc; loc.y += 0.0046875f; if (bodyDrawType == RotDrawMode.Dessicated && !p.RaceProps.Humanlike && __instance.graphics.dessicatedGraphic != null && !flags.HasFlag(PawnRenderFlags.Portrait)) { __instance.graphics.dessicatedGraphic.Draw(loc, bodyFacing, p); } else { mesh = __instance.graphics.nakedGraphic.MeshAt(bodyFacing); List <Material> list = __instance.graphics.MatsBodyBaseAt(bodyFacing, bodyDrawType); for (int i = 0; i < list.Count; i++) { Material damagedMat = __instance.graphics.flasher.GetDamagedMat(list[i]); Vector3 scaleVector = new Vector3(loc.x, loc.y, loc.z); if (flags.HasFlag(PawnRenderFlags.Portrait)) { scaleVector.x *= 1f + (1f - (flags.HasFlag(PawnRenderFlags.Portrait) ? v.CurrentForm.bodyGraphicData.drawSize : v.CurrentForm.bodyGraphicData.drawSize) .x); scaleVector.z *= 1f + (1f - (flags.HasFlag(PawnRenderFlags.Portrait) ? v.CurrentForm.bodyGraphicData.drawSize : v.CurrentForm.bodyGraphicData.drawSize) .y); } else { scaleVector = new Vector3(0, 0, 0); } GenDraw.DrawMeshNowOrLater(mesh, loc + scaleVector, quat, damagedMat, flags.FlagSet(PawnRenderFlags.DrawNow)); //HasFlag(PawnRenderFlags.Portrait)); //GenDraw.DrawMeshNowOrLater(mesh, Matrix4x4.TRS(loc + scaleVector, quat, Vector3.one), damagedMat, flags.FlagSet(PawnRenderFlags.DrawNow)); loc.y += 0.0046875f; } if (bodyDrawType == RotDrawMode.Fresh) { Vector3 drawLoc = rootLoc; drawLoc.y += 0.01875f; Traverse.Create(__instance).Field("woundOverlays").GetValue <PawnWoundDrawer>().RenderOverBody(drawLoc, mesh, quat, flags.FlagSet(PawnRenderFlags.DrawNow), BodyTypeDef.WoundLayer.Body, bodyFacing); //Traverse.Create(__instance).Field("woundOverlays").GetValue<PawnWoundDrawer>().RenderOverBody(drawLoc, mesh, quat, flags.HasFlag(PawnRenderFlags.Portrait), BodyTypeDef.WoundLayer.Body, bodyFacing); } } } return(false); } else if (!v.Transformed && v.CurFormGraphic != null) { v.CurFormGraphic = null; __instance.graphics.ResolveAllGraphics(); } } return(true); }