上传 佐拉加歼殛战 Splatoon脚本

情感投射 利刃
弑君之怒行 接线死刑
main
RedAsteroid 2024-11-02 00:12:56 +08:00
parent d566685ddf
commit ec4f3508e3
2 changed files with 421 additions and 0 deletions

View File

@ -0,0 +1,208 @@
using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using ECommons;
using ECommons.Configuration;
using ECommons.DalamudServices;
using ECommons.ExcelServices.TerritoryEnumeration;
using ECommons.GameFunctions;
using ECommons.Hooks.ActionEffectTypes;
using ECommons.ImGuiMethods;
using ECommons.Logging;
using ECommons.MathHelpers;
using ImGuiNET;
using Lumina.Excel.GeneratedSheets;
using Splatoon.SplatoonScripting;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
namespace SplatoonScriptsOfficial.Duties.Dawntrail
{
public class EX2__线_For_CN_Client : SplatoonScript
{
// EX2_Regicidal_Rage
// 限制副本地图1201 永护塔顶层
public override HashSet<uint>? ValidTerritories { get; } = [1201];
public override Metadata? Metadata => new(1, "RedOrange");
HashSet<uint> TetheredPlayers = new();
public override void OnSetup()
{
Controller.RegisterElement("TetherAOE1", new(1) { thicc = Conf.TetherAOEThick, color = Conf.TetherAOECol.ToUint(), refActorComparisonType = 2, onlyTargetable = true, Filled = false, Enabled = false, radius = 8f});
Controller.RegisterElement("TetherAOE2", new(1) { thicc = Conf.TetherAOEThick, color = Conf.TetherAOECol.ToUint(), refActorComparisonType = 2, onlyTargetable = true, Filled = false, Enabled = false, radius = 8f});
Controller.RegisterElement("Tether1", new(2) { thicc = Conf.TetherThick, radius = 0f });
Controller.RegisterElement("Tether2", new(2) { thicc = Conf.TetherThick, radius = 0f });
Controller.RegisterElement("hint1", new(1) { thicc = 0f, radius = 0f, refActorComparisonType = 2, overlayPlaceholders = true, overlayBGColor = 4294911232, overlayTextColor = 4294967295, overlayVOffset = 1f});
Controller.RegisterElement("hint2", new(1) { thicc = 0f, radius = 0f, refActorComparisonType = 2, overlayPlaceholders = true, overlayBGColor = 4294911232, overlayTextColor = 4294967295, overlayVOffset = 1f});
}
public override void OnTetherCreate(uint source, uint target, uint data2, uint data3, uint data5)
{
if (IsZoraalja(target, out _))
{
//DuoLog.Information($"Tether: {data2}, {data3}, {data5}");
TetheredPlayers.Add(source);
//UpdateTethers();
}
}
public override void OnTetherRemoval(uint source, uint data2, uint data3, uint data5)
{
//DuoLog.Information($"Tether rem: {data2}, {data3}, {data5}");
TetheredPlayers.Remove(source);
//UpdateTethers();
}
public override void OnUpdate()
{
UpdateTethers();
}
bool IsZoraalja(uint oid, [NotNullWhen(true)] out IBattleChara? zoraalja)
{
if (oid.TryGetObject(out var obj) && obj is IBattleChara o && o.NameId == 12882)
{
zoraalja = o;
return true;
}
zoraalja = null;
return false;
}
void Reset()
{
TetheredPlayers.Clear();
}
IBattleChara? GetZoraalja()
{
return Svc.Objects.FirstOrDefault(x => x is IBattleChara o && o.NameId == 12882 && o.IsTargetable()) as IBattleChara;
}
void UpdateTethers()
{
if (TetheredPlayers.Count == 2)
{
var tetheredPlayers = TetheredPlayers.ToArray();
var zoraalja = GetZoraalja();
{
if (Controller.TryGetElementByName("Tether1", out var e))
{
e.Enabled = true;
e.SetRefPosition(zoraalja.Position);
e.SetOffPosition(tetheredPlayers[0].GetObject().Position);
var correct = (tetheredPlayers[0].GetObject() as IPlayerCharacter).GetRole() == CombatRole.Tank;
e.color = (correct ? Conf.ValidTetherColor : GradientColor.Get(Conf.InvalidTetherColor1, Conf.InvalidTetherColor2, 500)).ToUint();
}
}
{
if (Controller.TryGetElementByName("TetherAOE1", out var e))
{
e.Enabled = true;
e.refActorObjectID = tetheredPlayers[0];
e.color = Conf.TetherAOECol.ToUint();
var correct = (tetheredPlayers[0].GetObject() as IPlayerCharacter).GetRole() == CombatRole.Tank;
}
}
{
if (Controller.TryGetElementByName("hint1", out var e))
{
e.refActorObjectID = tetheredPlayers[0];
var correct = (tetheredPlayers[0].GetObject() as IPlayerCharacter).GetRole() == CombatRole.Tank;
e.overlayText = (correct ? "死刑 → $NAME" : "坦克接线");
if (Conf.UseOverlayText)
{
e.Enabled = true;
}
else
{
e.Enabled = false;
}
}
}
{
if (Controller.TryGetElementByName("Tether2", out var e))
{
e.Enabled = true;
e.SetRefPosition(zoraalja.Position);
e.SetOffPosition(tetheredPlayers[1].GetObject().Position);
var correct = (tetheredPlayers[1].GetObject() as IPlayerCharacter).GetRole() == CombatRole.Tank;
e.color = (correct ? Conf.ValidTetherColor : GradientColor.Get(Conf.InvalidTetherColor1, Conf.InvalidTetherColor2, 500)).ToUint();
}
}
{
if (Controller.TryGetElementByName("TetherAOE2", out var e))
{
e.Enabled = true;
e.refActorObjectID = tetheredPlayers[1];
e.color = Conf.TetherAOECol.ToUint();
var correct = (tetheredPlayers[1].GetObject() as IPlayerCharacter).GetRole() == CombatRole.Tank;
}
}
{
if (Controller.TryGetElementByName("hint2", out var e))
{
e.refActorObjectID = tetheredPlayers[1];
var correct = (tetheredPlayers[1].GetObject() as IPlayerCharacter).GetRole() == CombatRole.Tank;
e.overlayText = (correct ? "死刑 → $NAME" : "坦克接线");
if (Conf.UseOverlayText)
{
e.Enabled = true;
}
else
{
e.Enabled = false;
}
}
}
}
else
{
Controller.GetRegisteredElements().Each(x => x.Value.Enabled = false);
}
}
Config Conf => Controller.GetConfig<Config>();
public override void OnSettingsDraw()
{
ImGui.Checkbox("启用 字幕提醒",ref Conf.UseOverlayText);
ImGui.ColorEdit4("死刑范围 颜色", ref Conf.TetherAOECol, ImGuiColorEditFlags.NoInputs);
ImGui.SetNextItemWidth(100f);
ImGui.ColorEdit4("Tank连线时 颜色", ref Conf.ValidTetherColor, ImGuiColorEditFlags.NoInputs);
ImGui.ColorEdit4("##Invalid1", ref Conf.InvalidTetherColor1, ImGuiColorEditFlags.NoInputs);
ImGui.SameLine();
ImGui.ColorEdit4("非Tank连线时 颜色(渐变)", ref Conf.InvalidTetherColor2, ImGuiColorEditFlags.NoInputs);
ImGui.SetNextItemWidth(100f);
ImGui.SliderFloat("死刑范围 线条厚度", ref Conf.TetherAOEThick, 1f, 10f);
ImGui.SetNextItemWidth(100f);
ImGui.SliderFloat("连线线条厚度", ref Conf.TetherThick, 1f, 10f);
if (ImGui.CollapsingHeader("说明"))
{
ImGuiEx.Text($"1. 按住 Ctrl 键点击滑动条可以输入数字");
ImGuiEx.Text($"2. 连线逻辑为: 连线坦克时为黄色,连线其他职业时为黑蓝渐变,您可以自行更改");
ImGuiEx.Text($"3. 此脚本基于 UCOB Tethers 修改,可作为连线机制参考,所有的成果归于 NightmareXIV");
}
if (ImGui.CollapsingHeader("Debug 调试"))
{
ImGuiEx.Text($"连线:\n{TetheredPlayers.Select(x => x.GetObject()?.ToString() ?? $"unk{x}").Join("\n")}");
}
}
public class Config : IEzConfig
{
public bool UseOverlayText = true;
public Vector4 TetherAOECol = 0xE6FF00FF.SwapBytes().ToVector4();
public Vector4 ValidTetherColor = 0xD9FF00FF.SwapBytes().ToVector4();
public Vector4 InvalidTetherColor1 = 0xFFFFFFFF.SwapBytes().ToVector4();
public Vector4 InvalidTetherColor2 = new(0, 0, 0, 255);
public float TetherAOEThick = 3f;
public float TetherThick = 5f;
}
}
}

