// WL911_Probe.cs — PD 지시 #911 시험(Play 중 · 섬) // Quake(dist, sec, pauseAt) : 시험 몹을 PC 정면 dist(m)에 세우고(멈춤) 각성(E) 발동 → 매 프레임 상태 · 정규화 시간 · 속도 · 이벤트 켜짐 · 몹 높이 · 기절 · 카운터 · pauseAt>0 이면 그때 에디터 일시 정지 // SwordHold(sec) : 검 각성(E) 발동 직후부터 sec 초 동안 이동 입력 — 스킬 투사체가 켜진 동안 PC 이동 거리 / 꺼진 뒤 이동 거리 // Log() using System.Text; using UnityEngine; public static class WL911_Probe { const string Key = "wl911log"; static StringBuilder Buf() { var sb = System.AppDomain.CurrentDomain.GetData(Key) as StringBuilder; if (sb == null) { sb = new StringBuilder(); System.AppDomain.CurrentDomain.SetData(Key, sb); } return sb; } public static object Log() { return Buf().ToString(); } static Actor Dummy() { var d = WL.IslandMob.WLTrailTest.Dummy; if (d != null && d.isActiveAndEnabled) return d; var pc = MyValue.MyPC; Actor best = null; float bd = float.MaxValue; foreach (var m in Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None)) { if (m == null || m.IsDead()) continue; float dd = pc != null ? Vector3.Distance(pc.Get_position(), m.Get_position()) : 0f; if (dd < bd) { bd = dd; best = m; } } return best; } static string Clip(Animator a) { if (a == null) return "-"; var ci = a.GetCurrentAnimatorClipInfo(0); return ci.Length > 0 && ci[0].clip != null ? ci[0].clip.name : "-"; } public static object Quake(float dist, float seconds, float pauseAt) { var pc = MyValue.MyPC as PCActor; var d = Dummy(); if (pc == null || d == null) return "PC/몹 없음"; var f = pc.transform.forward; f.y = 0f; f.Normalize(); var want = pc.Get_position() + f * dist; UnityEngine.AI.NavMeshHit hit; if (UnityEngine.AI.NavMesh.SamplePosition(want, out hit, 1.5f, UnityEngine.AI.NavMesh.AllAreas)) want = hit.position; d.Stop(true); d.Set_Warp(want); pc.Change_Target(true, d); var sb = Buf(); sb.Length = 0; float t0 = Time.time, dy0 = d.transform.position.y; string last = ""; bool paused = false; int c0 = WL.PartSkill.SkHammerQuake.CastCount, s0 = WL.PartSkill.SkHammerQuake.SlamCount, h0 = WL.PartSkill.SkHammerQuake.HitCount, l0 = WL.Combat.Weapon.WLLaunch.Launches; UnityEngine.Events.UnityAction act = null; act = () => { if (pc == null || pc.m_animation == null || d == null) { Application.onBeforeRender -= act; return; } float t = Time.time - t0; var a = pc.m_animation; var si = a.GetCurrentAnimatorStateInfo(0); string key = Clip(a) + " " + pc.Get_CurAnim() + " sp" + a.speed.ToString("F1") + " ev" + (a.fireEvents ? 1 : 0) + " slam" + (WL.PartSkill.SkHammerQuake.SlamCount - s0) + " hit" + (WL.PartSkill.SkHammerQuake.HitCount - h0); if (key != last || Mathf.Repeat(t, 0.1f) < Time.deltaTime) { last = key; sb.AppendFormat("{0:F2} {1} n={2:F2} · 몹 높이 {3:F2} 기절 {4:F2}", t, key, si.normalizedTime, d.transform.position.y - dy0, d.Get_CCData(eCC.Stun).CCTime).Append('\n'); } if (!paused && pauseAt > 0f && t >= pauseAt) { paused = true; UnityEditor.EditorApplication.isPaused = true; sb.Append("■ 일시 정지").Append('\n'); } if (t > seconds) { Application.onBeforeRender -= act; sb.AppendFormat("끝 · 시전 +{0} · 내려치기 +{1} · 명중 +{2} · 띄움 +{3} · {4}", WL.PartSkill.SkHammerQuake.CastCount - c0, WL.PartSkill.SkHammerQuake.SlamCount - s0, WL.PartSkill.SkHammerQuake.HitCount - h0, WL.Combat.Weapon.WLLaunch.Launches - l0, WL.PartSkill.SkHammerQuake.LastLog).Append('\n'); } }; Application.onBeforeRender += act; return "E: " + WL.Combat.Weapon.WLSkillHotkey.Fire(2); } public static object SwordHold(float seconds) { var pc = MyValue.MyPC as PCActor; if (pc == null) return "PC 없음"; var sb = Buf(); sb.Length = 0; float t0 = Time.time; bool moving = false; Vector3 p0 = pc.Get_position(), pEnd = p0; float effEndAt = -1f; bool effSeen = false; var dir = pc.transform.right; dir.y = 0f; dir.Normalize(); UnityEngine.Events.UnityAction act = null; act = () => { if (pc == null) { Application.onBeforeRender -= act; return; } float t = Time.time - t0; if (!moving) { pc.Set_AutoBraking(false); pc.Set_JoystickStatus(1); moving = true; } pc.Run_byJoystick(dir); bool eff = false; foreach (var pb in Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None)) { var dt = pb.Get_ProjectTileData(); if (dt != null && ReferenceEquals(dt.shooter, pc)) eff = true; } if (eff) { effSeen = true; pEnd = pc.Get_position(); } else if (effSeen && effEndAt < 0f) { effEndAt = t; sb.AppendFormat("{0:F2} 이펙트 꺼짐 · 그때까지 PC 이동 {1:F2} m · 상태 {2}", t, Vector3.Distance(p0, pEnd), pc.Get_CurAnim()).Append('\n'); } if (t > seconds) { Application.onBeforeRender -= act; pc.Set_JoystickStatus(0); pc.Set_AutoBraking(true); sb.AppendFormat("끝 · 총 이동 {0:F2} m · 이펙트 봄 {1} · 이동 무시 {2}", Vector3.Distance(p0, pc.Get_position()), effSeen, WL.Combat.Weapon.WLSkillCancel.MoveBlocked).Append('\n'); } }; Application.onBeforeRender += act; return "E: " + WL.Combat.Weapon.WLSkillHotkey.Fire(2); } }