diff --git a/HarmonySrc/HandPosePose.cs b/HarmonySrc/HandPosePose.cs
index 07ee59c..ea80da3 100644
--- a/HarmonySrc/HandPosePose.cs
+++ b/HarmonySrc/HandPosePose.cs
@@ -449,6 +449,7 @@ namespace NecromancerTome
HeldTweak.Apply();
NecroView.Update();
NecroBody.LateUpdate();
+ ThreadKnifeBody.LateUpdate();
}
}
diff --git a/HarmonySrc/ThreadKnifeBody.cs b/HarmonySrc/ThreadKnifeBody.cs
index 4e33743..16782ee 100644
--- a/HarmonySrc/ThreadKnifeBody.cs
+++ b/HarmonySrc/ThreadKnifeBody.cs
@@ -1,3 +1,4 @@
+using System.Collections.Generic;
using HarmonyLib;
using UnityEngine;
@@ -12,7 +13,64 @@ namespace NecromancerTome
///
public static class ThreadKnifeBody
{
- public static int TpHold = 36;
+ /// 0 - тело держит хватом предмета (68, лук). 16.10 в игре (necrobody) пользователь выбрал именно его: нож в левой
+ /// руке тела, «Нож был нормальным», нужна только поправка кисти и места ножа (ниже). Подмена на 36 - на пробу командой.
+ public static int TpHold = 0;
+
+ /// Поправка тела, подобранная 16.10 командами necrobody: левая кисть к ладони на 20° («лучезапястный сустав
+ /// выгнуло... словно перелом»: LeftHand Z 302 -> 322), нож в кулаке - item pos 3 -4 -2 см («Вот так идеально»).
+ public static float WristBend = 20f;
+ public static Vector3 ItemPos = new Vector3(0.03f, -0.04f, -0.02f);
+ static readonly Dictionary _leftHand = new Dictionary();
+
+ /// Из HandPoseDriver.LateUpdate: у всех игроков в мире с ножом-для-нитей, кроме своего вида от первого лица.
+ public static void LateUpdate()
+ {
+ World w = GameManager.Instance?.World;
+ if (w?.Players?.list == null || TpHold > 0)
+ {
+ return;
+ }
+ foreach (EntityPlayer p in w.Players.list)
+ {
+ if (p == null || p.inventory?.holdingItem?.Name != CinerariumThreads.ThreadKnifeName || p.emodel == null ||
+ p.emodel.IsFPV && !p.isEntityRemote)
+ {
+ continue;
+ }
+ AvatarCharacterController ac = p.emodel.avatarController as AvatarCharacterController;
+ Animator a = ac?.CharacterBody?.Animator;
+ if (a == null)
+ {
+ continue;
+ }
+ if (!_leftHand.TryGetValue(a, out Transform lh) || lh == null)
+ {
+ lh = null;
+ foreach (Transform t in a.GetComponentsInChildren(true))
+ {
+ if (t.name == "LeftHand")
+ {
+ lh = t;
+ break;
+ }
+ }
+ if (_leftHand.Count > 16)
+ {
+ _leftHand.Clear();
+ }
+ _leftHand[a] = lh;
+ }
+ if (lh != null)
+ {
+ lh.localRotation *= Quaternion.Euler(0f, 0f, WristBend);
+ }
+ if (ac.heldItemTransform != null && !NecroBody.ItemPos.HasValue)
+ {
+ ac.heldItemTransform.localPosition = ItemPos;
+ }
+ }
+ }
public static bool Applies(EntityAlive _e)
{