static bool Prefix(Dialog_StylingStation __instance) { // The styling station got destroyed (in multiplayer, the styling dialog is not pausing) if (__instance.stylingStation != null && !__instance.stylingStation.Spawned) { __instance.Close(); return(false); } return(true); }
internal static void StylingDialog_Accept(StylingData data) { // If the styling station gets destroyed during syncing do nothing if ((data.stylingStation != null) != data.hadStylingStation) { return; } var dialog = new Dialog_StylingStation(data.pawn, data.stylingStation) { apparelColors = data.apparelColors, desiredHairColor = data.hairColor }; var pawn = data.pawn; pawn.story.hairDef = data.hair; pawn.style.beardDef = data.beard; pawn.style.FaceTattoo = data.faceTattoo; pawn.style.BodyTattoo = data.bodyTattoo; // Copied from RimWorld.Dialog_StylingStation.DrawBottomButtons if (pawn.story.hairDef != dialog.initialHairDef || pawn.style.beardDef != dialog.initialBeardDef || pawn.style.FaceTattoo != dialog.initialFaceTattoo || pawn.style.BodyTattoo != dialog.initialBodyTattoo || data.hairColor != pawn.story.hairColor) { if (data.stylingStation != null) { pawn.style.SetupNextLookChangeData( pawn.story.hairDef, pawn.style.beardDef, pawn.style.FaceTattoo, pawn.style.BodyTattoo, dialog.desiredHairColor ); dialog.Reset(); pawn.jobs.TryTakeOrderedJob(JobMaker.MakeJob(JobDefOf.UseStylingStation, data.stylingStation)); } else { pawn.style.Notify_StyleItemChanged(); dialog.MakeHairFilth(); } } dialog.ApplyApparelColors(); }
static void Postfix(Dialog_StylingStation __instance, Rect rect, Pawn ___pawn, Color ___desiredHairColor) { if (Traverse.Create(__instance).Field("curTab").GetValue <int>() != GlobalStylingStation.tabIndex) { return; } CompGradientHair comp = ___pawn.GetComp <CompGradientHair>(); if (comp == null) { return; } rect.yMax -= 110f; Action <Rect, GradientHairMaskDef> drawAction = delegate(Rect r, GradientHairMaskDef h) { Graphic_MultiMask graphic = GlobalStylingStation.GraphicForHair(___pawn.story.hairDef, h); graphic.SetColors(___desiredHairColor, comp.Settings.colorB); graphic.Draw(r.ExpandedBy(r.width * 0.125f)); if (h.modContentPack != GradientHair.myOwnPack) { TooltipHandler.TipRegion(r, new TipSignal("GradientHairAddedByMod".Translate(h.modContentPack.Name))); } }; Action <GradientHairMaskDef> selectAction = delegate(GradientHairMaskDef h) { comp.Settings.mask = h.mask; comp.Settings.enabled = h.defName != "MaskNone"; }; Func <StyleItemDef, bool> hasStyleItem = x => { GradientHairMaskDef h = x as GradientHairMaskDef; if (!comp.Settings.enabled) { return(h.defName == "MaskNone"); } return(comp.Settings.mask == h.mask); }; Func <StyleItemDef, bool> hadStyleItem = x => true; MethodInfo methodA = typeof(Dialog_StylingStation).GetMethod("DrawStylingItemType", BindingFlags.NonPublic | BindingFlags.Instance); MethodInfo method = methodA.MakeGenericMethod(typeof(GradientHairMaskDef)); method.Invoke(__instance, new object[] { rect, GlobalStylingStation.hairGradientScrollPosition, drawAction, selectAction, hasStyleItem, hadStyleItem, null, false }); GlobalStylingStation.DrawHairColors(new Rect(rect.x, rect.yMax + 10f, rect.width, 110f), comp.Settings); }
static bool Prefix(ref Window window) { if (Multiplayer.Client == null || window is not Dialog_StylingStation dialog) { return(true); } // In vanilla, the styling dialog mutates the pawn directly // A dummy pawn taking on the mutations is needed for multiplayer var pawn = new StylingDialog_DummyPawn(); pawn.origPawn = dialog.pawn; pawn.def = dialog.pawn.def; pawn.gender = dialog.pawn.gender; pawn.mapIndexOrState = dialog.pawn.mapIndexOrState; pawn.Name = dialog.pawn.Name; pawn.story = MpUtil.ShallowCopy(dialog.pawn.story, new Pawn_StoryTracker(pawn)); pawn.story.pawn = pawn; pawn.style = MpUtil.ShallowCopy(dialog.pawn.style, new Pawn_StyleTracker(pawn)); pawn.style.pawn = pawn; pawn.apparel = MpUtil.ShallowCopy(dialog.pawn.apparel, new Pawn_ApparelTracker(pawn)); pawn.apparel.pawn = pawn; pawn.apparel.lockedApparel = pawn.apparel.lockedApparel.ToList(); pawn.apparel.wornApparel = MpUtil.ShallowCopy(dialog.pawn.apparel.wornApparel, new ThingOwner <Apparel>()); pawn.apparel.wornApparel.innerList = pawn.apparel.wornApparel.innerList.ToList(); pawn.health = new Pawn_HealthTracker(pawn); pawn.stances = new Pawn_StanceTracker(pawn); pawn.pather = new Pawn_PathFollower(pawn); pawn.roping = new Pawn_RopeTracker(pawn); pawn.mindState = new Pawn_MindState(pawn); window = new Dialog_StylingStation(pawn, dialog.stylingStation); return(Multiplayer.ExecutingCmds && TickPatch.currentExecutingCmdIssuedBySelf || dialog.pawn.CurJob.loadID == SyncMethods.stylingStationJobStartedByMe); }
static void Finalizer() { drawing = null; }
static void Prefix(Dialog_StylingStation __instance) { drawing = __instance; }
static void Prefix(Dialog_StylingStation __instance, Pawn ___pawn) { GlobalStylingStation.dialog = __instance; }