View File

@ -0,0 +1,213 @@
using Dalamud.Game.ClientState.Objects.Types;
using ECommons;
using ECommons.Configuration;
using ECommons.DalamudServices;
using ECommons.Hooks;
using ECommons.ImGuiMethods;
using ECommons.MathHelpers;
using ImGuiNET;
using Splatoon;
using Splatoon.SplatoonScripting;
using Splatoon.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
namespace SplatoonScriptsOfficial.Duties.Dawntrail;
public class EX2___For_CN_Client : SplatoonScript
{
// Projection_of_Triumph
public override HashSet<uint>? ValidTerritories { get; } = [1201];
public override Metadata? Metadata => new(3, "NightmareXIV, RedOrange 修改");
private IBattleChara[] Donuts => [.. Svc.Objects.OfType<IBattleChara>().Where(x => x.DataId == 16727)];
private IBattleChara[] Circles => [.. Svc.Objects.OfType<IBattleChara>().Where(x => x.DataId == 16726)];
private IBattleChara[] Towers => [.. Svc.Objects.OfType<IBattleChara>().Where(x => x.DataId == 17079)];
private List<uint> RightMovers = [];
private List<uint> LeftMovers = [];
private int? RotateModifier = null;
public override void OnSetup()
{
Controller.RegisterElement("Donut", new(0)
{
color = Conf.DCol.ToUint(),
overrideFillColor = true,
originFillColor = Conf.DColO.ToUint(),
endFillColor = Conf.DColE.ToUint(),
thicc = Conf.DThick,
refX = 100,
refY = 100,
});
Controller.RegisterElement("Circle", new(0)
{
color = Conf.CCol.ToUint(),
overrideFillColor = true,
originFillColor = Conf.CColO.ToUint(),
endFillColor = Conf.CColE.ToUint(),
thicc = Conf.CThick,
refX = 100,
refY = 100,
});
}
//northwest is virtual north
public override void OnUpdate()
{
Controller.GetRegisteredElements().Values.Each(x => x.Enabled = false);
if (Towers.Length == 0)
{
RotateModifier = null;
LeftMovers.Clear();
RightMovers.Clear();
return;
}
if (Donuts.Length + Circles.Length >= 2)
{
CalculateModifier();
}
if (RotateModifier == null) return;
foreach (var x in Donuts.Concat(Circles))
{
var xPos = RotateRelative(x.Position);
if (xPos.Z > 120f) LeftMovers.Add(x.EntityId);
if (xPos.Z < 80f) RightMovers.Add(x.EntityId);
}
for (var i = 0; i < Towers.Length; i++)
{
var t = Towers[i];
var name = $"Tower{i}";
if (!Controller.TryGetElementByName(name, out _)) Controller.RegisterElement(name, new(0));
var element = Controller.GetElementByName(name);
var originalPos = t.Position;
var rotatedPos = RotateRelative(originalPos);
element.SetRefPosition(originalPos);
//element.overlayText = $"Original: {originalPos}\nRotated:{rotatedPos}";
element.overlayVOffset = 2;
foreach (var x in Donuts.Concat(Circles))
{
var xPos = RotateRelative(x.Position);
var isDonut = x.DataId == 16727;
if (!xPos.Z.InRange(80, 120)) continue;
if (LeftMovers.Contains(x.EntityId))
{
var distance = xPos.Z - rotatedPos.Z;
if (distance.InRange(0, 8))
{
Assign(element, isDonut, distance);
//element.overlayText += $"\n{(isDonut ? "Donut" : "Circle")}/{xPos}";
}
}
if (RightMovers.Contains(x.EntityId))
{
var distance = rotatedPos.Z - xPos.Z;
if (distance.InRange(0, 8))
{
Assign(element, isDonut, distance);
//element.overlayText += $"\n{(isDonut ? "Donut" : "Circle")}/{xPos}";
}
}
}
}
}
void CalculateModifier()
{
if (Donuts.Concat(Circles).Any(x => Vector3.Distance(x.Position, new(85, 0, 115)) < 3))
{
RotateModifier = -45;
}
else if (Donuts.Concat(Circles).Any(x => Vector3.Distance(x.Position, new(85, 0, 85)) < 3))
{
RotateModifier = 45;
}
}
void Assign(Element e, bool isDonut, float distance)
{
e.Enabled = true;
var percent = Math.Clamp(1f - distance / 8f, 0f, 1f);
if (isDonut)
{
e.Filled = false;
e.Donut = 5f;
e.radius = 3f;
e.SetDisplayStyle(Controller.GetElementByName("Donut").GetDisplayStyle());
e.color = Conf.DCol.ToUint();
e.overrideFillColor = true;
e.originFillColor = Conf.DColO.ToUint();
e.endFillColor = Conf.DColE.ToUint();
e.thicc = Conf.DThick;
}
else
{
e.Filled = true;
e.Donut = 0f;
e.radius = 4f;
e.SetDisplayStyle(Controller.GetElementByName("Circle").GetDisplayStyle());
e.color = Conf.CCol.ToUint();
e.overrideFillColor = true;
e.originFillColor = Conf.CColO.ToUint();
e.endFillColor = Conf.CColE.ToUint();
e.thicc = Conf.CThick;
}
}
private Vector3 RotateRelative(Vector3 s)
{
var swapped = new Vector3(s.X, s.Z, s.Y);
var rotated = Utils.RotatePoint(100, 100, this.RotateModifier.Value.DegreesToRadians(), swapped);
return new(rotated.X, rotated.Z, rotated.Y);
}
public override void OnSettingsDraw()
{
ImGui.ColorEdit4("圆形 颜色", ref Conf.CCol, ImGuiColorEditFlags.NoInputs);
ImGui.ColorEdit4("##CColO", ref Conf.CColO, ImGuiColorEditFlags.NoInputs);
ImGui.SameLine();
ImGui.ColorEdit4("圆形填充 颜色", ref Conf.CColE, ImGuiColorEditFlags.NoInputs);
ImGui.ColorEdit4("月环 颜色", ref Conf.DCol, ImGuiColorEditFlags.NoInputs);
ImGui.ColorEdit4("##DColO", ref Conf.DColO, ImGuiColorEditFlags.NoInputs);
ImGui.SameLine();
ImGui.ColorEdit4("月环填充 颜色", ref Conf.DColE, ImGuiColorEditFlags.NoInputs);
ImGui.SetNextItemWidth(100f);
ImGui.SliderFloat("圆形 线条厚度", ref Conf.CThick, 1f, 10f);
ImGui.SetNextItemWidth(100f);
ImGui.SliderFloat("月环 线条厚度", ref Conf.DThick, 1f, 10f);
if (ImGui.CollapsingHeader("说明"))
{
ImGuiEx.Text("1. 按住 Ctrl 键点击滑动条可以输入数字");
ImGuiEx.Text("2. 如果您不需要渐变填充,请将渐变色设置为两个相同的颜色");
ImGuiEx.Text("3. 仅修改,所有的成果归于 NightmareXIV");
}
if (ImGui.CollapsingHeader("Debug 调试"))
{
ImGuiEx.Text($"""
Towers: {Towers.Print()}
Circles: {Circles.Print()}
Donuts: {Donuts.Print()}
RotateModifier: {RotateModifier}
""");
}
}
Config Conf => Controller.GetConfig<Config>();
public class Config : IEzConfig
{
public Vector4 CCol = 0xFFFF00C8.SwapBytes().ToVector4();
public Vector4 DCol = 0xFFFF00C8.SwapBytes().ToVector4();
public Vector4 CColO = 0xFFFF0023.SwapBytes().ToVector4();
public Vector4 CColE = 0xFFFF0023.SwapBytes().ToVector4();
public Vector4 DColO = 0xFFFF0023.SwapBytes().ToVector4();
public Vector4 DColE = 0xFFFF0023.SwapBytes().ToVector4();
public float CThick = 2f;
public float DThick = 2f;
}
}