Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
 static void Finalizer()
 {
     drawing = null;
 }
Ejemplo n.º 6
0
 static void Prefix(Dialog_StylingStation __instance)
 {
     drawing = __instance;
 }
Ejemplo n.º 7
0
 static void Prefix(Dialog_StylingStation __instance, Pawn ___pawn)
 {
     GlobalStylingStation.dialog = __instance;
 }