mirror of
https://github.com/hanetzer/sdraw_mods_cvr.git
synced 2025-09-03 10:29:22 +00:00
142 lines
6.3 KiB
C#
142 lines
6.3 KiB
C#
using BTKUILib.UIObjects;
|
|
using BTKUILib.UIObjects.Components;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
|
|
namespace ml_pmc
|
|
{
|
|
static class ModUi
|
|
{
|
|
internal class UiEvent<T>
|
|
{
|
|
event Action<T> m_action;
|
|
public void AddHandler(Action<T> p_listener) => m_action += p_listener;
|
|
public void RemoveHandler(Action<T> p_listener) => m_action -= p_listener;
|
|
public void Invoke(T p_value) => m_action?.Invoke(p_value);
|
|
}
|
|
|
|
enum UiIndex
|
|
{
|
|
Toggle,
|
|
Position,
|
|
Rotation,
|
|
Gestures,
|
|
LookAtMix,
|
|
MirrorPose,
|
|
MirrorPosition,
|
|
MirrorRotation,
|
|
Reset
|
|
}
|
|
|
|
public static readonly UiEvent<string> OnTargetSelect = new UiEvent<string>();
|
|
|
|
static List<QMUIElement> ms_uiElements = null;
|
|
static string ms_selectedPlayer;
|
|
|
|
internal static void Init()
|
|
{
|
|
ms_uiElements = new List<QMUIElement>();
|
|
|
|
BTKUILib.QuickMenuAPI.PrepareIcon("PlayerMovementCopycat", "PMC-Dancing", GetIconStream("dancing.png"));
|
|
BTKUILib.QuickMenuAPI.PrepareIcon("PlayerMovementCopycat", "PMC-Dancing-On", GetIconStream("dancing_on.png"));
|
|
|
|
var l_category = BTKUILib.QuickMenuAPI.PlayerSelectPage.AddCategory("Player Movement Copycat", "PlayerMovementCopycat");
|
|
|
|
ms_uiElements.Add(l_category.AddButton("Copy movement", "PMC-Dancing", "Start/stop copy of player's movement"));
|
|
(ms_uiElements[(int)UiIndex.Toggle] as Button).OnPress += OnCopySwitch;
|
|
|
|
ms_uiElements.Add(l_category.AddToggle("Apply position", "Apply local position change of target player", Settings.Position));
|
|
(ms_uiElements[(int)UiIndex.Position] as ToggleButton).OnValueUpdated += (value) => OnToggleUpdate(UiIndex.Position, value);
|
|
|
|
ms_uiElements.Add(l_category.AddToggle("Apply rotation", "Apply local rotation change of target player", Settings.Rotation));
|
|
(ms_uiElements[(int)UiIndex.Rotation] as ToggleButton).OnValueUpdated += (value) => OnToggleUpdate(UiIndex.Rotation, value);
|
|
|
|
ms_uiElements.Add(l_category.AddToggle("Copy gestures", "Copy gestures of target player", Settings.Gestures));
|
|
(ms_uiElements[(int)UiIndex.Gestures] as ToggleButton).OnValueUpdated += (value) => OnToggleUpdate(UiIndex.Gestures, value);
|
|
|
|
ms_uiElements.Add(l_category.AddToggle("Apply LookAtIK", "Mix target player pose and camera view direction (desktop only)", Settings.LookAtMix));
|
|
(ms_uiElements[(int)UiIndex.LookAtMix] as ToggleButton).OnValueUpdated += (value) => OnToggleUpdate(UiIndex.LookAtMix, value);
|
|
|
|
ms_uiElements.Add(l_category.AddToggle("Mirror pose", "Mirror target player pose", Settings.MirrorPose));
|
|
(ms_uiElements[(int)UiIndex.MirrorPose] as ToggleButton).OnValueUpdated += (value) => OnToggleUpdate(UiIndex.MirrorPose, value);
|
|
|
|
ms_uiElements.Add(l_category.AddToggle("Mirror position", "Mirror target player movement against 0YZ plane", Settings.MirrorPosition));
|
|
(ms_uiElements[(int)UiIndex.MirrorPosition] as ToggleButton).OnValueUpdated += (value) => OnToggleUpdate(UiIndex.MirrorPosition, value);
|
|
|
|
ms_uiElements.Add(l_category.AddToggle("Mirror rotation", "Mirror target player rotation against 0YZ plane", Settings.MirrorRotation));
|
|
(ms_uiElements[(int)UiIndex.MirrorRotation] as ToggleButton).OnValueUpdated += (value) => OnToggleUpdate(UiIndex.MirrorRotation, value);
|
|
|
|
ms_uiElements.Add(l_category.AddButton("Reset settings", "", "Reset mod's settings to default"));
|
|
(ms_uiElements[(int)UiIndex.Reset] as Button).OnPress += Reset;
|
|
|
|
BTKUILib.QuickMenuAPI.OnPlayerSelected += (_, id) => ms_selectedPlayer = id;
|
|
PoseCopycat.OnCopycatChanged.AddHandler(OnCopycatChanged);
|
|
}
|
|
|
|
static void OnCopySwitch() => OnTargetSelect.Invoke(ms_selectedPlayer);
|
|
|
|
static void OnToggleUpdate(UiIndex p_index, bool p_value, bool p_force = false)
|
|
{
|
|
switch(p_index)
|
|
{
|
|
case UiIndex.Position:
|
|
Settings.SetSetting(Settings.ModSetting.Position, p_value);
|
|
break;
|
|
|
|
case UiIndex.Rotation:
|
|
Settings.SetSetting(Settings.ModSetting.Rotation, p_value);
|
|
break;
|
|
|
|
case UiIndex.Gestures:
|
|
Settings.SetSetting(Settings.ModSetting.Gestures, p_value);
|
|
break;
|
|
|
|
case UiIndex.LookAtMix:
|
|
Settings.SetSetting(Settings.ModSetting.LookAtMix, p_value);
|
|
break;
|
|
|
|
case UiIndex.MirrorPose:
|
|
Settings.SetSetting(Settings.ModSetting.MirrorPose, p_value);
|
|
break;
|
|
|
|
case UiIndex.MirrorPosition:
|
|
Settings.SetSetting(Settings.ModSetting.MirrorPosition, p_value);
|
|
break;
|
|
|
|
case UiIndex.MirrorRotation:
|
|
Settings.SetSetting(Settings.ModSetting.MirrorRotation, p_value);
|
|
break;
|
|
}
|
|
|
|
if(p_force)
|
|
(ms_uiElements[(int)p_index] as ToggleButton).ToggleValue = p_value;
|
|
}
|
|
|
|
static void Reset()
|
|
{
|
|
OnToggleUpdate(UiIndex.Position, true, true);
|
|
OnToggleUpdate(UiIndex.Rotation, true, true);
|
|
OnToggleUpdate(UiIndex.Gestures, true, true);
|
|
OnToggleUpdate(UiIndex.LookAtMix, true, true);
|
|
OnToggleUpdate(UiIndex.MirrorPose, false, true);
|
|
OnToggleUpdate(UiIndex.MirrorPosition, false, true);
|
|
OnToggleUpdate(UiIndex.MirrorRotation, false, true);
|
|
}
|
|
|
|
internal static void ShowAlert(string p_text) => BTKUILib.QuickMenuAPI.ShowAlertToast(p_text, 2);
|
|
|
|
static void OnCopycatChanged(bool p_state)
|
|
{
|
|
(ms_uiElements[(int)UiIndex.Toggle] as Button).ButtonIcon = (p_state ? "PMC-Dancing-On" : "PMC-Dancing");
|
|
}
|
|
|
|
static Stream GetIconStream(string p_name)
|
|
{
|
|
Assembly l_assembly = Assembly.GetExecutingAssembly();
|
|
string l_assemblyName = l_assembly.GetName().Name;
|
|
return l_assembly.GetManifestResourceStream(l_assemblyName + ".resources." + p_name);
|
|
}
|
|
}
|
|
}
|