143 lines
5.4 KiB
C#
143 lines
5.4 KiB
C#
using Dalamud.Game.ClientState.Objects.SubKinds;
|
|
using Dalamud.Game.ClientState.Objects.Types;
|
|
using ECommons;
|
|
using ECommons.Configuration;
|
|
using ECommons.GameHelpers;
|
|
using ECommons.Hooks;
|
|
using ECommons.ImGuiMethods;
|
|
using ECommons.Logging;
|
|
using ECommons.MathHelpers;
|
|
using ImGuiNET;
|
|
using Splatoon.SplatoonScripting;
|
|
using Splatoon.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace SplatoonScriptsOfficial.Duties.Endwalker
|
|
{
|
|
public class P10S_Tethers_ÉÈÐÎÁ¬Ïß : SplatoonScript
|
|
{
|
|
public override HashSet<uint> ValidTerritories => new() { 1150 };
|
|
public override Metadata? Metadata => new(2, "NightmareXIV, RedAsteroid ÐÞ¸Ä");
|
|
List<TetherData> Tethers = new();
|
|
|
|
public class TetherData
|
|
{
|
|
public uint source;
|
|
public uint target;
|
|
public long time = Environment.TickCount64;
|
|
public float Age => (float)(Environment.TickCount64 - time) / 1000f;
|
|
}
|
|
|
|
public override void OnSetup()
|
|
{
|
|
var code = "{\"Name\":\"\",\"type\":5,\"refX\":103.03228,\"refY\":99.94743,\"radius\":20.0,\"coneAngleMin\":-61,\"coneAngleMax\":61,\"color\":3355506687,\"FillStep\":2.0,\"includeRotation\":true,\"AdditionalRotation\":3.1415927,\"Filled\":true}";
|
|
Controller.RegisterElementFromCode("Cone1", code);
|
|
Controller.RegisterElementFromCode("Cone2", code);
|
|
Controller.RegisterElementFromCode("Tether", "{\"Name\":\"\",\"Enabled\":false,\"radius\":0.0,\"thicc\":5.0,\"tether\":true}");
|
|
}
|
|
|
|
public override void OnEnable()
|
|
{
|
|
ActionEffect.ActionEffectEvent += ActionEffect_ActionEffectEvent;
|
|
Off();
|
|
}
|
|
|
|
private void ActionEffect_ActionEffectEvent(ECommons.Hooks.ActionEffectTypes.ActionEffectSet set)
|
|
{
|
|
if (set.Action.RowId == 33432)
|
|
{
|
|
Off();
|
|
}
|
|
}
|
|
|
|
public override void OnDisable()
|
|
{
|
|
ActionEffect.ActionEffectEvent -= ActionEffect_ActionEffectEvent;
|
|
Off();
|
|
}
|
|
|
|
public override void OnTetherCreate(uint source, uint target, uint data2, uint data3, uint data5)
|
|
{
|
|
Tethers.Add(new() { source = source, target = target });
|
|
Tethers.RemoveAll(x => x.Age > 30f);
|
|
}
|
|
|
|
void Off()
|
|
{
|
|
Tethers.Clear();
|
|
Controller.GetRegisteredElements().Each(x => x.Value.Enabled = false);
|
|
}
|
|
|
|
public override void OnDirectorUpdate(DirectorUpdateCategory category)
|
|
{
|
|
if (category.EqualsAny(DirectorUpdateCategory.Commence, DirectorUpdateCategory.Recommence, DirectorUpdateCategory.Wipe))
|
|
{
|
|
Off();
|
|
}
|
|
}
|
|
|
|
public override void OnSettingsDraw()
|
|
{
|
|
ImGui.ColorEdit4("×ÔÉíÁ¬Ïß ÑÕÉ«", ref C.ColorSelf, ImGuiColorEditFlags.NoInputs); // Self color
|
|
ImGui.Checkbox("¸ßÁÁÏÔʾ×Ô¼ºµÄÁ¬Ïß", ref C.TetherSelf); // Highlight own tether
|
|
ImGui.ColorEdit4("ÆäËûÍæ¼ÒÁ¬Ïß ÑÕÉ«", ref C.Color, ImGuiColorEditFlags.NoInputs); // Other player color
|
|
ImGui.SetNextItemWidth(150f);
|
|
ImGui.SliderFloat("ÉÈÐÎÏßÌõ´Öϸ", ref C.Thick, 1f, 10f); // Cone line thickness
|
|
ImGui.SetNextItemWidth(150f);
|
|
ImGui.SliderFloat("ÉÈÐÎÌî³ä²½Öè", ref C.Interval, 1f, 20f); // Cone fill step
|
|
ImGui.SetNextItemWidth(150f);
|
|
ImGui.SliderFloat("ÉÈÐÎÏßÌõ³¤¶È", ref C.radius, 5f, 40f); // Cone length
|
|
if (ImGui.CollapsingHeader("debug"))
|
|
{
|
|
foreach (var x in Tethers)
|
|
{
|
|
ImGuiEx.Text($"{x.source.GetObject()}->{x.target.GetObject()}, {x.Age}s");
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void OnUpdate()
|
|
{
|
|
int num = 1;
|
|
foreach (var x in Tethers)
|
|
{
|
|
if (x.source.TryGetObject(out var pillar) && pillar is BattleChara p && p.NameId == 12354 && x.target.TryGetObject(out var player) && player is PlayerCharacter pc && Controller.TryGetElementByName($"Cone{num}", out var e))
|
|
{
|
|
num++;
|
|
e.Enabled = true;
|
|
e.AdditionalRotation = (180 + MathHelper.GetRelativeAngle(p.Position, pc.Position)).DegreesToRadians();
|
|
e.SetRefPosition(p.Position);
|
|
e.color = C.Color.ToUint();
|
|
e.thicc = C.Thick;
|
|
e.FillStep = C.Interval;
|
|
e.radius = C.radius;
|
|
if (pc.Address == Player.Object.Address)
|
|
{
|
|
e.color = C.ColorSelf.ToUint();
|
|
if (C.TetherSelf && Controller.TryGetElementByName("Tether", out var t))
|
|
{
|
|
t.Enabled = true;
|
|
t.SetRefPosition(p.Position);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Config C => Controller.GetConfig<Config>();
|
|
public class Config : IEzConfig
|
|
{
|
|
public Vector4 Color = 0xFFF700C8.SwapBytes().ToVector4();
|
|
public Vector4 ColorSelf = 0xFFAD00C8.SwapBytes().ToVector4();
|
|
public float Thick = 4f;
|
|
public float Interval = 10f;
|
|
public bool TetherSelf = true;
|
|
public float radius = 10f;
|
|
}
|
|
}
|
|
} |