182 lines
7.8 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
*/
|
|
|