- API 13
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
|
<PackageReference Include="JetBrains.Annotations" Version="2025.2.0" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
|
||||||
<PackageReference Include="MSTest.TestAdapter" Version="3.6.3" />
|
<PackageReference Include="MSTest.TestAdapter" Version="3.6.3" />
|
||||||
<PackageReference Include="MSTest.TestFramework" Version="3.6.3" />
|
<PackageReference Include="MSTest.TestFramework" Version="3.6.3" />
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<Project Sdk="Dalamud.NET.Sdk/12.0.2">
|
<Project Sdk="Dalamud.NET.Sdk/13.0.0">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>1.30.7</Version>
|
<Version>1.31.0</Version>
|
||||||
<TargetFramework>net9.0-windows</TargetFramework>
|
<TargetFramework>net9.0-windows</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
@@ -14,10 +14,10 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MessagePack" Version="3.1.3" />
|
<PackageReference Include="MessagePack" Version="3.1.4" />
|
||||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
|
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
|
||||||
<PackageReference Include="Pidgin" Version="3.3.0" />
|
<PackageReference Include="Pidgin" Version="3.3.0" />
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
|
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.11" />
|
||||||
<PackageReference Include="Watson.Lite" Version="6.2.3" />
|
<PackageReference Include="Watson.Lite" Version="6.2.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ using Dalamud;
|
|||||||
using Dalamud.Configuration;
|
using Dalamud.Configuration;
|
||||||
using Dalamud.Game.ClientState.Keys;
|
using Dalamud.Game.ClientState.Keys;
|
||||||
using Dalamud.Interface.FontIdentifier;
|
using Dalamud.Interface.FontIdentifier;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo;
|
namespace ChatTwo;
|
||||||
|
|
||||||
@@ -633,15 +633,15 @@ internal static class ExtraGlyphRangesExt
|
|||||||
_ => throw new ArgumentOutOfRangeException(nameof(ranges), ranges, null),
|
_ => throw new ArgumentOutOfRangeException(nameof(ranges), ranges, null),
|
||||||
};
|
};
|
||||||
|
|
||||||
internal static nint Range(this ExtraGlyphRanges ranges) => ranges switch
|
internal static unsafe nint Range(this ExtraGlyphRanges ranges) => ranges switch
|
||||||
{
|
{
|
||||||
ExtraGlyphRanges.ChineseFull => ImGui.GetIO().Fonts.GetGlyphRangesChineseFull(),
|
ExtraGlyphRanges.ChineseFull => (nint)ImGui.GetIO().Fonts.GetGlyphRangesChineseFull(),
|
||||||
ExtraGlyphRanges.ChineseSimplifiedCommon => ImGui.GetIO().Fonts.GetGlyphRangesChineseSimplifiedCommon(),
|
ExtraGlyphRanges.ChineseSimplifiedCommon => (nint)ImGui.GetIO().Fonts.GetGlyphRangesChineseSimplifiedCommon(),
|
||||||
ExtraGlyphRanges.Cyrillic => ImGui.GetIO().Fonts.GetGlyphRangesCyrillic(),
|
ExtraGlyphRanges.Cyrillic => (nint)ImGui.GetIO().Fonts.GetGlyphRangesCyrillic(),
|
||||||
ExtraGlyphRanges.Japanese => ImGui.GetIO().Fonts.GetGlyphRangesJapanese(),
|
ExtraGlyphRanges.Japanese => (nint)ImGui.GetIO().Fonts.GetGlyphRangesJapanese(),
|
||||||
ExtraGlyphRanges.Korean => ImGui.GetIO().Fonts.GetGlyphRangesKorean(),
|
ExtraGlyphRanges.Korean => (nint)ImGui.GetIO().Fonts.GetGlyphRangesKorean(),
|
||||||
ExtraGlyphRanges.Thai => ImGui.GetIO().Fonts.GetGlyphRangesThai(),
|
ExtraGlyphRanges.Thai => (nint)ImGui.GetIO().Fonts.GetGlyphRangesThai(),
|
||||||
ExtraGlyphRanges.Vietnamese => ImGui.GetIO().Fonts.GetGlyphRangesVietnamese(),
|
ExtraGlyphRanges.Vietnamese => (nint)ImGui.GetIO().Fonts.GetGlyphRangesVietnamese(),
|
||||||
_ => throw new ArgumentOutOfRangeException(nameof(ranges), ranges, null),
|
_ => throw new ArgumentOutOfRangeException(nameof(ranges), ranges, null),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System.Text.Json.Serialization;
|
|||||||
using Dalamud.Interface.Textures;
|
using Dalamud.Interface.Textures;
|
||||||
using Dalamud.Interface.Textures.TextureWraps;
|
using Dalamud.Interface.Textures.TextureWraps;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
using SixLabors.ImageSharp;
|
using SixLabors.ImageSharp;
|
||||||
using SixLabors.ImageSharp.PixelFormats;
|
using SixLabors.ImageSharp.PixelFormats;
|
||||||
|
|
||||||
@@ -154,7 +154,7 @@ public static class EmoteCache
|
|||||||
|
|
||||||
public virtual void Draw(Vector2 size)
|
public virtual void Draw(Vector2 size)
|
||||||
{
|
{
|
||||||
ImGui.Image(Texture!.ImGuiHandle, size);
|
ImGui.Image(Texture!.Handle, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task<byte[]> LoadAsync(Emote emote)
|
internal async Task<byte[]> LoadAsync(Emote emote)
|
||||||
@@ -236,7 +236,7 @@ public static class EmoteCache
|
|||||||
if (FrameTimer <= 0.0f)
|
if (FrameTimer <= 0.0f)
|
||||||
FrameTimer = frame.Delay;
|
FrameTimer = frame.Delay;
|
||||||
|
|
||||||
ImGui.Image(frame.Texture.ImGuiHandle, size);
|
ImGui.Image(frame.Texture.Handle, size);
|
||||||
|
|
||||||
if (GlobalFrameCount == Plugin.Interface.UiBuilder.FrameCount)
|
if (GlobalFrameCount == Plugin.Interface.UiBuilder.FrameCount)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
using Dalamud.Interface.GameFonts;
|
using Dalamud.Interface.GameFonts;
|
||||||
using Dalamud.Interface.ManagedFontAtlas;
|
using Dalamud.Interface.ManagedFontAtlas;
|
||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo;
|
namespace ChatTwo;
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ public class FontManager
|
|||||||
.ReadAsByteArrayAsync()
|
.ReadAsByteArrayAsync()
|
||||||
.Result;
|
.Result;
|
||||||
|
|
||||||
Dalamud.Utility.Util.WriteAllBytesSafe(filePath, GameSymFont);
|
Dalamud.Utility.FilesystemUtil.WriteAllBytesSafe(filePath, GameSymFont);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,10 +52,10 @@ public class FontManager
|
|||||||
{
|
{
|
||||||
ushort[] BuildRange(IReadOnlyList<ushort>? chars, params nint[] ranges)
|
ushort[] BuildRange(IReadOnlyList<ushort>? chars, params nint[] ranges)
|
||||||
{
|
{
|
||||||
var builder = new ImFontGlyphRangesBuilderPtr(ImGuiNative.ImFontGlyphRangesBuilder_ImFontGlyphRangesBuilder());
|
var builder = new ImFontGlyphRangesBuilderPtr(ImGuiNative.ImFontGlyphRangesBuilder());
|
||||||
// text
|
// text
|
||||||
foreach (var range in ranges)
|
foreach (var range in ranges)
|
||||||
builder.AddRanges(range);
|
builder.AddRanges((ushort*)range);
|
||||||
|
|
||||||
// chars
|
// chars
|
||||||
if (chars != null)
|
if (chars != null)
|
||||||
@@ -85,7 +85,7 @@ public class FontManager
|
|||||||
return builder.BuildRangesToArray();
|
return builder.BuildRangesToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
var ranges = new List<nint> { ImGui.GetIO().Fonts.GetGlyphRangesDefault() };
|
var ranges = new List<nint> { (nint)ImGui.GetIO().Fonts.GetGlyphRangesDefault() };
|
||||||
foreach (var extraRange in Enum.GetValues<ExtraGlyphRanges>())
|
foreach (var extraRange in Enum.GetValues<ExtraGlyphRanges>())
|
||||||
if (Plugin.Config.ExtraGlyphRanges.HasFlag(extraRange))
|
if (Plugin.Config.ExtraGlyphRanges.HasFlag(extraRange))
|
||||||
ranges.Add(extraRange.Range());
|
ranges.Add(extraRange.Range());
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ internal sealed unsafe class Chat : IDisposable
|
|||||||
private readonly delegate* unmanaged<NetworkModule*, ulong, ushort, Utf8String*, Utf8String*, ushort, ushort, byte> SendTellNative = null!;
|
private readonly delegate* unmanaged<NetworkModule*, ulong, ushort, Utf8String*, Utf8String*, ushort, ushort, byte> SendTellNative = null!;
|
||||||
|
|
||||||
// Client::UI::AddonChatLog.OnRefresh
|
// Client::UI::AddonChatLog.OnRefresh
|
||||||
[Signature("40 53 56 57 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 84 24 ?? ?? ?? ?? 49 8B F0 8B FA", DetourName = nameof(ChatLogRefreshDetour))]
|
[Signature("40 53 57 41 57 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 84 24 ?? ?? ?? ?? 4D 8B F8", DetourName = nameof(ChatLogRefreshDetour))]
|
||||||
private Hook<ChatLogRefreshDelegate>? ChatLogRefreshHook { get; init; }
|
private Hook<ChatLogRefreshDelegate>? ChatLogRefreshHook { get; init; }
|
||||||
private delegate byte ChatLogRefreshDelegate(nint log, ushort eventId, AtkValue* value);
|
private delegate byte ChatLogRefreshDelegate(nint log, ushort eventId, AtkValue* value);
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,9 @@ using Dalamud.Game.Text.SeStringHandling;
|
|||||||
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
using Dalamud.Memory;
|
using Dalamud.Memory;
|
||||||
|
using Dalamud.Utility;
|
||||||
using Dalamud.Utility.Signatures;
|
using Dalamud.Utility.Signatures;
|
||||||
|
using FFXIVClientStructs.FFXIV.Client.Enums;
|
||||||
using FFXIVClientStructs.FFXIV.Client.Game.UI;
|
using FFXIVClientStructs.FFXIV.Client.Game.UI;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI;
|
using FFXIVClientStructs.FFXIV.Client.UI;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
|
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
|
||||||
@@ -21,10 +23,9 @@ namespace ChatTwo.GameFunctions;
|
|||||||
internal unsafe class GameFunctions : IDisposable
|
internal unsafe class GameFunctions : IDisposable
|
||||||
{
|
{
|
||||||
#region Hooks
|
#region Hooks
|
||||||
private delegate nint ResolveTextCommandPlaceholderDelegate(nint a1, byte* placeholderText, byte a3, byte a4);
|
[Signature("E8 ?? ?? ?? ?? 48 85 C0 0F 84 ?? ?? ?? ?? 48 8B D0 49 8D 4F", DetourName = nameof(ResolveTextCommandPlaceholderDetour))]
|
||||||
|
|
||||||
[Signature("E8 ?? ?? ?? ?? 49 8D 4F 18 4C 8B E0", DetourName = nameof(ResolveTextCommandPlaceholderDetour))]
|
|
||||||
private Hook<ResolveTextCommandPlaceholderDelegate>? ResolveTextCommandPlaceholderHook { get; init; }
|
private Hook<ResolveTextCommandPlaceholderDelegate>? ResolveTextCommandPlaceholderHook { get; init; }
|
||||||
|
private delegate nint ResolveTextCommandPlaceholderDelegate(nint a1, byte* placeholderText, byte a3, byte a4);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private Plugin Plugin { get; }
|
private Plugin Plugin { get; }
|
||||||
@@ -109,7 +110,7 @@ internal unsafe class GameFunctions : IDisposable
|
|||||||
return addon != null && addon->IsVisible;
|
return addon != null && addon->IsVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void OpenItemTooltip(uint id, ItemPayload.ItemKind itemKind)
|
internal static void OpenItemTooltip(uint id, ItemKind itemKind)
|
||||||
{
|
{
|
||||||
var atkStage = AtkStage.Instance();
|
var atkStage = AtkStage.Instance();
|
||||||
var agent = AgentItemDetail.Instance();
|
var agent = AgentItemDetail.Instance();
|
||||||
@@ -119,7 +120,7 @@ internal unsafe class GameFunctions : IDisposable
|
|||||||
if (agent == null || addon == null)
|
if (agent == null || addon == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
agent->ItemKind = itemKind == ItemPayload.ItemKind.EventItem ? ItemDetailKind.ChatEventItem : ItemDetailKind.ChatItem;
|
agent->DetailKind = itemKind == ItemKind.EventItem ? DetailKind.KeyItem : DetailKind.Item;
|
||||||
agent->TypeOrId = id;
|
agent->TypeOrId = id;
|
||||||
agent->Index = 0;
|
agent->Index = 0;
|
||||||
agent->Flag1 &= 0xEF;
|
agent->Flag1 &= 0xEF;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using Dalamud.Game.Config;
|
|||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using FFXIVClientStructs.FFXIV.Client.System.String;
|
using FFXIVClientStructs.FFXIV.Client.System.String;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI;
|
using FFXIVClientStructs.FFXIV.Client.UI;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
using ModifierFlag = ChatTwo.GameFunctions.Types.ModifierFlag;
|
using ModifierFlag = ChatTwo.GameFunctions.Types.ModifierFlag;
|
||||||
|
|
||||||
namespace ChatTwo.GameFunctions;
|
namespace ChatTwo.GameFunctions;
|
||||||
|
|||||||
+7
-7
@@ -310,13 +310,13 @@ internal partial class Message
|
|||||||
|
|
||||||
var kind = item.ItemId switch
|
var kind = item.ItemId switch
|
||||||
{
|
{
|
||||||
< 500_000 => ItemPayload.ItemKind.Normal,
|
< 500_000 => ItemKind.Normal,
|
||||||
< 1_000_000 => ItemPayload.ItemKind.Collectible,
|
< 1_000_000 => ItemKind.Collectible,
|
||||||
< 2_000_000 => ItemPayload.ItemKind.Hq,
|
< 2_000_000 => ItemKind.Hq,
|
||||||
_ => ItemPayload.ItemKind.EventItem
|
_ => ItemKind.EventItem
|
||||||
};
|
};
|
||||||
|
|
||||||
var name = kind != ItemPayload.ItemKind.EventItem
|
var name = kind != ItemKind.EventItem
|
||||||
? Plugin.DataManager.GetExcelSheet<Item>().GetRow(item.ItemId).Name.ToString()
|
? Plugin.DataManager.GetExcelSheet<Item>().GetRow(item.ItemId).Name.ToString()
|
||||||
: Plugin.DataManager.GetExcelSheet<EventItem>().GetRow(item.ItemId).Name.ToString();
|
: Plugin.DataManager.GetExcelSheet<EventItem>().GetRow(item.ItemId).Name.ToString();
|
||||||
|
|
||||||
@@ -346,13 +346,13 @@ internal partial class Message
|
|||||||
else if (split == "<flag>")
|
else if (split == "<flag>")
|
||||||
{
|
{
|
||||||
var agentMap = AgentMap.Instance();
|
var agentMap = AgentMap.Instance();
|
||||||
if (!agentMap->IsFlagMarkerSet)
|
if (agentMap->FlagMarkerCount == 0)
|
||||||
{
|
{
|
||||||
AddChunkWithMessage(text.NewWithStyle(chunk.Source, chunk.Link, split));
|
AddChunkWithMessage(text.NewWithStyle(chunk.Source, chunk.Link, split));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var mapCoords = agentMap->FlagMapMarker;
|
var mapCoords = agentMap->FlagMapMarkers[0];
|
||||||
var rawX = (int)(MathF.Round(mapCoords.XFloat, 3, MidpointRounding.AwayFromZero) * 1000);
|
var rawX = (int)(MathF.Round(mapCoords.XFloat, 3, MidpointRounding.AwayFromZero) * 1000);
|
||||||
var rawY = (int)(MathF.Round(mapCoords.YFloat, 3, MidpointRounding.AwayFromZero) * 1000);
|
var rawY = (int)(MathF.Round(mapCoords.YFloat, 3, MidpointRounding.AwayFromZero) * 1000);
|
||||||
|
|
||||||
|
|||||||
+19
-15
@@ -18,7 +18,7 @@ using Dalamud.Interface.Utility.Raii;
|
|||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI;
|
using FFXIVClientStructs.FFXIV.Client.UI;
|
||||||
using FFXIVClientStructs.FFXIV.Component.GUI;
|
using FFXIVClientStructs.FFXIV.Component.GUI;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
using Lumina.Excel.Sheets;
|
using Lumina.Excel.Sheets;
|
||||||
|
|
||||||
using Action = System.Action;
|
using Action = System.Action;
|
||||||
@@ -263,17 +263,21 @@ public sealed class PayloadHandler
|
|||||||
if (!Plugin.GameConfig.TryGet(UiControlOption.DetailTrackingType, out uint selected) || selected != 0)
|
if (!Plugin.GameConfig.TryGet(UiControlOption.DetailTrackingType, out uint selected) || selected != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (LogWindow.LastViewport != ImGuiHelpers.MainViewport.NativePtr)
|
if (LogWindow.LastViewport != ImGuiHelpers.MainViewport.Handle)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var atk = (AtkUnitBase*) args.Addon;
|
var atk = args.Addon;
|
||||||
if (atk->WindowNode == null)
|
if (atk.IsNull)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!atk->IsVisible)
|
var atkBase = (AtkUnitBase*)atk.Address;
|
||||||
|
if (atkBase->WindowNode == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var component = atk->WindowNode->AtkResNode;
|
if (!atkBase->IsVisible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var component = atkBase->WindowNode->AtkResNode;
|
||||||
var atkPos = new Vector2(component.ScreenX, component.ScreenY);
|
var atkPos = new Vector2(component.ScreenX, component.ScreenY);
|
||||||
var atkSize = new Vector2(component.GetWidth() * component.ScaleX, component.GetHeight() * component.GetScaleY());
|
var atkSize = new Vector2(component.GetWidth() * component.ScaleX, component.GetHeight() * component.GetScaleY());
|
||||||
|
|
||||||
@@ -303,7 +307,7 @@ public sealed class PayloadHandler
|
|||||||
|
|
||||||
if (!chatRect.HasOverlap(addonRect))
|
if (!chatRect.HasOverlap(addonRect))
|
||||||
{
|
{
|
||||||
atk->SetPosition((short) addonRect.X, (short) addonRect.Y);
|
atkBase->SetPosition((short) addonRect.X, (short) addonRect.Y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,7 +325,7 @@ public sealed class PayloadHandler
|
|||||||
|
|
||||||
if (!chatRect.HasOverlap(addonRect))
|
if (!chatRect.HasOverlap(addonRect))
|
||||||
{
|
{
|
||||||
atk->SetPosition((short) addonRect.X, (short) addonRect.Y);
|
atkBase->SetPosition((short) addonRect.X, (short) addonRect.Y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,14 +334,14 @@ public sealed class PayloadHandler
|
|||||||
var y = Math.Clamp(chatRect.SizeY - atkSize.Y, 0, float.MaxValue);
|
var y = Math.Clamp(chatRect.SizeY - atkSize.Y, 0, float.MaxValue);
|
||||||
y -= isTop ? 0 : Plugin.Config.TooltipOffset; // offset to prevent cut-off on the bottom
|
y -= isTop ? 0 : Plugin.Config.TooltipOffset; // offset to prevent cut-off on the bottom
|
||||||
|
|
||||||
atk->SetPosition((short) x, (short) y);
|
atkBase->SetPosition((short) x, (short) y);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void InlineIcon(IDalamudTextureWrap icon)
|
private static void InlineIcon(IDalamudTextureWrap icon)
|
||||||
{
|
{
|
||||||
var cursor = ImGui.GetCursorPos();
|
var cursor = ImGui.GetCursorPos();
|
||||||
var size = ImGuiHelpers.ScaledVector2(32, 32);
|
var size = ImGuiHelpers.ScaledVector2(32, 32);
|
||||||
ImGui.Image(icon.ImGuiHandle, size);
|
ImGui.Image(icon.Handle, size);
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
ImGui.SetCursorPos(cursor + new Vector2(size.X + 4, size.Y - ImGui.GetTextLineHeightWithSpacing()));
|
ImGui.SetCursorPos(cursor + new Vector2(size.X + 4, size.Y - ImGui.GetTextLineHeightWithSpacing()));
|
||||||
}
|
}
|
||||||
@@ -373,7 +377,7 @@ public sealed class PayloadHandler
|
|||||||
|
|
||||||
private void HoverItem(ItemPayload item)
|
private void HoverItem(ItemPayload item)
|
||||||
{
|
{
|
||||||
if (item.Kind == ItemPayload.ItemKind.EventItem)
|
if (item.Kind == ItemKind.EventItem)
|
||||||
{
|
{
|
||||||
HoverEventItem(item);
|
HoverEventItem(item);
|
||||||
return;
|
return;
|
||||||
@@ -489,7 +493,7 @@ public sealed class PayloadHandler
|
|||||||
|
|
||||||
private void DrawItemPopup(ItemPayload payload)
|
private void DrawItemPopup(ItemPayload payload)
|
||||||
{
|
{
|
||||||
if (payload.Kind == ItemPayload.ItemKind.EventItem)
|
if (payload.Kind == ItemKind.EventItem)
|
||||||
{
|
{
|
||||||
DrawEventItemPopup(payload);
|
DrawEventItemPopup(payload);
|
||||||
return;
|
return;
|
||||||
@@ -498,7 +502,7 @@ public sealed class PayloadHandler
|
|||||||
if (!Sheets.ItemSheet.TryGetRow(payload.ItemId, out var itemRow))
|
if (!Sheets.ItemSheet.TryGetRow(payload.ItemId, out var itemRow))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var hq = payload.Kind == ItemPayload.ItemKind.Hq;
|
var hq = payload.Kind == ItemKind.Hq;
|
||||||
if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(itemRow.Icon, hq)).GetWrapOrDefault() is { } icon)
|
if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(itemRow.Icon, hq)).GetWrapOrDefault() is { } icon)
|
||||||
InlineIcon(icon);
|
InlineIcon(icon);
|
||||||
|
|
||||||
@@ -506,7 +510,7 @@ public sealed class PayloadHandler
|
|||||||
// hq symbol
|
// hq symbol
|
||||||
if (hq)
|
if (hq)
|
||||||
name.Payloads.Add(new TextPayload(" "));
|
name.Payloads.Add(new TextPayload(" "));
|
||||||
else if (payload.Kind == ItemPayload.ItemKind.Collectible)
|
else if (payload.Kind == ItemKind.Collectible)
|
||||||
name.Payloads.Add(new TextPayload(" "));
|
name.Payloads.Add(new TextPayload(" "));
|
||||||
|
|
||||||
LogWindow.DrawChunks(ChunkUtil.ToChunks(name, ChunkSource.None, null).ToList(), false);
|
LogWindow.DrawChunks(ChunkUtil.ToChunks(name, ChunkSource.None, null).ToList(), false);
|
||||||
@@ -538,7 +542,7 @@ public sealed class PayloadHandler
|
|||||||
|
|
||||||
private void DrawEventItemPopup(ItemPayload payload)
|
private void DrawEventItemPopup(ItemPayload payload)
|
||||||
{
|
{
|
||||||
if (payload.Kind != ItemPayload.ItemKind.EventItem)
|
if (payload.Kind != ItemKind.EventItem)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!Sheets.EventItemSheet.HasRow(payload.ItemId))
|
if (!Sheets.EventItemSheet.HasRow(payload.ItemId))
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ using Dalamud.Interface.Windowing;
|
|||||||
using Dalamud.IoC;
|
using Dalamud.IoC;
|
||||||
using Dalamud.Plugin;
|
using Dalamud.Plugin;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo;
|
namespace ChatTwo;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
|
|
||||||
internal class AutoCompleteInfo {
|
internal class AutoCompleteInfo
|
||||||
|
{
|
||||||
internal string ToComplete;
|
internal string ToComplete;
|
||||||
internal int StartPos { get; }
|
internal int StartPos { get; }
|
||||||
internal int EndPos { get; }
|
internal int EndPos { get; }
|
||||||
|
|
||||||
internal AutoCompleteInfo(string toComplete, int startPos, int endPos) {
|
internal AutoCompleteInfo(string toComplete, int startPos, int endPos)
|
||||||
|
{
|
||||||
ToComplete = toComplete;
|
ToComplete = toComplete;
|
||||||
StartPos = startPos;
|
StartPos = startPos;
|
||||||
EndPos = endPos;
|
EndPos = endPos;
|
||||||
|
|||||||
+33
-35
@@ -18,7 +18,7 @@ using Dalamud.Interface.Utility.Raii;
|
|||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using Dalamud.Memory;
|
using Dalamud.Memory;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI;
|
using FFXIVClientStructs.FFXIV.Client.UI;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
using Lumina.Excel.Sheets;
|
using Lumina.Excel.Sheets;
|
||||||
|
|
||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
@@ -443,10 +443,10 @@ public sealed class ChatLogWindow : Window
|
|||||||
if (!Plugin.Config.ShowTitleBar)
|
if (!Plugin.Config.ShowTitleBar)
|
||||||
Flags |= ImGuiWindowFlags.NoTitleBar;
|
Flags |= ImGuiWindowFlags.NoTitleBar;
|
||||||
|
|
||||||
if (LastViewport == ImGuiHelpers.MainViewport.NativePtr && !WasDocked)
|
if (LastViewport == ImGuiHelpers.MainViewport.Handle && !WasDocked)
|
||||||
BgAlpha = Plugin.Config.WindowAlpha / 100f;
|
BgAlpha = Plugin.Config.WindowAlpha / 100f;
|
||||||
|
|
||||||
LastViewport = ImGui.GetWindowViewport().NativePtr;
|
LastViewport = ImGui.GetWindowViewport().Handle;
|
||||||
WasDocked = ImGui.IsWindowDocked();
|
WasDocked = ImGui.IsWindowDocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -530,7 +530,7 @@ public sealed class ChatLogWindow : Window
|
|||||||
if (resized)
|
if (resized)
|
||||||
LastResize.Restart();
|
LastResize.Restart();
|
||||||
|
|
||||||
LastViewport = ImGui.GetWindowViewport().NativePtr;
|
LastViewport = ImGui.GetWindowViewport().Handle;
|
||||||
WasDocked = ImGui.IsWindowDocked();
|
WasDocked = ImGui.IsWindowDocked();
|
||||||
|
|
||||||
if (IsChatMode && Plugin.InputPreview.IsDrawable)
|
if (IsChatMode && Plugin.InputPreview.IsDrawable)
|
||||||
@@ -1430,7 +1430,7 @@ public sealed class ChatLogWindow : Window
|
|||||||
for (var i = 0; i < 10 && i < AutoCompleteList.Count; i++)
|
for (var i = 0; i < 10 && i < AutoCompleteList.Count; i++)
|
||||||
{
|
{
|
||||||
var num = (i + 1) % 10;
|
var num = (i + 1) % 10;
|
||||||
var key = ImGuiKey._0 + num;
|
var key = ImGuiKey.Key0 + num;
|
||||||
var key2 = ImGuiKey.Keypad0 + num;
|
var key2 = ImGuiKey.Keypad0 + num;
|
||||||
if (ImGui.IsKeyDown(key) || ImGui.IsKeyDown(key2))
|
if (ImGui.IsKeyDown(key) || ImGui.IsKeyDown(key2))
|
||||||
selected = i;
|
selected = i;
|
||||||
@@ -1460,7 +1460,7 @@ public sealed class ChatLogWindow : Window
|
|||||||
if (!child.Success)
|
if (!child.Success)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var clipper = new ImGuiListClipperPtr(ImGuiNative.ImGuiListClipper_ImGuiListClipper());
|
var clipper = new ImGuiListClipperPtr(ImGuiNative.ImGuiListClipper());
|
||||||
|
|
||||||
clipper.Begin(AutoCompleteList.Count);
|
clipper.Begin(AutoCompleteList.Count);
|
||||||
while (clipper.Step())
|
while (clipper.Step())
|
||||||
@@ -1503,19 +1503,19 @@ public sealed class ChatLogWindow : Window
|
|||||||
ImGui.SetScrollFromPosY(selectedPos - ImGui.GetWindowPos().Y);
|
ImGui.SetScrollFromPosY(selectedPos - ImGui.GetWindowPos().Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
private unsafe int AutoCompleteCallback(ImGuiInputTextCallbackData* data)
|
private int AutoCompleteCallback(scoped ref ImGuiInputTextCallbackData data)
|
||||||
{
|
{
|
||||||
if (FixCursor && AutoCompleteInfo != null)
|
if (FixCursor && AutoCompleteInfo != null)
|
||||||
{
|
{
|
||||||
FixCursor = false;
|
FixCursor = false;
|
||||||
data->CursorPos = AutoCompleteInfo.ToComplete.Length;
|
data.CursorPos = AutoCompleteInfo.ToComplete.Length;
|
||||||
data->SelectionStart = data->SelectionEnd = data->CursorPos;
|
data.SelectionStart = data.SelectionEnd = data.CursorPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AutoCompleteList == null)
|
if (AutoCompleteList == null)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
switch (data->EventKey)
|
switch (data.EventKey)
|
||||||
{
|
{
|
||||||
case ImGuiKey.UpArrow:
|
case ImGuiKey.UpArrow:
|
||||||
if (AutoCompleteSelection == 0)
|
if (AutoCompleteSelection == 0)
|
||||||
@@ -1550,7 +1550,7 @@ public sealed class ChatLogWindow : Window
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private unsafe int Callback(ImGuiInputTextCallbackData* data)
|
private unsafe int Callback(scoped ref ImGuiInputTextCallbackData data)
|
||||||
{
|
{
|
||||||
// We play the opening sound here only if closing sound has been played before
|
// We play the opening sound here only if closing sound has been played before
|
||||||
if (Plugin.Config.PlaySounds && PlayedClosingSound)
|
if (Plugin.Config.PlaySounds && PlayedClosingSound)
|
||||||
@@ -1559,22 +1559,20 @@ public sealed class ChatLogWindow : Window
|
|||||||
UIGlobals.PlaySoundEffect(ChatOpenSfx);
|
UIGlobals.PlaySoundEffect(ChatOpenSfx);
|
||||||
}
|
}
|
||||||
|
|
||||||
var ptr = new ImGuiInputTextCallbackDataPtr(data);
|
|
||||||
|
|
||||||
// Set the cursor pos to the user selected
|
// Set the cursor pos to the user selected
|
||||||
if (Plugin.InputPreview.SelectedCursorPos != -1)
|
if (Plugin.InputPreview.SelectedCursorPos != -1)
|
||||||
ptr.CursorPos = Plugin.InputPreview.SelectedCursorPos;
|
data.CursorPos = Plugin.InputPreview.SelectedCursorPos;
|
||||||
Plugin.InputPreview.SelectedCursorPos = -1;
|
Plugin.InputPreview.SelectedCursorPos = -1;
|
||||||
|
|
||||||
CursorPos = ptr.CursorPos;
|
CursorPos = data.CursorPos;
|
||||||
if (data->EventFlag == ImGuiInputTextFlags.CallbackCompletion)
|
if (data.EventFlag == ImGuiInputTextFlags.CallbackCompletion)
|
||||||
{
|
{
|
||||||
if (ptr.CursorPos == 0)
|
if (data.CursorPos == 0)
|
||||||
{
|
{
|
||||||
AutoCompleteInfo = new AutoCompleteInfo(
|
AutoCompleteInfo = new AutoCompleteInfo(
|
||||||
string.Empty,
|
string.Empty,
|
||||||
ptr.CursorPos,
|
data.CursorPos,
|
||||||
ptr.CursorPos
|
data.CursorPos
|
||||||
);
|
);
|
||||||
AutoCompleteOpen = true;
|
AutoCompleteOpen = true;
|
||||||
AutoCompleteSelection = 0;
|
AutoCompleteSelection = 0;
|
||||||
@@ -1583,14 +1581,14 @@ public sealed class ChatLogWindow : Window
|
|||||||
}
|
}
|
||||||
|
|
||||||
int white;
|
int white;
|
||||||
for (white = ptr.CursorPos - 1; white >= 0; white--)
|
for (white = data.CursorPos - 1; white >= 0; white--)
|
||||||
if (data->Buf[white] == ' ')
|
if (data.Buf[white] == ' ')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
var start = ptr.Buf + white + 1;
|
var start = data.Buf + white + 1;
|
||||||
var end = ptr.CursorPos - white - 1;
|
var end = data.CursorPos - white - 1;
|
||||||
var utf8Message = Marshal.PtrToStringUTF8(start, end);
|
var utf8Message = Marshal.PtrToStringUTF8((nint)start, end);
|
||||||
var correctedCursor = ptr.CursorPos - (end - utf8Message.Length);
|
var correctedCursor = data.CursorPos - (end - utf8Message.Length);
|
||||||
AutoCompleteInfo = new AutoCompleteInfo(
|
AutoCompleteInfo = new AutoCompleteInfo(
|
||||||
utf8Message,
|
utf8Message,
|
||||||
white + 1,
|
white + 1,
|
||||||
@@ -1601,20 +1599,20 @@ public sealed class ChatLogWindow : Window
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->EventFlag == ImGuiInputTextFlags.CallbackCharFilter)
|
if (data.EventFlag == ImGuiInputTextFlags.CallbackCharFilter)
|
||||||
if (!Plugin.Functions.Chat.IsCharValid((char) ptr.EventChar))
|
if (!Plugin.Functions.Chat.IsCharValid((char) data.EventChar))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (Activate)
|
if (Activate)
|
||||||
{
|
{
|
||||||
Activate = false;
|
Activate = false;
|
||||||
data->CursorPos = ActivatePos > -1 ? ActivatePos : Chat.Length;
|
data.CursorPos = ActivatePos > -1 ? ActivatePos : Chat.Length;
|
||||||
data->SelectionStart = data->SelectionEnd = data->CursorPos;
|
data.SelectionStart = data.SelectionEnd = data.CursorPos;
|
||||||
ActivatePos = -1;
|
ActivatePos = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Plugin.CommandHelpWindow.IsOpen = false;
|
Plugin.CommandHelpWindow.IsOpen = false;
|
||||||
var text = MemoryHelper.ReadString((nint) data->Buf, data->BufTextLen);
|
var text = MemoryHelper.ReadString((nint) data.Buf, data.BufTextLen);
|
||||||
if (text.StartsWith('/'))
|
if (text.StartsWith('/'))
|
||||||
{
|
{
|
||||||
var command = text.Split(' ')[0];
|
var command = text.Split(' ')[0];
|
||||||
@@ -1626,11 +1624,11 @@ public sealed class ChatLogWindow : Window
|
|||||||
Plugin.CommandHelpWindow.UpdateContent(cmd.Value);
|
Plugin.CommandHelpWindow.UpdateContent(cmd.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->EventFlag != ImGuiInputTextFlags.CallbackHistory)
|
if (data.EventFlag != ImGuiInputTextFlags.CallbackHistory)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
var prevPos = InputBacklogIdx;
|
var prevPos = InputBacklogIdx;
|
||||||
switch (data->EventKey)
|
switch (data.EventKey)
|
||||||
{
|
{
|
||||||
case ImGuiKey.UpArrow:
|
case ImGuiKey.UpArrow:
|
||||||
switch (InputBacklogIdx)
|
switch (InputBacklogIdx)
|
||||||
@@ -1662,8 +1660,8 @@ public sealed class ChatLogWindow : Window
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
var historyStr = InputBacklogIdx >= 0 ? InputBacklog[InputBacklogIdx] : string.Empty;
|
var historyStr = InputBacklogIdx >= 0 ? InputBacklog[InputBacklogIdx] : string.Empty;
|
||||||
ptr.DeleteChars(0, ptr.BufTextLen);
|
data.DeleteChars(0, data.BufTextLen);
|
||||||
ptr.InsertChars(0, historyStr);
|
data.InsertChars(0, historyStr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1793,7 +1791,7 @@ public sealed class ChatLogWindow : Window
|
|||||||
var uv0 = new Vector2(entry.Left, entry.Top + 170) * 2 / texSize;
|
var uv0 = new Vector2(entry.Left, entry.Top + 170) * 2 / texSize;
|
||||||
var uv1 = new Vector2(entry.Left + entry.Width, entry.Top + entry.Height + 170) * 2 / texSize;
|
var uv1 = new Vector2(entry.Left + entry.Width, entry.Top + entry.Height + 170) * 2 / texSize;
|
||||||
|
|
||||||
ImGui.Image(iconTexture.ImGuiHandle, size, uv0, uv1);
|
ImGui.Image(iconTexture.Handle, size, uv0, uv1);
|
||||||
ImGuiUtil.PostPayload(chunk, handler);
|
ImGuiUtil.PostPayload(chunk, handler);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using ChatTwo.Util;
|
|||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
using Lumina.Excel.Sheets;
|
using Lumina.Excel.Sheets;
|
||||||
|
|
||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ using Dalamud.Interface.Colors;
|
|||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Dalamud.Interface.Colors;
|
|||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
|
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
using Lumina.Text.ReadOnly;
|
using Lumina.Text.ReadOnly;
|
||||||
|
|
||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using Dalamud.Game.Text.SeStringHandling.Payloads;
|
|||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
using Dalamud.Interface.Style;
|
using Dalamud.Interface.Style;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ using Dalamud.Game.Text.SeStringHandling;
|
|||||||
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
using Dalamud.Utility;
|
||||||
using DalamudPartyFinderPayload = Dalamud.Game.Text.SeStringHandling.Payloads.PartyFinderPayload;
|
using DalamudPartyFinderPayload = Dalamud.Game.Text.SeStringHandling.Payloads.PartyFinderPayload;
|
||||||
|
|
||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
@@ -146,7 +146,7 @@ public class SeStringDebugger : Window
|
|||||||
{ "RawItemId", item.RawItemId.ToString() },
|
{ "RawItemId", item.RawItemId.ToString() },
|
||||||
{ "Kind", EnumName(item.Kind) },
|
{ "Kind", EnumName(item.Kind) },
|
||||||
{ "IsHQ", item.IsHQ.ToString() },
|
{ "IsHQ", item.IsHQ.ToString() },
|
||||||
{ "Item.Name", item.Kind == ItemPayload.ItemKind.EventItem ? Sheets.EventItemSheet.GetRow(item.ItemId).Name.ExtractText() : Sheets.ItemSheet.GetRow(item.ItemId).Name.ExtractText() },
|
{ "Item.Name", item.Kind == ItemKind.EventItem ? Sheets.EventItemSheet.GetRow(item.ItemId).Name.ExtractText() : Sheets.ItemSheet.GetRow(item.ItemId).Name.ExtractText() },
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using ChatTwo.Util;
|
|||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui;
|
namespace ChatTwo.Ui;
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using Dalamud.Interface;
|
|||||||
using Dalamud.Interface.Colors;
|
using Dalamud.Interface.Colors;
|
||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using ChatTwo.Resources;
|
using ChatTwo.Resources;
|
||||||
using ChatTwo.Util;
|
using ChatTwo.Util;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using ChatTwo.Code;
|
|||||||
using ChatTwo.Resources;
|
using ChatTwo.Resources;
|
||||||
using ChatTwo.Util;
|
using ChatTwo.Util;
|
||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using ChatTwo.Resources;
|
|||||||
using ChatTwo.Util;
|
using ChatTwo.Util;
|
||||||
using Dalamud.Interface.Style;
|
using Dalamud.Interface.Style;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ using Dalamud.Game.Text.SeStringHandling;
|
|||||||
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
||||||
using Dalamud.Interface.ImGuiNotification;
|
using Dalamud.Interface.ImGuiNotification;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using ChatTwo.Code;
|
|||||||
using ChatTwo.Resources;
|
using ChatTwo.Resources;
|
||||||
using ChatTwo.Util;
|
using ChatTwo.Util;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using ChatTwo.Util;
|
|||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
using Dalamud.Interface.Colors;
|
using Dalamud.Interface.Colors;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ using ChatTwo.Resources;
|
|||||||
using ChatTwo.Util;
|
using ChatTwo.Util;
|
||||||
using Dalamud;
|
using Dalamud;
|
||||||
using Dalamud.Interface.FontIdentifier;
|
using Dalamud.Interface.FontIdentifier;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using ChatTwo.Resources;
|
using ChatTwo.Resources;
|
||||||
using ChatTwo.Util;
|
using ChatTwo.Util;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using ChatTwo.Resources;
|
using ChatTwo.Resources;
|
||||||
using ChatTwo.Util;
|
using ChatTwo.Util;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using ChatTwo.Resources;
|
|||||||
using ChatTwo.Util;
|
using ChatTwo.Util;
|
||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using Dalamud.Interface;
|
|||||||
using Dalamud.Interface.Colors;
|
using Dalamud.Interface.Colors;
|
||||||
using Dalamud.Interface.ImGuiNotification;
|
using Dalamud.Interface.ImGuiNotification;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
|
|||||||
@@ -83,6 +83,9 @@ internal static class AutoTranslate
|
|||||||
{
|
{
|
||||||
if (lookup is not ("" or "@"))
|
if (lookup is not ("" or "@"))
|
||||||
{
|
{
|
||||||
|
// SE added whitespace to the newest additions, but ParseOrThrow doesn't see them as valid
|
||||||
|
lookup = lookup.Replace(" ", "");
|
||||||
|
|
||||||
var (sheetName, selector) = parser.ParseOrThrow(lookup);
|
var (sheetName, selector) = parser.ParseOrThrow(lookup);
|
||||||
var sheet = Plugin.DataManager.Excel.GetSheet<WorkingRawRow>(name: sheetName);
|
var sheet = Plugin.DataManager.Excel.GetSheet<WorkingRawRow>(name: sheetName);
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using Dalamud.Interface.ImGuiNotification;
|
|||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Util;
|
namespace ChatTwo.Util;
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ public static class DateWidget
|
|||||||
var arrowLeftWidth = ImGui.CalcTextSize(arrowLeft).X;
|
var arrowLeftWidth = ImGui.CalcTextSize(arrowLeft).X;
|
||||||
var arrowRightWidth = ImGui.CalcTextSize(arrowRight).X;
|
var arrowRightWidth = ImGui.CalcTextSize(arrowRight).X;
|
||||||
|
|
||||||
var labelSize = ImGui.CalcTextSize(label, 0, true);
|
var labelSize = ImGui.CalcTextSize(label, true, 0);
|
||||||
|
|
||||||
var widthRequiredByCalendar = (2.0f * arrowLeftWidth) + (2.0f * arrowRightWidth) + LongestMonthWidth + ImGui.CalcTextSize("9999").X + (120.0f * ImGuiHelpers.GlobalScale);
|
var widthRequiredByCalendar = (2.0f * arrowLeftWidth) + (2.0f * arrowRightWidth) + LongestMonthWidth + ImGui.CalcTextSize("9999").X + (120.0f * ImGuiHelpers.GlobalScale);
|
||||||
var popupHeight = ((labelSize.Y + (2 * style.ItemSpacing.Y)) * HeightInItems) + (style.FramePadding.Y * 3);
|
var popupHeight = ((labelSize.Y + (2 * style.ItemSpacing.Y)) * HeightInItems) + (style.FramePadding.Y * 3);
|
||||||
|
|||||||
+16
-16
@@ -12,7 +12,7 @@ using Dalamud.Interface.ImGuiFontChooserDialog;
|
|||||||
using Dalamud.Interface.Style;
|
using Dalamud.Interface.Style;
|
||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
|
|
||||||
namespace ChatTwo.Util;
|
namespace ChatTwo.Util;
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ internal static class ImGuiUtil
|
|||||||
{
|
{
|
||||||
var oldPos = ImGui.GetCursorScreenPos();
|
var oldPos = ImGui.GetCursorScreenPos();
|
||||||
|
|
||||||
ImGuiNative.igTextUnformatted(text, textEnd);
|
ImGuiNative.TextUnformatted(text, textEnd);
|
||||||
PostPayload(chunk, handler);
|
PostPayload(chunk, handler);
|
||||||
|
|
||||||
if (!ReferenceEquals(LastLink, chunk.Link))
|
if (!ReferenceEquals(LastLink, chunk.Link))
|
||||||
@@ -107,7 +107,7 @@ internal static class ImGuiUtil
|
|||||||
}
|
}
|
||||||
|
|
||||||
var widthLeft = ImGui.GetContentRegionAvail().X;
|
var widthLeft = ImGui.GetContentRegionAvail().X;
|
||||||
var endPrevLine = ImGuiNative.ImFont_CalcWordWrapPositionA(ImGui.GetFont().NativePtr, ImGuiHelpers.GlobalScale, text, textEnd, widthLeft);
|
var endPrevLine = ImGuiNative.CalcWordWrapPositionA(ImGui.GetFont().Handle, ImGuiHelpers.GlobalScale, text, textEnd, widthLeft);
|
||||||
if (endPrevLine == null)
|
if (endPrevLine == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ internal static class ImGuiUtil
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// check if the next bit is longer than the entire line width
|
// check if the next bit is longer than the entire line width
|
||||||
var wrapPos = ImGuiNative.ImFont_CalcWordWrapPositionA(ImGui.GetFont().NativePtr, ImGuiHelpers.GlobalScale, text, firstSpace, lineWidth);
|
var wrapPos = ImGuiNative.CalcWordWrapPositionA(ImGui.GetFont().Handle, ImGuiHelpers.GlobalScale, text, firstSpace, lineWidth);
|
||||||
|
|
||||||
// only go to next line is it's going to wrap at the space
|
// only go to next line is it's going to wrap at the space
|
||||||
if (wrapPos >= firstSpace)
|
if (wrapPos >= firstSpace)
|
||||||
@@ -144,7 +144,7 @@ internal static class ImGuiUtil
|
|||||||
if (*text == ' ')
|
if (*text == ' ')
|
||||||
++text;
|
++text;
|
||||||
|
|
||||||
var newEnd = ImGuiNative.ImFont_CalcWordWrapPositionA(ImGui.GetFont().NativePtr, ImGuiHelpers.GlobalScale, text, textEnd, widthLeft);
|
var newEnd = ImGuiNative.CalcWordWrapPositionA(ImGui.GetFont().Handle, ImGuiHelpers.GlobalScale, text, textEnd, widthLeft);
|
||||||
if (properBreak && newEnd == endPrevLine)
|
if (properBreak && newEnd == endPrevLine)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -257,7 +257,7 @@ internal static class ImGuiUtil
|
|||||||
{
|
{
|
||||||
ImGui.TextUnformatted(label);
|
ImGui.TextUnformatted(label);
|
||||||
ImGui.SetNextItemWidth(-1);
|
ImGui.SetNextItemWidth(-1);
|
||||||
var r = ImGui.InputInt($"##{label}", ref value, step, stepFast, flags);
|
var r = ImGui.InputInt($"##{label}", ref value, step, stepFast, flags: flags);
|
||||||
HelpText(description);
|
HelpText(description);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
@@ -475,16 +475,16 @@ internal static class ImGuiUtil
|
|||||||
VirtualKey.SNAPSHOT => ImGuiKey.PrintScreen,
|
VirtualKey.SNAPSHOT => ImGuiKey.PrintScreen,
|
||||||
VirtualKey.INSERT => ImGuiKey.Insert,
|
VirtualKey.INSERT => ImGuiKey.Insert,
|
||||||
VirtualKey.DELETE => ImGuiKey.Delete,
|
VirtualKey.DELETE => ImGuiKey.Delete,
|
||||||
VirtualKey.KEY_0 => ImGuiKey._0,
|
VirtualKey.KEY_0 => ImGuiKey.Key0,
|
||||||
VirtualKey.KEY_1 => ImGuiKey._1,
|
VirtualKey.KEY_1 => ImGuiKey.Key1,
|
||||||
VirtualKey.KEY_2 => ImGuiKey._2,
|
VirtualKey.KEY_2 => ImGuiKey.Key2,
|
||||||
VirtualKey.KEY_3 => ImGuiKey._3,
|
VirtualKey.KEY_3 => ImGuiKey.Key3,
|
||||||
VirtualKey.KEY_4 => ImGuiKey._4,
|
VirtualKey.KEY_4 => ImGuiKey.Key4,
|
||||||
VirtualKey.KEY_5 => ImGuiKey._5,
|
VirtualKey.KEY_5 => ImGuiKey.Key5,
|
||||||
VirtualKey.KEY_6 => ImGuiKey._6,
|
VirtualKey.KEY_6 => ImGuiKey.Key6,
|
||||||
VirtualKey.KEY_7 => ImGuiKey._7,
|
VirtualKey.KEY_7 => ImGuiKey.Key7,
|
||||||
VirtualKey.KEY_8 => ImGuiKey._8,
|
VirtualKey.KEY_8 => ImGuiKey.Key8,
|
||||||
VirtualKey.KEY_9 => ImGuiKey._9,
|
VirtualKey.KEY_9 => ImGuiKey.Key9,
|
||||||
VirtualKey.A => ImGuiKey.A,
|
VirtualKey.A => ImGuiKey.A,
|
||||||
VirtualKey.B => ImGuiKey.B,
|
VirtualKey.B => ImGuiKey.B,
|
||||||
VirtualKey.C => ImGuiKey.C,
|
VirtualKey.C => ImGuiKey.C,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using ImGuiNET;
|
using Dalamud.Bindings.ImGui;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using Dalamud.Interface.Utility.Raii;
|
using Dalamud.Interface.Utility.Raii;
|
||||||
|
|
||||||
@@ -147,7 +147,7 @@ public unsafe class ListClipper : IEnumerable<(int, int)>, IDisposable
|
|||||||
CurrentColumns = cols;
|
CurrentColumns = cols;
|
||||||
CurrentRows = TwoDimensional ? items : (int)MathF.Ceiling((float)items / CurrentColumns);
|
CurrentRows = TwoDimensional ? items : (int)MathF.Ceiling((float)items / CurrentColumns);
|
||||||
ItemRemainder = !TwoDimensional ? items % CurrentColumns : 0;
|
ItemRemainder = !TwoDimensional ? items % CurrentColumns : 0;
|
||||||
Clipper = new ImGuiListClipperPtr(ImGuiNative.ImGuiListClipper_ImGuiListClipper());
|
Clipper = new ImGuiListClipperPtr(ImGuiNative.ImGuiListClipper());
|
||||||
Clipper.Begin(CurrentRows, itemHeight);
|
Clipper.Begin(CurrentRows, itemHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-15
@@ -4,9 +4,9 @@
|
|||||||
"net9.0-windows7.0": {
|
"net9.0-windows7.0": {
|
||||||
"DalamudPackager": {
|
"DalamudPackager": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[12.0.0, )",
|
"requested": "[13.0.0, )",
|
||||||
"resolved": "12.0.0",
|
"resolved": "13.0.0",
|
||||||
"contentHash": "J5TJLV3f16T/E2H2P17ClWjtfEBPpq3yxvqW46eN36JCm6wR+EaoaYkqG9Rm5sHqs3/nK/vKjWWyvEs/jhKoXw=="
|
"contentHash": "Mb3cUDSK/vDPQ8gQIeuCw03EMYrej1B4J44a1AvIJ9C759p9XeqdU9Hg4WgOmlnlPe0G7ILTD32PKSUpkQNa8w=="
|
||||||
},
|
},
|
||||||
"DotNet.ReproducibleBuilds": {
|
"DotNet.ReproducibleBuilds": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
@@ -16,12 +16,12 @@
|
|||||||
},
|
},
|
||||||
"MessagePack": {
|
"MessagePack": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[3.1.3, )",
|
"requested": "[3.1.4, )",
|
||||||
"resolved": "3.1.3",
|
"resolved": "3.1.4",
|
||||||
"contentHash": "UiNv3fknvPzh5W+S0VV96R17RBZQQU71qgmsMnjjRZU2rtQM/XcTnOB+klT2dA6T1mxjnNKYrEm164AoXvGmYg==",
|
"contentHash": "BH0wlHWmVoZpbAPyyt2Awbq30C+ZsS3eHSkYdnyUAbqVJ22fAJDzn2xTieBeoT5QlcBzp61vHcv878YJGfi3mg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"MessagePack.Annotations": "3.1.3",
|
"MessagePack.Annotations": "3.1.4",
|
||||||
"MessagePackAnalyzer": "3.1.3",
|
"MessagePackAnalyzer": "3.1.4",
|
||||||
"Microsoft.NET.StringTools": "17.11.4"
|
"Microsoft.NET.StringTools": "17.11.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -44,9 +44,9 @@
|
|||||||
},
|
},
|
||||||
"SixLabors.ImageSharp": {
|
"SixLabors.ImageSharp": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[3.1.7, )",
|
"requested": "[3.1.11, )",
|
||||||
"resolved": "3.1.7",
|
"resolved": "3.1.11",
|
||||||
"contentHash": "9fIOOAsyLFid6qKypM2Iy0Z3Q9yoanV8VoYAHtI2sYGMNKzhvRTjgFDHonIiVe+ANtxIxM6SuqUzj0r91nItpA=="
|
"contentHash": "JfPLyigLthuE50yi6tMt7Amrenr/fA31t2CvJyhy/kQmfulIBAqo5T/YFUSRHtuYPXRSaUHygFeh6Qd933EoSw=="
|
||||||
},
|
},
|
||||||
"Watson.Lite": {
|
"Watson.Lite": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
@@ -70,13 +70,13 @@
|
|||||||
},
|
},
|
||||||
"MessagePack.Annotations": {
|
"MessagePack.Annotations": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "3.1.3",
|
"resolved": "3.1.4",
|
||||||
"contentHash": "XTy4njgTAf6UVBKFj7c7ad5R0WVKbvAgkbYZy4f00kplzX2T3VOQ34AUke/Vn/QgQZ7ETdd34/IDWS3KBInSGA=="
|
"contentHash": "aVWrDAkCdqxwQsz/q0ldPh2EFn48M99YUzE9OvZjMq2RNLKz4o2z88iGFvSvbMqOWRweRvKPHBJZe22PRqzslQ=="
|
||||||
},
|
},
|
||||||
"MessagePackAnalyzer": {
|
"MessagePackAnalyzer": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "3.1.3",
|
"resolved": "3.1.4",
|
||||||
"contentHash": "19u1oVNv2brCs5F/jma8O8CnsKMMpYwNqD0CAEDEzvqwDTAhqC9r7xHZP4stPb3APs/ryO/zVn7LvjoEHfvs7Q=="
|
"contentHash": "CTaSsN/liJ7MhLCAB7Z4ZLBNuVGCq9lt2BT/cbrc9vzGv89yK3CqIA+z9T19a11eQYl9etZHL6MQJgCqECRVpg=="
|
||||||
},
|
},
|
||||||
"Microsoft.Data.Sqlite.Core": {
|
"Microsoft.Data.Sqlite.Core": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
|
|||||||
Reference in New Issue
Block a user