rimworld-animations/1.5/Source/MainTabWindows/MainTabWindow_OffsetConfigu...

182 lines
7.8 KiB
C#

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<CompExtendedAnimator>(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 = "<li>";
offset += bodyTypeDef != "None" ? "<bodyType>" + bodyTypeDef + "</bodyType>" : "";
offset += newOffsetVector != Vector3.zero ? "<offset>(" + posX + ", " + posY + ", " + posZ + ")</offset>" : "";
offset += rot != 0 ? "<rotation>" + rot + "</rotation>" : "";
offset += "</li>";
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<CompExtendedAnimator> animator) {
/*
CompBodyAnimator compBodyAnimator = curPawn.TryGetComp<CompBodyAnimator>();
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<CompBodyAnimator>().ActorIndex + " Body Type (if any): " + bodyTypeDef + " Animation: " + def.label + (curPawn.TryGetComp<CompBodyAnimator>().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<CompBodyAnimator>().actorsInCurrentAnimation.Count; i++) {
Pawn actor = curPawn.TryGetComp<CompBodyAnimator>().actorsInCurrentAnimation[i];
actor.TryGetComp<CompBodyAnimator>()?.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;
}
}
}
*/