102 lines
5.8 KiB
C#
102 lines
5.8 KiB
C#
// 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<MobActor>(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<Skill_DashSlash>(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);
|
|
}
|
|
}
|