using System.Collections.Generic; using Verse; using RimWorld; using UnityEngine; using System.Windows; namespace Rimworld_Animations { class MainTabWindow_OffsetConfigure : MainTabWindow { public override Vector2 RequestedTabSize => new Vector2(505, 450); public override void DoWindowContents(Rect inRect) { Rect position = new Rect(inRect.x, inRect.y, inRect.width, inRect.height); Listing_Standard listingStandard = new Listing_Standard(); listingStandard.Begin(position); listingStandard.Label("RimAnims_AnimManager".Translate()); listingStandard.GapLine(); if (Find.Selector.SingleSelectedThing is Pawn curPawn && curPawn.TryGetComp(out CompExtendedAnimator extendedAnimator) && extendedAnimator.IsAnimating) { //Pawn info about their body, race Vector3 offsetPosition = extendedAnimator.Offset != null ? (Vector3)extendedAnimator.Offset : Vector3.zero; int offsetRotation = extendedAnimator.Rotation != null ? (int)extendedAnimator.Rotation : 0; string pawnDef = curPawn.def.defName; string bodyTypeDef = (curPawn.story?.bodyType != null) ? curPawn.story.bodyType.ToString() : "None"; string genderDef = curPawn.gender.ToString(); string currentAnimation = extendedAnimator.CurrentAnimation != null ? extendedAnimator.CurrentAnimation.defName : "None"; listingStandard.Label(curPawn.Name + ": " + curPawn.def.defName + ", " + bodyTypeDef + ", " + genderDef + ", Animation: " + currentAnimation); if (curPawn.def.defName == "Human") { listingStandard.Label("RimAnims_Warning".Translate()); } float posX = offsetPosition.x, posY = offsetPosition.y, posZ = offsetPosition.z; int rot = offsetRotation; float.TryParse(listingStandard.TextEntryLabeled("X: ", posX.ToString()), out posX); posX = listingStandard.Slider(posX, -2, 2); float.TryParse(listingStandard.TextEntryLabeled("Y: ", offsetPosition.y.ToString()), out posY); posY = listingStandard.Slider(posY, -2, 2); float.TryParse(listingStandard.TextEntryLabeled("Z: ", posZ.ToString()), out posZ); posZ = listingStandard.Slider(posZ, -2, 2); int.TryParse(listingStandard.TextEntryLabeled("Rotation: ", rot.ToString()), out rot); rot = (int)listingStandard.Slider(rot, -180, 180); listingStandard.GapLine(); Vector3 newOffsetVector = new Vector3(posX, posY, posZ); string offset = "
  • "; offset += bodyTypeDef != "None" ? "" + bodyTypeDef + "" : ""; offset += newOffsetVector != Vector3.zero ? "(" + posX + ", " + posY + ", " + posZ + ")" : ""; offset += rot != 0 ? "" + rot + "" : ""; offset += "
  • "; listingStandard.Label("Appropriate Offset value for " + currentAnimation + ", " + pawnDef + ", " + bodyTypeDef + ", " + genderDef + ": "); listingStandard.Label(offset); if (listingStandard.ButtonText("RimAnims_CopyToClipboard".Translate())) { GUIUtility.systemCopyBuffer = offset; } extendedAnimator.Offset = newOffsetVector; extendedAnimator.Rotation = rot; } else { listingStandard.Label("Select a pawn currently in an animation to change their offsets"); } listingStandard.End(); } } } /** if (curPawn.TryGetComp animator) { /* CompBodyAnimator compBodyAnimator = curPawn.TryGetComp(); AnimationDef def = compBodyAnimator.CurrentAnimation; int ActorIndex = compBodyAnimator.ActorIndex; float offsetX = 0, offsetZ = 0, rotation = 0; string bodyTypeDef = (curPawn.story?.bodyType != null) ? curPawn.story.bodyType.ToString() : ""; if (AnimationSettings.offsets.ContainsKey(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex)) { offsetX = AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].x; offsetZ = AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].y; } else { AnimationSettings.offsets.Add(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex, new Vector2(0, 0)); } if (AnimationSettings.rotation.ContainsKey(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex)) { rotation = AnimationSettings.rotation[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex]; } else { AnimationSettings.rotation.Add(def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex, 0); } listingStandard.Label("Name: " + curPawn.Name + " Race: " + curPawn.def.defName + " Actor Index: " + curPawn.TryGetComp().ActorIndex + " Body Type (if any): " + bodyTypeDef + " Animation: " + def.label + (curPawn.TryGetComp().Mirror ? " mirrored" : "")); if(curPawn.def.defName == "Human") { listingStandard.Label("Warning--You generally don't want to change human offsets, only alien offsets"); } float.TryParse(listingStandard.TextEntryLabeled("X Offset: ", offsetX.ToString()), out offsetX); offsetX = listingStandard.Slider(offsetX, -2, 2); float.TryParse(listingStandard.TextEntryLabeled("Z Offset: ", offsetZ.ToString()), out offsetZ); offsetZ = listingStandard.Slider(offsetZ, -2, 2); float.TryParse(listingStandard.TextEntryLabeled("Rotation: ", rotation.ToString()), out rotation); rotation = listingStandard.Slider(rotation, -180, 180); if(listingStandard.ButtonText("Reset All")) { offsetX = 0; offsetZ = 0; rotation = 0; } listingStandard.GapLine(); if(listingStandard.ButtonText("Shift Actors")) { if(AnimationSettings.debugMode) { Log.Message("Shifting actors in animation..."); } for(int i = 0; i < curPawn.TryGetComp().actorsInCurrentAnimation.Count; i++) { Pawn actor = curPawn.TryGetComp().actorsInCurrentAnimation[i]; actor.TryGetComp()?.shiftActorPositionAndRestartAnimation(); //reset the clock time of every pawn in animation if(actor.jobs.curDriver is rjw.JobDriver_Sex) { (actor.jobs.curDriver as rjw.JobDriver_Sex).ticks_left = def.animationTimeTicks; (actor.jobs.curDriver as rjw.JobDriver_Sex).ticksLeftThisToil = def.animationTimeTicks; (actor.jobs.curDriver as rjw.JobDriver_Sex).duration = def.animationTimeTicks; } } } if (offsetX != AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].x || offsetZ != AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex].y) { AnimationSettings.offsets[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex] = new Vector2(offsetX, offsetZ); } if(rotation != AnimationSettings.rotation[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex]) { AnimationSettings.rotation[def.defName + curPawn.def.defName + bodyTypeDef + ActorIndex] = rotation; } } } */