diff --git a/Dalamud.Injector/Dalamud.Injector.csproj b/Dalamud.Injector/Dalamud.Injector.csproj
index 32c5c75c2..2788d54fc 100644
--- a/Dalamud.Injector/Dalamud.Injector.csproj
+++ b/Dalamud.Injector/Dalamud.Injector.csproj
@@ -14,10 +14,10 @@
true
- 4.8.8.0
- 4.8.8.0
+ 4.8.9.0
+ 4.8.9.0XIVLauncher addon injection
- 4.8.8.0
+ 4.8.9.0
diff --git a/Dalamud.Injector/Program.cs b/Dalamud.Injector/Program.cs
index ffd612034..f538d714a 100644
--- a/Dalamud.Injector/Program.cs
+++ b/Dalamud.Injector/Program.cs
@@ -16,18 +16,20 @@ namespace Dalamud.Injector {
static private Process process = null;
private static void Main(string[] args) {
-#if !DEBUG
+
AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs eventArgs)
{
File.WriteAllText("InjectorException.txt", eventArgs.ExceptionObject.ToString());
-
+#if !DEBUG
MessageBox.Show("Failed to inject the XIVLauncher in-game addon.\nPlease try restarting your game and your PC.\nIf this keeps happening, please report this error.", "XIVLauncher Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
-
+#else
+ MessageBox.Show("Couldn't inject.\nMake sure that Dalamud was not injected into your target process as a release build before and that the target process can be accessed with VM_WRITE permissions.\n\n" + eventArgs.ExceptionObject, "Debug Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+#endif
Environment.Exit(0);
};
-#endif
- var pid = -1;
+
+ var pid = -1;
if (args.Length == 1) {
pid = int.Parse(args[0]);
}
diff --git a/Dalamud/Dalamud.cs b/Dalamud/Dalamud.cs
index 56cce8f4d..9b5163efe 100644
--- a/Dalamud/Dalamud.cs
+++ b/Dalamud/Dalamud.cs
@@ -40,13 +40,13 @@ namespace Dalamud {
public readonly Framework Framework;
- public readonly CommandManager CommandManager;
+ public CommandManager CommandManager { get; private set; }
- public readonly ChatHandlers ChatHandlers;
+ public ChatHandlers ChatHandlers { get; private set; }
- public readonly NetworkHandlers NetworkHandlers;
+ public NetworkHandlers NetworkHandlers { get; private set; }
- public readonly DiscordBotManager BotManager;
+ public DiscordBotManager BotManager { get; private set; }
public PluginManager PluginManager { get; private set; }
public PluginRepository PluginRepository { get; private set; }
@@ -60,13 +60,14 @@ namespace Dalamud {
private readonly WinSockHandlers WinSock2;
- public readonly InterfaceManager InterfaceManager;
+ public InterfaceManager InterfaceManager { get; private set; }
- public readonly DataManager Data;
+ public DataManager Data { get; private set; }
private Localization localizationMgr;
+ public bool IsReady { get; private set; }
private readonly string assemblyVersion = Assembly.GetAssembly(typeof(ChatHandlers)).GetName().Version.ToString();
@@ -75,13 +76,6 @@ namespace Dalamud {
this.loggingLevelSwitch = loggingLevelSwitch;
this.Configuration = DalamudConfiguration.Load(info.ConfigurationPath);
- this.localizationMgr = new Localization(this.StartInfo.WorkingDirectory);
-
- if (!string.IsNullOrEmpty(this.Configuration.LanguageOverride)) {
- this.localizationMgr.SetupWithLangCode(this.Configuration.LanguageOverride);
- } else {
- this.localizationMgr.SetupWithUiCulture();
- }
this.baseDirectory = info.WorkingDirectory;
@@ -94,53 +88,63 @@ namespace Dalamud {
// Initialize game subsystem
this.Framework = new Framework(this.SigScanner, this);
- // Initialize managers. Basically handlers for the logic
- this.CommandManager = new CommandManager(this, info.Language);
- SetupCommands();
-
- this.ChatHandlers = new ChatHandlers(this);
- this.NetworkHandlers = new NetworkHandlers(this, this.Configuration.OptOutMbCollection);
-
- this.Data = new DataManager(this.StartInfo.Language);
- this.Data.Initialize();
-
- // TODO: better way to do this? basically for lumina injection
- SeString.Dalamud = this;
-
this.ClientState = new ClientState(this, info, this.SigScanner);
- this.BotManager = new DiscordBotManager(this, this.Configuration.DiscordFeatureConfig);
-
this.WinSock2 = new WinSockHandlers();
- try {
- this.InterfaceManager = new InterfaceManager(this, this.SigScanner);
- this.InterfaceManager.OnDraw += BuildDalamudUi;
- } catch (Exception e) {
- Log.Information(e, "Could not init interface.");
- }
+ AssetManager.EnsureAssets(this.baseDirectory).ContinueWith(async task => {
+ this.localizationMgr = new Localization(this.StartInfo.WorkingDirectory);
+ if (!string.IsNullOrEmpty(this.Configuration.LanguageOverride)) {
+ this.localizationMgr.SetupWithLangCode(this.Configuration.LanguageOverride);
+ } else {
+ this.localizationMgr.SetupWithUiCulture();
+ }
+
+ try {
+ this.InterfaceManager = new InterfaceManager(this, this.SigScanner);
+ this.InterfaceManager.OnDraw += BuildDalamudUi;
+
+ this.InterfaceManager.Enable();
+ } catch (Exception e) {
+ Log.Information(e, "Could not init interface.");
+ }
+
+ this.Data = new DataManager(this.StartInfo.Language);
+ await this.Data.Initialize(this.baseDirectory);
+
+ // TODO: better way to do this? basically for lumina injection
+ SeString.Dalamud = this;
+
+ this.NetworkHandlers = new NetworkHandlers(this, this.Configuration.OptOutMbCollection);
+
+ // Initialize managers. Basically handlers for the logic
+ this.CommandManager = new CommandManager(this, info.Language);
+ SetupCommands();
+
+ this.ChatHandlers = new ChatHandlers(this);
+ // Discord Bot Manager
+ this.BotManager = new DiscordBotManager(this, this.Configuration.DiscordFeatureConfig);
+ this.BotManager.Start();
+
+ try
+ {
+ this.PluginManager = new PluginManager(this, this.StartInfo.PluginDirectory, this.StartInfo.DefaultPluginDirectory);
+ this.PluginManager.LoadPlugins();
+
+ this.PluginRepository = new PluginRepository(PluginManager, this.StartInfo.PluginDirectory, this.StartInfo.GameVersion);
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex, "Plugin load failed.");
+ }
+
+ IsReady = true;
+ });
}
public void Start() {
- try {
- this.InterfaceManager?.Enable();
- } catch (Exception e) {
- Log.Information("Could not enable interface.");
- }
-
this.Framework.Enable();
this.ClientState.Enable();
-
- this.BotManager.Start();
-
- try {
- this.PluginManager = new PluginManager(this, this.StartInfo.PluginDirectory, this.StartInfo.DefaultPluginDirectory);
- this.PluginManager.LoadPlugins();
-
- PluginRepository = new PluginRepository(PluginManager, this.StartInfo.PluginDirectory, this.StartInfo.GameVersion);
- } catch (Exception ex) {
- Log.Error(ex, "Plugin load failed.");
- }
}
public void Unload() {
@@ -156,7 +160,7 @@ namespace Dalamud {
// due to rendering happening on another thread, where a plugin might receive
// a render call after it has been disposed, which can crash if it attempts to
// use any resources that it freed in its own Dispose method
- this.InterfaceManager.Dispose();
+ this.InterfaceManager?.Dispose();
try
{
@@ -211,7 +215,7 @@ namespace Dalamud {
ImGui.Separator();
if (ImGui.MenuItem("Open Log window"))
{
- this.logWindow = new DalamudLogWindow();
+ this.logWindow = new DalamudLogWindow(CommandManager);
this.isImguiDrawLogWindow = true;
}
if (ImGui.BeginMenu("Set log level..."))
@@ -439,7 +443,7 @@ namespace Dalamud {
this.CommandManager.AddHandler("/xllanguage", new CommandInfo(OnSetLanguageCommand)
{
- HelpMessage = Loc.Localize("DalamudLanguageHelp", "Set the language for the in-game addon and plugins that support it.")
+ HelpMessage = Loc.Localize("DalamudLanguageHelp", "Set the language for the in-game addon and plugins that support it. Available languages: ") + Localization.ApplicableLangCodes.Aggregate("en", (current, code) => current + ", " + code)
});
this.CommandManager.AddHandler("/imdebug", new CommandInfo(OnDebugImInfoCommand)
@@ -606,15 +610,15 @@ namespace Dalamud {
else
this.Configuration.PreferredRoleReminders.Add(rouletteIndex, role);
- Framework.Gui.Chat.Print($"Set bonus notifications for {argParts[0]}({rouletteIndex}) to {role}");
- Framework.Gui.Chat.Print(string.Format(Loc.Localize("DalamudBonusSet", "Set bonus notifications for {0}({1}) to {2}"), argParts[0], rouletteIndex, role));
+ this.Framework.Gui.Chat.Print($"Set bonus notifications for {argParts[0]}({rouletteIndex}) to {role}");
+ this.Framework.Gui.Chat.Print(string.Format(Loc.Localize("DalamudBonusSet", "Set bonus notifications for {0}({1}) to {2}"), argParts[0], rouletteIndex, role));
this.Configuration.Save();
return;
InvalidArgs:
- Framework.Gui.Chat.PrintError(Loc.Localize("DalamudInvalidArguments", "Unrecognized arguments."));
- Framework.Gui.Chat.Print(Loc.Localize("DalamudBonusPossibleValues", "Possible values for roulette: leveling, 506070, msq, guildhests, expert, trials, mentor, alliance, normal\nPossible values for role: tank, dps, healer, all, none/reset"));
+ this.Framework.Gui.Chat.PrintError(Loc.Localize("DalamudInvalidArguments", "Unrecognized arguments."));
+ this.Framework.Gui.Chat.Print(Loc.Localize("DalamudBonusPossibleValues", "Possible values for roulette: leveling, 506070, msq, guildhests, expert, trials, mentor, alliance, normal\nPossible values for role: tank, dps, healer, all, none/reset"));
}
private void OnDebugDrawDevMenu(string command, string arguments) {
@@ -662,9 +666,13 @@ namespace Dalamud {
if (Localization.ApplicableLangCodes.Contains(arguments.ToLower())) {
this.localizationMgr.SetupWithLangCode(arguments.ToLower());
this.Configuration.LanguageOverride = arguments.ToLower();
+
+ this.Framework.Gui.Chat.Print(string.Format(Loc.Localize("DalamudLanguageSetTo", "Language set to {0}"), arguments));
} else {
this.localizationMgr.SetupWithUiCulture();
this.Configuration.LanguageOverride = null;
+
+ this.Framework.Gui.Chat.Print(string.Format(Loc.Localize("DalamudLanguageSetTo", "Language set to {0}"), "default"));
}
this.Configuration.Save();
diff --git a/Dalamud/Dalamud.csproj b/Dalamud/Dalamud.csproj
index 530721bf5..8207b6386 100644
--- a/Dalamud/Dalamud.csproj
+++ b/Dalamud/Dalamud.csproj
@@ -14,9 +14,9 @@
true
- 4.8.8.0
- 4.8.8.0
- 4.8.8.0
+ 4.8.9.0
+ 4.8.9.0
+ 4.8.9.0
@@ -43,6 +43,7 @@
+
@@ -79,26 +80,5 @@
PreserveNewest
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
diff --git a/Dalamud/Data/DataManager.cs b/Dalamud/Data/DataManager.cs
index edc46ac23..f90f5ea22 100644
--- a/Dalamud/Data/DataManager.cs
+++ b/Dalamud/Data/DataManager.cs
@@ -22,8 +22,6 @@ namespace Dalamud.Data
/// This class provides data for Dalamud-internal features, but can also be used by plugins if needed.
///
public class DataManager {
- private const string DataBaseUrl = "https://goaaats.github.io/ffxiv/tools/launcher/addons/Hooks/Data/";
-
public ReadOnlyDictionary ServerOpCodes { get; private set; }
///
@@ -53,20 +51,14 @@ namespace Dalamud.Data
this.language = language;
}
- public async Task Initialize()
+ public async Task Initialize(string baseDir)
{
try
{
Log.Verbose("Starting data download...");
- using var client = new HttpClient()
- {
- BaseAddress = new Uri(DataBaseUrl)
- };
-
var opCodeDict =
- JsonConvert.DeserializeObject>(
- await client.GetStringAsync(DataBaseUrl + "serveropcode.json"));
+ JsonConvert.DeserializeObject>(File.ReadAllText(Path.Combine(baseDir, "UIRes", "serveropcode.json")));
this.ServerOpCodes = new ReadOnlyDictionary(opCodeDict);
Log.Verbose("Loaded {0} ServerOpCodes.", opCodeDict.Count);
diff --git a/Dalamud/Game/Chat/SeIconChar.cs b/Dalamud/Game/Chat/SeIconChar.cs
new file mode 100644
index 000000000..401238689
--- /dev/null
+++ b/Dalamud/Game/Chat/SeIconChar.cs
@@ -0,0 +1,181 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Dalamud.Game.Chat
+{
+ ///
+ /// Special unicode characters with game-related symbols that work both in-game and in any dalamud window.
+ ///
+ public enum SeIconChar {
+ BotanistSprout = 0xE034,
+ ItemLevel = 0xE033,
+ AutoTranslateOpen = 0xE040,
+ AutoTranslateClose = 0xE041,
+ HighQuality = 0xE03C,
+ Clock = 0xE031,
+ Gil = 0xE049,
+ Hyadelyn = 0xE048,
+
+ MouseNoClick = 0xE050,
+ MouseLeftClick = 0xE051,
+ MouseRightClick = 0xE052,
+ MouseBothClick = 0xE053,
+ MouseWheel = 0xE054,
+ Mouse1 = 0xE055,
+ Mouse2 = 0xE056,
+ Mouse3 = 0xE057,
+ Mouse4 = 0xE058,
+ Mouse5 = 0xE059,
+
+ LevelEn = 0xE06A,
+ LevelDe = 0xE06B,
+ LevelFr = 0xE06C,
+
+ Experience = 0xE0BC,
+ ExperienceFilled = 0xE0BD,
+
+ TimeAm = 0xE06D,
+ TimePm = 0xE06E,
+
+ ArrowRight = 0xE06F,
+ ArrowDown = 0xE035,
+
+ Number0 = 0xE060,
+ Number1 = 0xE061,
+ Number2 = 0xE062,
+ Number3 = 0xE063,
+ Number4 = 0xE064,
+ Number5 = 0xE065,
+ Number6 = 0xE066,
+ Number7 = 0xE067,
+ Number8 = 0xE068,
+ Number9 = 0xE069,
+
+ BoxedNumber0 = 0xE08F,
+ BoxedNumber1 = 0xE090,
+ BoxedNumber2 = 0xE091,
+ BoxedNumber3 = 0xE092,
+ BoxedNumber4 = 0xE093,
+ BoxedNumber5 = 0xE094,
+ BoxedNumber6 = 0xE095,
+ BoxedNumber7 = 0xE096,
+ BoxedNumber8 = 0xE097,
+ BoxedNumber9 = 0xE098,
+ BoxedNumber10 = 0xE099,
+ BoxedNumber11 = 0xE09A,
+ BoxedNumber12 = 0xE09B,
+ BoxedNumber13 = 0xE09C,
+ BoxedNumber14 = 0xE09D,
+ BoxedNumber15 = 0xE09E,
+ BoxedNumber16 = 0xE09F,
+ BoxedNumber17 = 0xE0A0,
+ BoxedNumber18 = 0xE0A1,
+ BoxedNumber19 = 0xE0A2,
+ BoxedNumber20 = 0xE0A3,
+ BoxedNumber21 = 0xE0A4,
+ BoxedNumber22 = 0xE0A5,
+ BoxedNumber23 = 0xE0A6,
+ BoxedNumber24 = 0xE0A7,
+ BoxedNumber25 = 0xE0A8,
+ BoxedNumber26 = 0xE0A9,
+ BoxedNumber27 = 0xE0AA,
+ BoxedNumber28 = 0xE0AB,
+ BoxedNumber29 = 0xE0AC,
+ BoxedNumber30 = 0xE0AD,
+ BoxedNumber31 = 0xE0AE,
+
+ BoxedPlus = 0xE0AF,
+ BoxedQuestionMark = 0xE070,
+ BoxedStar = 0xE0C0,
+
+ BoxedRoman1 = 0xE0C1,
+ BoxedRoman2 = 0xE0C2,
+ BoxedRoman3 = 0xE0C3,
+ BoxedRoman4 = 0xE0C4,
+ BoxedRoman5 = 0xE0C5,
+ BoxedRoman6 = 0xE0C6,
+
+ BoxedLetterA = 0xE071,
+ BoxedLetterB = 0xE072,
+ BoxedLetterC = 0xE073,
+ BoxedLetterD = 0xE074,
+ BoxedLetterE = 0xE075,
+ BoxedLetterF = 0xE076,
+ BoxedLetterG = 0xE077,
+ BoxedLetterH = 0xE078,
+ BoxedLetterI = 0xE079,
+ BoxedLetterJ = 0xE07A,
+ BoxedLetterK = 0xE07B,
+ BoxedLetterL = 0xE07C,
+ BoxedLetterM = 0xE07D,
+ BoxedLetterN = 0xE07E,
+ BoxedLetterO = 0xE07F,
+ BoxedLetterP = 0xE080,
+ BoxedLetterQ = 0xE081,
+ BoxedLetterR = 0xE082,
+ BoxedLetterS = 0xE083,
+ BoxedLetterT = 0xE084,
+ BoxedLetterU = 0xE085,
+ BoxedLetterV = 0xE086,
+ BoxedLetterW = 0xE087,
+ BoxedLetterX = 0xE088,
+ BoxedLetterY = 0xE089,
+ BoxedLetterZ = 0xE08A,
+
+ Circle = 0xE04A,
+ Square = 0xE04B,
+ Cross = 0xE04C,
+ Triangle = 0xE04D,
+ Hexagon = 0xE042,
+ Prohibited = 0xE043,
+
+
+ Dice = 0xE03E,
+ Debuff = 0xE05B,
+ Buff = 0xE05C,
+ CrossWorld = 0xE05D,
+
+ EurekaLevel = 0xE03A,
+
+ LinkMarker = 0xE0BB,
+
+ Glamoured = 0xE03B,
+ GlamouredDyed = 0xE04E,
+
+ QuestSync = 0xE0BE,
+ QuestRepeatable = 0xE0BF,
+
+ ImeHiragana = 0xE020,
+ ImeKatakana = 0xE021,
+ ImeAlphanumeric = 0xE022,
+ ImeKatakanaHalfWidth = 0xE023,
+ ImeAlphanumericHalfWidth = 0xE024,
+
+ Instance1 = 0xE0B1,
+ Instance2 = 0xE0B2,
+ Instance3 = 0xE0B3,
+ Instance4 = 0xE0B4,
+ Instance5 = 0xE0B5,
+ Instance6 = 0xE0B6,
+ Instance7 = 0xE0B7,
+ Instance8 = 0xE0B8,
+ Instance9 = 0xE0B9,
+ InstanceMerged = 0xE0BA,
+
+ LocalTimeEn = 0xE0D0,
+ ServerTimeEn = 0xE0D1,
+ EorzeaTimeEn = 0xE0D2,
+ LocalTimeDe = 0xE0D3,
+ ServerTimeDe = 0xE0D4,
+ EorzeaTimeDe = 0xE0D5,
+ LocalTimeFr = 0xE0D6,
+ ServerTimeFr = 0xE0D7,
+ EorzeaTimeFr = 0xE0D8,
+ LocalTimeJa = 0xE0D9,
+ ServerTimeJa = 0xE0DA,
+ EorzeaTimeJa = 0xE0DB,
+ }
+}
diff --git a/Dalamud/Game/Chat/XivChatType.cs b/Dalamud/Game/Chat/XivChatType.cs
index 4a457cf3f..7e8eb5326 100644
--- a/Dalamud/Game/Chat/XivChatType.cs
+++ b/Dalamud/Game/Chat/XivChatType.cs
@@ -1,11 +1,13 @@
using System;
using System.Linq;
-namespace Dalamud.Game.Chat {
+namespace Dalamud.Game.Chat
+{
///
/// The FFXIV chat types as seen in the LogKind ex table.
///
- public enum XivChatType : ushort {
+ public enum XivChatType : ushort
+ {
None = 0,
Debug = 1,
@@ -81,7 +83,10 @@ namespace Dalamud.Game.Chat {
[XivChatTypeInfo("Echo", "echo", 0xFF808080)]
Echo = 56,
SystemError = 58,
- GatheringSystemMessage = 60,
+
+ SystemMessage = 57,
+ GatheringSystemMessage = 59,
+ ErrorMessage = 60,
// not sure if this is used for anything else
RetainerSale = 71,
@@ -107,14 +112,18 @@ namespace Dalamud.Game.Chat {
CrossLinkShell8 = 107
}
- public static class XivChatTypeExtensions {
- public static XivChatTypeInfoAttribute GetDetails(this XivChatType p) {
+ public static class XivChatTypeExtensions
+ {
+ public static XivChatTypeInfoAttribute GetDetails(this XivChatType p)
+ {
return p.GetAttribute();
}
}
- public class XivChatTypeInfoAttribute : Attribute {
- internal XivChatTypeInfoAttribute(string fancyName, string slug, uint defaultColor) {
+ public class XivChatTypeInfoAttribute : Attribute
+ {
+ internal XivChatTypeInfoAttribute(string fancyName, string slug, uint defaultColor)
+ {
FancyName = fancyName;
Slug = slug;
DefaultColor = defaultColor;
@@ -125,9 +134,11 @@ namespace Dalamud.Game.Chat {
public uint DefaultColor { get; }
}
- public static class EnumExtensions {
+ public static class EnumExtensions
+ {
public static TAttribute GetAttribute(this Enum value)
- where TAttribute : Attribute {
+ where TAttribute : Attribute
+ {
var type = value.GetType();
var name = Enum.GetName(type, value);
return type.GetField(name) // I prefer to get attributes this way
diff --git a/Dalamud/Game/ClientState/Actors/ActorTable.cs b/Dalamud/Game/ClientState/Actors/ActorTable.cs
index 1af976b1c..205f15faa 100644
--- a/Dalamud/Game/ClientState/Actors/ActorTable.cs
+++ b/Dalamud/Game/ClientState/Actors/ActorTable.cs
@@ -1,19 +1,24 @@
using System;
using System.Collections;
+using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Dalamud.Game.ClientState.Actors.Types;
using Dalamud.Game.ClientState.Actors.Types.NonPlayer;
using Dalamud.Hooking;
+using JetBrains.Annotations;
using Serilog;
namespace Dalamud.Game.ClientState.Actors {
///
/// This collection represents the currently spawned FFXIV actors.
///
- public class ActorTable : ICollection, IDisposable {
+ public class ActorTable : IReadOnlyCollection, ICollection {
+
+ private const int ActorTableLength = 424;
#region temporary imports for crash workaround
+
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
IntPtr hProcess,
@@ -21,19 +26,12 @@ namespace Dalamud.Game.ClientState.Actors {
IntPtr lpBuffer,
int dwSize,
out IntPtr lpNumberOfBytesRead);
+
#endregion
private ClientStateAddressResolver Address { get; }
private Dalamud dalamud;
- [UnmanagedFunctionPointer(CallingConvention.ThisCall)]
- private delegate IntPtr SomeActorTableAccessDelegate(IntPtr manager, IntPtr offset);
-
- private Hook someActorTableAccessHook;
-
- private bool isReady = false;
- private IntPtr realActorTablePtr;
-
///
/// Set up the actor table collection.
///
@@ -42,26 +40,7 @@ namespace Dalamud.Game.ClientState.Actors {
Address = addressResolver;
this.dalamud = dalamud;
- this.someActorTableAccessHook = new Hook(Address.SomeActorTableAccess, new SomeActorTableAccessDelegate(SomeActorTableAccessDetour), this);
-
- Log.Verbose("Actor table address {ActorTable}", Address.ViewportActorTable);
- }
-
- public void Enable() {
- this.someActorTableAccessHook.Enable();
- }
-
- public void Dispose() {
- if (!this.isReady)
- this.someActorTableAccessHook.Dispose();
-
- this.isReady = false;
- }
-
- private IntPtr SomeActorTableAccessDetour(IntPtr manager, IntPtr offset) {
- this.realActorTablePtr = offset;
- this.isReady = true;
- return this.someActorTableAccessHook.Original(manager, offset);
+ Log.Verbose("Actor table address {ActorTable}", Address.ActorTable);
}
///
@@ -69,34 +48,25 @@ namespace Dalamud.Game.ClientState.Actors {
///
/// Spawn index.
/// at the specified spawn index.
+ [CanBeNull]
public Actor this[int index] {
get {
- if (!this.isReady)
- return null;
-
- if (this.someActorTableAccessHook != null)
- {
- this.someActorTableAccessHook.Dispose();
- this.someActorTableAccessHook = null;
- }
-
if (index >= Length)
return null;
-
- var tblIndex = this.realActorTablePtr + 8 + index * 8;
+
+ var tblIndex = Address.ActorTable + index * 8;
var offset = Marshal.ReadIntPtr(tblIndex);
- //Log.Verbose("Actor at {0} for {1}", offset.ToInt64().ToString("X"), index);
+ //Log.Debug($"Reading actor {index} at {tblIndex.ToInt64():X} pointing to {offset.ToInt64():X}");
if (offset == IntPtr.Zero)
return null;
// FIXME: hack workaround for trying to access the player on logout, after the main object has been deleted
var sz = Marshal.SizeOf(typeof(Structs.Actor));
- var actorMem = Marshal.AllocHGlobal(sz); // we arguably could just reuse this
- if (!ReadProcessMemory(Process.GetCurrentProcess().Handle, offset, actorMem, sz, out _))
- {
+ var actorMem = Marshal.AllocHGlobal(sz); // we arguably could just reuse this
+ if (!ReadProcessMemory(Process.GetCurrentProcess().Handle, offset, actorMem, sz, out _)) {
Log.Debug("ActorTable - ReadProcessMemory failed: likely player deletion during logout");
return null;
}
@@ -106,9 +76,8 @@ namespace Dalamud.Game.ClientState.Actors {
//Log.Debug("ActorTable[{0}]: {1} - {2} - {3}", index, tblIndex.ToString("X"), offset.ToString("X"),
// actorStruct.ObjectKind.ToString());
-
- switch (actorStruct.ObjectKind)
- {
+
+ switch (actorStruct.ObjectKind) {
case ObjectKind.Player: return new PlayerCharacter(offset, actorStruct, this.dalamud);
case ObjectKind.BattleNpc: return new BattleNpc(offset, actorStruct, this.dalamud);
default: return new Actor(offset, actorStruct, this.dalamud);
@@ -116,7 +85,7 @@ namespace Dalamud.Game.ClientState.Actors {
}
}
- private class ActorTableEnumerator : IEnumerator {
+ private class ActorTableEnumerator : IEnumerator {
private readonly ActorTable table;
private int currentIndex;
@@ -134,17 +103,28 @@ namespace Dalamud.Game.ClientState.Actors {
this.currentIndex = 0;
}
- public object Current => this.table[this.currentIndex];
+ public Actor Current => this.table[this.currentIndex];
+
+ object IEnumerator.Current => Current;
+
+ // Required by IEnumerator even though we have nothing we want to dispose here.
+ public void Dispose() {}
}
- public IEnumerator GetEnumerator() {
+ public IEnumerator GetEnumerator() {
return new ActorTableEnumerator(this);
}
+ IEnumerator IEnumerable.GetEnumerator() {
+ return GetEnumerator();
+ }
+
///
/// The amount of currently spawned actors.
///
- public int Length => !this.isReady ? 0 : Marshal.ReadInt32(this.realActorTablePtr);
+ public int Length => ActorTableLength;
+
+ int IReadOnlyCollection.Count => Length;
int ICollection.Count => Length;
diff --git a/Dalamud/Game/ClientState/Actors/Types/PartyMember.cs b/Dalamud/Game/ClientState/Actors/Types/PartyMember.cs
new file mode 100644
index 000000000..07fef0e75
--- /dev/null
+++ b/Dalamud/Game/ClientState/Actors/Types/PartyMember.cs
@@ -0,0 +1,34 @@
+using Dalamud.Game.ClientState.Structs;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Dalamud.Game.ClientState.Actors.Types
+{
+ public class PartyMember
+ {
+ public string CharacterName;
+ public long Unknown;
+ public Actor Actor;
+ public ObjectKind ObjectKind;
+
+ public PartyMember(ActorTable table, Structs.PartyMember rawData)
+ {
+ CharacterName = Marshal.PtrToStringAnsi(rawData.namePtr);
+ Unknown = rawData.unknown;
+ Actor = null;
+ for (var i = 0; i < table.Length; i++)
+ {
+ if (table[i].ActorId == rawData.actorId)
+ {
+ Actor = table[i];
+ break;
+ }
+ }
+ ObjectKind = rawData.objectKind;
+ }
+ }
+}
diff --git a/Dalamud/Game/ClientState/ClientState.cs b/Dalamud/Game/ClientState/ClientState.cs
index 6215be83b..96b0b40f1 100644
--- a/Dalamud/Game/ClientState/ClientState.cs
+++ b/Dalamud/Game/ClientState/ClientState.cs
@@ -6,6 +6,7 @@ using Dalamud.Game.ClientState.Actors.Types;
using Dalamud.Game.Internal;
using Dalamud.Game.Internal.Network;
using Dalamud.Hooking;
+using JetBrains.Annotations;
using Lumina.Excel.GeneratedSheets;
using Serilog;
@@ -29,6 +30,7 @@ namespace Dalamud.Game.ClientState
///
/// The local player character, if one is present.
///
+ [CanBeNull]
public PlayerCharacter LocalPlayer {
get {
var actor = this.Actors[0];
@@ -80,6 +82,11 @@ namespace Dalamud.Game.ClientState
///
public JobGauges JobGauges;
+ ///
+ /// The class facilitating party list data access
+ ///
+ public PartyList PartyList;
+
///
/// Provides access to the keypress state of keyboard keys in game.
///
@@ -101,6 +108,8 @@ namespace Dalamud.Game.ClientState
this.Actors = new ActorTable(dalamud, Address);
+ this.PartyList = new PartyList(dalamud, Address);
+
this.JobGauges = new JobGauges(Address);
this.KeyState = new KeyState(Address, scanner.Module.BaseAddress);
@@ -115,12 +124,12 @@ namespace Dalamud.Game.ClientState
}
public void Enable() {
- this.Actors.Enable();
+ this.PartyList.Enable();
this.setupTerritoryTypeHook.Enable();
}
public void Dispose() {
- this.Actors.Dispose();
+ this.PartyList.Dispose();
this.setupTerritoryTypeHook.Dispose();
}
diff --git a/Dalamud/Game/ClientState/ClientStateAddressResolver.cs b/Dalamud/Game/ClientState/ClientStateAddressResolver.cs
index 27717981a..dd559b623 100644
--- a/Dalamud/Game/ClientState/ClientStateAddressResolver.cs
+++ b/Dalamud/Game/ClientState/ClientStateAddressResolver.cs
@@ -5,18 +5,22 @@ namespace Dalamud.Game.ClientState
{
public sealed class ClientStateAddressResolver : BaseAddressResolver {
// Static offsets
- public IntPtr ViewportActorTable { get; private set; }
+ public IntPtr ActorTable { get; private set; }
+ //public IntPtr ViewportActorTable { get; private set; }
public IntPtr LocalContentId { get; private set; }
public IntPtr JobGaugeData { get; private set; }
public IntPtr KeyboardState { get; private set; }
// Functions
public IntPtr SetupTerritoryType { get; private set; }
- public IntPtr SomeActorTableAccess { get; private set; }
-
+ //public IntPtr SomeActorTableAccess { get; private set; }
+ public IntPtr PartyListUpdate { get; private set; }
+
protected override void Setup64Bit(SigScanner sig) {
- ViewportActorTable = sig.GetStaticAddressFromSig("48 8D 0D ?? ?? ?? ?? 85 ED", 0) + 0x148;
- SomeActorTableAccess = sig.ScanText("E8 ?? ?? ?? ?? 48 8D 55 A0 48 8D 8E ?? ?? ?? ??");
+ // We don't need those anymore, but maybe someone else will - let's leave them here for good measure
+ //ViewportActorTable = sig.GetStaticAddressFromSig("48 8D 0D ?? ?? ?? ?? 85 ED", 0) + 0x148;
+ //SomeActorTableAccess = sig.ScanText("E8 ?? ?? ?? ?? 48 8D 55 A0 48 8D 8E ?? ?? ?? ??");
+ ActorTable = sig.GetStaticAddressFromSig("88 91 ?? ?? ?? ?? 48 8D 3D ?? ?? ?? ??", 0x0);
LocalContentId = sig.GetStaticAddressFromSig("48 8B 05 ?? ?? ?? ?? 48 89 86 ?? ?? ?? ??", 0);
JobGaugeData = sig.GetStaticAddressFromSig("E8 ?? ?? ?? ?? FF C6 48 8D 5B 0C", 0xB9) + 0x10;
@@ -25,6 +29,8 @@ namespace Dalamud.Game.ClientState
// This resolves to a fixed offset only, without the base address added in, so GetStaticAddressFromSig() can't be used
KeyboardState = sig.ScanText("48 8D 0C 85 ?? ?? ?? ?? 8B 04 31 85 C2 0F 85") + 0x4;
+
+ PartyListUpdate = sig.ScanText("E8 ?? ?? ?? ?? 49 8B D4 4C 8D 87 ?? ?? ?? ??");
}
}
}
diff --git a/Dalamud/Game/ClientState/PartyList.cs b/Dalamud/Game/ClientState/PartyList.cs
new file mode 100644
index 000000000..536af33e6
--- /dev/null
+++ b/Dalamud/Game/ClientState/PartyList.cs
@@ -0,0 +1,119 @@
+using Dalamud.Game.ClientState.Actors.Types;
+using Dalamud.Hooking;
+using Dalamud.Plugin;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Dalamud.Game.ClientState
+{
+ public class PartyList : IReadOnlyCollection, ICollection, IDisposable
+ {
+ private ClientStateAddressResolver Address { get; }
+ private Dalamud dalamud;
+
+ private delegate long PartyListUpdateDelegate(IntPtr structBegin, long param2, char param3);
+
+ private Hook partyListUpdateHook;
+ private IntPtr partyListBegin;
+ private bool isReady = false;
+
+ public PartyList(Dalamud dalamud, ClientStateAddressResolver addressResolver)
+ {
+ Address = addressResolver;
+ this.dalamud = dalamud;
+ this.partyListUpdateHook = new Hook(Address.PartyListUpdate, new PartyListUpdateDelegate(PartyListUpdateDetour), this);
+ }
+
+ public void Enable()
+ {
+ this.partyListUpdateHook.Enable();
+ }
+
+ public void Dispose()
+ {
+ if (!this.isReady)
+ this.partyListUpdateHook.Dispose();
+ this.isReady = false;
+ }
+
+ private long PartyListUpdateDetour(IntPtr structBegin, long param2, char param3)
+ {
+ var result = this.partyListUpdateHook.Original(structBegin, param2, param3);
+ this.partyListBegin = structBegin + 0xB48;
+ this.partyListUpdateHook.Dispose();
+ this.isReady = true;
+ return result;
+ }
+
+ public PartyMember this[int index]
+ {
+ get
+ {
+ if (!this.isReady)
+ return null;
+ if (index >= Length)
+ return null;
+ var tblIndex = partyListBegin + index * 24;
+ var memberStruct = Marshal.PtrToStructure(tblIndex);
+ return new PartyMember(this.dalamud.ClientState.Actors, memberStruct);
+ }
+ }
+
+ public void CopyTo(Array array, int index)
+ {
+ for (var i = 0; i < Length; i++)
+ {
+ array.SetValue(this[i], index);
+ index++;
+ }
+ }
+
+ private class PartyListEnumerator : IEnumerator
+ {
+ private readonly PartyList party;
+ private int currentIndex;
+
+ public PartyListEnumerator(PartyList list)
+ {
+ this.party = list;
+ }
+
+ public bool MoveNext()
+ {
+ this.currentIndex++;
+ return this.currentIndex != this.party.Length;
+ }
+
+ public void Reset()
+ {
+ this.currentIndex = 0;
+ }
+
+ public PartyMember Current => this.party[this.currentIndex];
+
+ object IEnumerator.Current => Current;
+
+ // Required by IEnumerator even though we have nothing we want to dispose here.
+ public void Dispose() {}
+ }
+
+ public IEnumerator GetEnumerator() => new PartyListEnumerator(this);
+
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
+
+ public int Length => !this.isReady ? 0 : Marshal.ReadByte(partyListBegin + 0xF0);
+
+ int IReadOnlyCollection.Count => Length;
+
+ public int Count => Length;
+
+ public object SyncRoot => this;
+
+ public bool IsSynchronized => false;
+ }
+}
diff --git a/Dalamud/Game/ClientState/Structs/Actor.cs b/Dalamud/Game/ClientState/Structs/Actor.cs
index c24eef277..68090891b 100644
--- a/Dalamud/Game/ClientState/Structs/Actor.cs
+++ b/Dalamud/Game/ClientState/Structs/Actor.cs
@@ -20,11 +20,13 @@ namespace Dalamud.Game.ClientState.Structs
[FieldOffset(140)] public ObjectKind ObjectKind;
[FieldOffset(141)] public byte SubKind;
[FieldOffset(142)] public bool IsFriendly;
+ [FieldOffset(144)] public byte YalmDistanceFromPlayer1; // Demo says one of these is x distance
+ [FieldOffset(145)] public byte PlayerTargetStatus; // This is some kind of enum
+ [FieldOffset(146)] public byte YalmDistanceFromPlayer2; // and the other is z distance
[FieldOffset(160)] public Position3 Position;
-
+ [FieldOffset(0x17F8)] public int TargetActorId;
// This field can't be correctly aligned, so we have to cut it manually.
[FieldOffset(0x17d0)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public byte[] CompanyTag;
-
[FieldOffset(0x1868)] public int NameId;
[FieldOffset(0x1884)] public byte CurrentWorld;
[FieldOffset(0x1886)] public byte HomeWorld;
@@ -34,5 +36,6 @@ namespace Dalamud.Game.ClientState.Structs
[FieldOffset(6340)] public int MaxMp;
[FieldOffset(6358)] public byte ClassJob;
[FieldOffset(6360)] public byte Level;
+
}
}
diff --git a/Dalamud/Game/ClientState/Structs/JobGauge/BRDGauge.cs b/Dalamud/Game/ClientState/Structs/JobGauge/BRDGauge.cs
index 11eb1f5ad..b181d57a0 100644
--- a/Dalamud/Game/ClientState/Structs/JobGauge/BRDGauge.cs
+++ b/Dalamud/Game/ClientState/Structs/JobGauge/BRDGauge.cs
@@ -11,6 +11,7 @@ namespace Dalamud.Game.ClientState.Structs.JobGauge {
public struct BRDGauge {
[FieldOffset(0)] public short SongTimer;
[FieldOffset(2)] public byte NumSongStacks;
+ [FieldOffset(3)] public byte SoulVoiceValue;
[FieldOffset(4)] public CurrentSong ActiveSong;
}
}
diff --git a/Dalamud/Game/ClientState/Structs/PartyMember.cs b/Dalamud/Game/ClientState/Structs/PartyMember.cs
new file mode 100644
index 000000000..71dbf0d91
--- /dev/null
+++ b/Dalamud/Game/ClientState/Structs/PartyMember.cs
@@ -0,0 +1,19 @@
+using Dalamud.Game.ClientState.Actors;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Dalamud.Game.ClientState.Structs
+{
+ [StructLayout(LayoutKind.Explicit)]
+ public struct PartyMember
+ {
+ [FieldOffset(0x0)] public IntPtr namePtr;
+ [FieldOffset(0x8)] public long unknown;
+ [FieldOffset(0x10)] public int actorId;
+ [FieldOffset(0x14)] public ObjectKind objectKind;
+ }
+}
diff --git a/Dalamud/Game/Command/CommandManager.cs b/Dalamud/Game/Command/CommandManager.cs
index aad85dfec..98ca22642 100644
--- a/Dalamud/Game/Command/CommandManager.cs
+++ b/Dalamud/Game/Command/CommandManager.cs
@@ -59,7 +59,7 @@ namespace Dalamud.Game.Command {
private void OnChatMessage(XivChatType type, uint senderId, ref StdString sender,
ref StdString message, ref bool isHandled) {
- if (type == XivChatType.GatheringSystemMessage && senderId == 0) {
+ if (type == XivChatType.ErrorMessage && senderId == 0) {
var cmdMatch = this.currentLangCommandRegex.Match(message.Value).Groups["command"];
if (cmdMatch.Success) {
// Yes, it's a chat command.
@@ -69,7 +69,12 @@ namespace Dalamud.Game.Command {
}
}
- private bool ProcessCommand(string content) {
+ ///
+ /// Process a command in full.
+ ///
+ /// The full command string.
+ /// True if the command was found and dispatched.
+ public bool ProcessCommand(string content) {
string command;
string argument;
diff --git a/Dalamud/Game/Internal/Gui/ChatGui.cs b/Dalamud/Game/Internal/Gui/ChatGui.cs
index a52c3b345..d4b6c7fca 100644
--- a/Dalamud/Game/Internal/Gui/ChatGui.cs
+++ b/Dalamud/Game/Internal/Gui/ChatGui.cs
@@ -97,6 +97,8 @@ namespace Dalamud.Game.Internal.Gui {
var parsedSender = SeString.Parse(sender.RawData);
var parsedMessage = SeString.Parse(message.RawData);
+ Log.Verbose("[CHATGUI][{0}][{1}]", parsedSender.TextValue, parsedMessage.TextValue);
+
//Log.Debug($"HandlePrintMessageDetour {manager} - [{chattype}] [{BitConverter.ToString(message.RawData).Replace("-", " ")}] {message.Value} from {senderName.Value}");
var originalMessageData = (byte[]) message.RawData.Clone();
@@ -173,12 +175,14 @@ namespace Dalamud.Game.Internal.Gui {
}
public void Print(string message) {
+ Log.Verbose("[CHATGUI PRINT]{0}", message);
PrintChat(new XivChatEntry {
MessageBytes = Encoding.UTF8.GetBytes(message)
});
}
public void PrintError(string message) {
+ Log.Verbose("[CHATGUI PRINT ERROR]{0}", message);
PrintChat(new XivChatEntry {
MessageBytes = Encoding.UTF8.GetBytes(message),
Type = XivChatType.Urgent
diff --git a/Dalamud/Interface/AssetManager.cs b/Dalamud/Interface/AssetManager.cs
new file mode 100644
index 000000000..a6e19bec8
--- /dev/null
+++ b/Dalamud/Interface/AssetManager.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+using Serilog;
+
+namespace Dalamud.Interface
+{
+ class AssetManager {
+ private const string AssetStoreUrl = "https://goatcorp.github.io/DalamudAssets/";
+
+ private static readonly Dictionary AssetDictionary = new Dictionary {
+ {AssetStoreUrl + "UIRes/serveropcode.json", "UIRes/serveropcode.json" },
+ {AssetStoreUrl + "UIRes/NotoSansCJKjp-Medium.otf", "UIRes/NotoSansCJKjp-Medium.otf" },
+ {AssetStoreUrl + "UIRes/logo.png", "UIRes/logo.png" },
+ {AssetStoreUrl + "UIRes/loc/dalamud/dalamud_de.json", "UIRes/loc/dalamud/dalamud_de.json" },
+ {AssetStoreUrl + "UIRes/loc/dalamud/dalamud_es.json", "UIRes/loc/dalamud/dalamud_es.json" },
+ {AssetStoreUrl + "UIRes/loc/dalamud/dalamud_fr.json", "UIRes/loc/dalamud/dalamud_fr.json" },
+ {AssetStoreUrl + "UIRes/loc/dalamud/dalamud_it.json", "UIRes/loc/dalamud/dalamud_it.json" },
+ {AssetStoreUrl + "UIRes/loc/dalamud/dalamud_ja.json", "UIRes/loc/dalamud/dalamud_ja.json" },
+ {"https://img.finalfantasyxiv.com/lds/pc/global/fonts/FFXIV_Lodestone_SSF.ttf", "UIRes/gamesym.ttf" }
+ };
+
+ public static async Task EnsureAssets(string baseDir) {
+ using var client = new HttpClient();
+
+ var assetVerRemote = await client.GetStringAsync(AssetStoreUrl + "version");
+
+ var assetVerPath = Path.Combine(baseDir, "assetver");
+ var assetVerLocal = "0";
+ if (File.Exists(assetVerPath))
+ assetVerLocal = File.ReadAllText(assetVerPath);
+
+ var forceRedownload = assetVerLocal != assetVerRemote;
+ if (forceRedownload)
+ Log.Information("Assets need redownload");
+
+ Log.Verbose("Starting asset download");
+
+ foreach (var entry in AssetDictionary) {
+ var filePath = Path.Combine(baseDir, entry.Value);
+
+ Directory.CreateDirectory(Path.GetDirectoryName(filePath));
+
+ if (!File.Exists(filePath) || forceRedownload) {
+ Log.Verbose("Downloading {0} to {1}...", entry.Key, entry.Value);
+ try {
+ File.WriteAllBytes(filePath, await client.GetByteArrayAsync(entry.Key));
+ } catch (Exception ex) {
+ // If another game is running, we don't want to just fail in here
+ Log.Error(ex, "Could not download asset.");
+ }
+
+ }
+ }
+
+ try {
+ File.WriteAllText(assetVerPath, assetVerRemote);
+ } catch (Exception ex) {
+ Log.Error(ex, "Could not write asset version.");
+ }
+ }
+
+ }
+}
diff --git a/Dalamud/Interface/DalamudDataWindow.cs b/Dalamud/Interface/DalamudDataWindow.cs
index 12deccc3d..5232ba3e8 100644
--- a/Dalamud/Interface/DalamudDataWindow.cs
+++ b/Dalamud/Interface/DalamudDataWindow.cs
@@ -1,4 +1,6 @@
+using System.Linq;
using System.Numerics;
+using Dalamud.Game.Chat;
using Dalamud.Game.ClientState.Actors.Types;
using Dalamud.Game.ClientState.Actors.Types.NonPlayer;
using ImGuiNET;
@@ -45,8 +47,8 @@ namespace Dalamud.Interface
ImGui.SameLine();
var copy = ImGui.Button("Copy all");
ImGui.SameLine();
- ImGui.Combo("Data kind", ref this.currentKind, new[] {"ServerOpCode", "ContentFinderCondition", "State"},
- 3);
+ ImGui.Combo("Data kind", ref this.currentKind, new[] {"ServerOpCode", "ContentFinderCondition", "Actor Table", "Font Test", "Party List"},
+ 5);
ImGui.BeginChild("scrolling", new Vector2(0, 0), false, ImGuiWindowFlags.HorizontalScrollbar);
@@ -67,12 +69,11 @@ namespace Dalamud.Interface
var stateString = string.Empty;
// LocalPlayer is null in a number of situations (at least with the current visible-actors list)
// which would crash here.
- if (this.dalamud.ClientState.Actors.Length == 0 || this.dalamud.ClientState.LocalPlayer == null)
- {
+ if (this.dalamud.ClientState.Actors.Length == 0) {
ImGui.TextUnformatted("Data not ready.");
- }
- else
- {
+ } else if (this.dalamud.ClientState.LocalPlayer == null) {
+ ImGui.TextUnformatted("LocalPlayer null.");
+ } else {
stateString += $"FrameworkBase: {this.dalamud.Framework.Address.BaseAddress.ToInt64():X}\n";
stateString += $"ActorTableLen: {this.dalamud.ClientState.Actors.Length}\n";
@@ -86,6 +87,9 @@ namespace Dalamud.Interface
for (var i = 0; i < this.dalamud.ClientState.Actors.Length; i++) {
var actor = this.dalamud.ClientState.Actors[i];
+ if (actor == null)
+ continue;
+
stateString +=
$"{actor.Address.ToInt64():X}:{actor.ActorId:X}[{i}] - {actor.ObjectKind} - {actor.Name} - {actor.Position.X} {actor.Position.Y} {actor.Position.Z}\n";
@@ -104,6 +108,38 @@ namespace Dalamud.Interface
ImGui.TextUnformatted(stateString);
}
+ break;
+ case 3:
+ var specialChars = string.Empty;
+ for (var i = 0xE020; i <= 0xE0DB; i++) {
+ specialChars += $"0x{i:X} - {(SeIconChar) i} - {(char) i}\n";
+ }
+
+ ImGui.TextUnformatted(specialChars);
+ break;
+ case 4:
+ var partyString = string.Empty;
+
+ if (this.dalamud.ClientState.PartyList.Length == 0) {
+ ImGui.TextUnformatted("Data not ready.");
+ } else {
+
+ partyString += $"{this.dalamud.ClientState.PartyList.Count} Members\n";
+ for (var i = 0; i < this.dalamud.ClientState.PartyList.Count; i++) {
+ var member = this.dalamud.ClientState.PartyList[i];
+ if (member == null) {
+ partyString +=
+ $"[{i}] was null\n";
+ continue;
+ }
+
+ partyString +=
+ $"[{i}] {member.CharacterName} - {member.ObjectKind} - {member.Actor.ActorId}\n";
+ }
+
+ ImGui.TextUnformatted(partyString);
+ }
+
break;
}
else
diff --git a/Dalamud/Interface/DalamudLogWindow.cs b/Dalamud/Interface/DalamudLogWindow.cs
index 5d49c961a..afd3a349c 100644
--- a/Dalamud/Interface/DalamudLogWindow.cs
+++ b/Dalamud/Interface/DalamudLogWindow.cs
@@ -4,15 +4,21 @@ using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
+using Dalamud.Game.Command;
using ImGuiNET;
+using Serilog;
namespace Dalamud.Interface
{
class DalamudLogWindow : IDisposable {
+ private readonly CommandManager commandManager;
private bool autoScroll = true;
private string logText = string.Empty;
- public DalamudLogWindow() {
+ private string commandText = string.Empty;
+
+ public DalamudLogWindow(CommandManager commandManager) {
+ this.commandManager = commandManager;
SerilogEventSink.Instance.OnLogLine += Serilog_OnLogLine;
}
@@ -59,6 +65,18 @@ namespace Dalamud.Interface
ImGui.SameLine();
var copy = ImGui.Button("Copy");
+ ImGui.Text("Enter command: ");
+ ImGui.SameLine();
+ ImGui.InputText("##commandbox", ref this.commandText, 255);
+ ImGui.SameLine();
+ if (ImGui.Button("Send")) {
+ if (this.commandManager.ProcessCommand(this.commandText)) {
+ Log.Information("Command was dispatched.");
+ } else {
+ Log.Information("Command {0} not registered.", this.commandText);
+ }
+ }
+
ImGui.BeginChild("scrolling", new Vector2(0, 0), false, ImGuiWindowFlags.HorizontalScrollbar);
if (clear)
diff --git a/Dalamud/Interface/InterfaceManager.cs b/Dalamud/Interface/InterfaceManager.cs
index 3b86eb76b..3d66d24d8 100644
--- a/Dalamud/Interface/InterfaceManager.cs
+++ b/Dalamud/Interface/InterfaceManager.cs
@@ -200,7 +200,7 @@ namespace Dalamud.Interface
return null;
}
- private IntPtr PresentDetour(IntPtr swapChain, uint syncInterval, uint presentFlags)
+ private unsafe IntPtr PresentDetour(IntPtr swapChain, uint syncInterval, uint presentFlags)
{
if (this.scene == null)
{
@@ -209,11 +209,31 @@ namespace Dalamud.Interface
this.scene.OnBuildUI += Display;
this.scene.OnNewInputFrame += OnNewInputFrame;
+ ImFontConfigPtr fontConfig = ImGuiNative.ImFontConfig_ImFontConfig();
+ fontConfig.MergeMode = true;
+ fontConfig.PixelSnapH = true;
+
var fontPathJp = Path.Combine(this.dalamud.StartInfo.WorkingDirectory, "UIRes", "NotoSansCJKjp-Medium.otf");
ImGui.GetIO().Fonts.AddFontFromFileTTF(fontPathJp, 17.0f, null, ImGui.GetIO().Fonts.GetGlyphRangesJapanese());
+ var fontPathGame = Path.Combine(this.dalamud.StartInfo.WorkingDirectory, "UIRes", "gamesym.ttf");
+ Log.Verbose(fontPathGame);
+
+ var rangeHandle = GCHandle.Alloc(new ushort[]
+ {
+ 0xE020,
+ 0xE0DB,
+ 0
+ }, GCHandleType.Pinned);
+
+
+ ImGui.GetIO().Fonts.AddFontFromFileTTF(fontPathGame, 17.0f, fontConfig, rangeHandle.AddrOfPinnedObject());
+
ImGui.GetIO().Fonts.Build();
+ fontConfig.Destroy();
+ rangeHandle.Free();
+
ImGui.GetStyle().GrabRounding = 3f;
ImGui.GetStyle().FrameRounding = 4f;
ImGui.GetStyle().WindowRounding = 4f;
diff --git a/Dalamud/Interface/ItemSearchWindow.cs b/Dalamud/Interface/ItemSearchWindow.cs
index 1261b0e97..ba7512088 100644
--- a/Dalamud/Interface/ItemSearchWindow.cs
+++ b/Dalamud/Interface/ItemSearchWindow.cs
@@ -81,7 +81,7 @@ namespace Dalamud.Interface
ImGui.Separator();
- ImGui.Text("Search: ");
+ ImGui.Text(Loc.Localize("DalamudItemSearchVerb", "Search: "));
ImGui.SameLine();
ImGui.InputText("##searchbox", ref this.searchText, 32);
@@ -138,15 +138,34 @@ namespace Dalamud.Interface
{
for (var i = 0; i < this.searchTask.Result.Count; i++)
{
- if (ImGui.Selectable(this.searchTask.Result[i].Name, this.selectedItemIndex == i))
+ if (ImGui.Selectable(this.searchTask.Result[i].Name, this.selectedItemIndex == i, ImGuiSelectableFlags.AllowDoubleClick))
{
this.selectedItemIndex = i;
- var iconTex = this.data.GetIcon(this.searchTask.Result[i].Icon);
- this.selectedItemTex?.Dispose();
- this.selectedItemTex =
- this.builder.LoadImageRaw(iconTex.GetRgbaImageData(), iconTex.Header.Width,
- iconTex.Header.Height, 4);
+ try
+ {
+ var iconTex = this.data.GetIcon(this.searchTask.Result[i].Icon);
+ this.selectedItemTex?.Dispose();
+
+ this.selectedItemTex =
+ this.builder.LoadImageRaw(iconTex.GetRgbaImageData(), iconTex.Header.Width,
+ iconTex.Header.Height, 4);
+ } catch (Exception ex)
+ {
+ Log.Error(ex, "Failed loading item texture");
+ this.selectedItemTex?.Dispose();
+ this.selectedItemTex = null;
+ }
+
+ if (ImGui.IsMouseDoubleClicked(0))
+ {
+ OnItemChosen?.Invoke(this, this.searchTask.Result[i]);
+ if (this.closeOnChoose)
+ {
+ this.selectedItemTex?.Dispose();
+ isOpen = false;
+ }
+ }
}
}
}
diff --git a/Dalamud/Plugin/PluginRepository.cs b/Dalamud/Plugin/PluginRepository.cs
index af8ff3326..97a80d567 100644
--- a/Dalamud/Plugin/PluginRepository.cs
+++ b/Dalamud/Plugin/PluginRepository.cs
@@ -14,7 +14,7 @@ namespace Dalamud.Plugin
{
public class PluginRepository
{
- private const string PluginRepoBaseUrl = "https://goaaats.github.io/DalamudPlugins/";
+ private const string PluginRepoBaseUrl = "https://goatcorp.github.io/DalamudPlugins/";
private PluginManager manager;
private string pluginDirectory;
diff --git a/Dalamud/UIRes/77240429-37533100-6bab-11ea-9ad6-69c99e0bc4f9.png b/Dalamud/UIRes/77240429-37533100-6bab-11ea-9ad6-69c99e0bc4f9.png
deleted file mode 100644
index 143b1f8b1..000000000
Binary files a/Dalamud/UIRes/77240429-37533100-6bab-11ea-9ad6-69c99e0bc4f9.png and /dev/null differ
diff --git a/Dalamud/UIRes/NotoSansCJKjp-Medium.otf b/Dalamud/UIRes/NotoSansCJKjp-Medium.otf
deleted file mode 100644
index ba41937ae..000000000
Binary files a/Dalamud/UIRes/NotoSansCJKjp-Medium.otf and /dev/null differ
diff --git a/Dalamud/UIRes/loc/dalamud/dalamud_de.json b/Dalamud/UIRes/loc/dalamud/dalamud_de.json
deleted file mode 100644
index d64d4594b..000000000
--- a/Dalamud/UIRes/loc/dalamud/dalamud_de.json
+++ /dev/null
@@ -1,194 +0,0 @@
-{
- "DalamudUnloadHelp": {
- "message": "Entläd das XIVLauncher In-Game-Addon.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPluginReloadHelp": {
- "message": "Läd alle Plugins neu.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPrintChatHelp": {
- "message": "Gibt eine Nachricht im Chat aus.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdInfoHelp": {
- "message": "Zeigt eine Liste aller verfügbaren Textkommandos an.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteHelp": {
- "message": "Gib ein Wort oder einen Satz ein, der nicht im Chat auftauchen soll. Nutzung: /xlmute ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteListHelp": {
- "message": "Listet stummgeschaltete Worte oder Sätze auf.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudUnmuteHelp": {
- "message": "Löscht ein Wort oder einen Satz von der Liste der stummgeschalteten Worte. Nutzung: /xlunmute ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudLastLinkHelp": {
- "message": "Öffnet den zuletzt im Chat geposteten Link in deinem Browser.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBotJoinHelp": {
- "message": "Füge den XIVLauncher Discord-Bot zu einem deiner Server hinzu.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBgmSetHelp": {
- "message": "Setzt die Hintergrundmusik im Spiel. Nutzung: /xlbgmset ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudItemLinkHelp": {
- "message": "Verlinkt den angegebenen Gegenstand. Nutzung: /xlitem . Um den exakten Namen anzugeben, nutze /xlitem +",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBonusHelp": {
- "message": "Sende eine Benachrichtigung, wenn ein Zufallsinhalt einen Bonus für die Rolle hast, die du angibst. Nutzung: /xlbonus ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudDevMenuHelp": {
- "message": "Öffne das dev-Menü DEBUG",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudInstallerHelp": {
- "message": "Öffnet den Plugin-Installer",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCreditsHelp": {
- "message": "Öffnet die Liste der Mitwirkenden",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdHelpAvailable": {
- "message": "Verfügbare Kommandos:",
- "description": "Dalamud.OnHelpCommand"
- },
- "DalamudMuted": {
- "message": "\"{0}\" stummgeschaltet.",
- "description": "Dalamud.OnBadWordsAddCommand"
- },
- "DalamudNoneMuted": {
- "message": "Keine stummgeschalteten Wörte oder Sätze.",
- "description": "Dalamud.OnBadWordsListCommand"
- },
- "DalamudUnmuted": {
- "message": "\"{0}\" freigegeben.",
- "description": "Dalamud.OnBadWordsRemoveCommand"
- },
- "DalamudNoLastLink": {
- "message": "Keinen Link gefunden...",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudOpeningLink": {
- "message": "{0} wird geöffnet",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudBotNotSetup": {
- "message": "Der XIVLauncher Discord-Bot wurde nicht korrekt eingestellt. Bitte prüfe die Einstellungen und unser FAQ.",
- "description": "Dalamud.OnBotJoinCommand"
- },
- "DalamudChannelNotSetup": {
- "message": "Du hast keinen Discord-Kanal für diese Notifikationen eingestellt - du wirst sie also nur im Chat erhalten.\nUm einen Kanal einzustellen, nutze bitte die XIVLauncher-Einstellungen.",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusSet": {
- "message": "Bonus-Notifikationen für {0}({1}) auf {2} gesetzt",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudInvalidArguments": {
- "message": "Parameter nicht erkannt.",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusPossibleValues": {
- "message": "Mögliche Werte für Zufallsinhalte: leveling, 506070, msq, guildhests, expert, trials, mentor, alliance, normal\nMögliche Werte für Rollen: tank, dps, healer, all, none/reset",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudItemNotFound": {
- "message": "Gegenstand konnte nicht gefunden werden.",
- "description": "<b__0>d.MoveNext"
- },
- "InstallerHeader": {
- "message": "Plugin-Installer",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerHint": {
- "message": "Dieses Fenster erlaubt es dir, Plugins zu installieren.\nSie werden von Drittanbietern entwickelt.",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerLoading": {
- "message": "Plugins werden geladen...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDownloadFailed": {
- "message": "Download fehlgeschlagen.",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInstalled": {
- "message": " (installiert)",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInProgress": {
- "message": "Wird installiert...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDisable": {
- "message": "Deaktivieren",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerOpenConfig": {
- "message": "Einstellungen öffnen",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdating": {
- "message": "Wird aktualisiert...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdateComplete": {
- "message": "{0} Plugins aktualisiert!",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerNoUpdates": {
- "message": "Keine Aktualisierungen gefunden!",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdatePlugins": {
- "message": "Plugins aktualisieren",
- "description": "PluginInstallerWindow.Draw"
- },
- "Close": {
- "message": "Schließen",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerError": {
- "message": "Installation fehlgeschlagen",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerErrorHint": {
- "message": "Der Plugin-Installer konnte die Operation nicht erfolgreich beenden.\nBitte starte das Spiel neu und melde diesen Fehler auf unserem Discord-Server.",
- "description": "PluginInstallerWindow.Draw"
- },
- "OK": {
- "message": "OK",
- "description": "PluginInstallerWindow.Draw"
- },
- "DalamudWelcome": {
- "message": "XIVLauncher In-Game-Addon v{0} geladen.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginLoaded": {
- "message": " 》 {0} v{1} geladen.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudUpdated": {
- "message": "Das In-Game-Addon wurde aktualisiert oder neu installiert. Bitte prüfe unseren Discord-Server für weitere Informationen!",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateRequired": {
- "message": "Eines oder mehrere deiner Plugins müssen aktualisiert werden. Bitte nutze das /xlplugins-Kommando, um sie zu aktualisieren.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateCheckFail": {
- "message": "Konnte nicht auf Plugin-Aktualisierungen prüfen.",
- "description": "ChatHandlers.OnChatMessage"
- }
-}
\ No newline at end of file
diff --git a/Dalamud/UIRes/loc/dalamud/dalamud_es.json b/Dalamud/UIRes/loc/dalamud/dalamud_es.json
deleted file mode 100644
index e8aceb20b..000000000
--- a/Dalamud/UIRes/loc/dalamud/dalamud_es.json
+++ /dev/null
@@ -1,194 +0,0 @@
-{
- "DalamudUnloadHelp": {
- "message": "Decarga el extra In-Game de XIVLauncher.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPluginReloadHelp": {
- "message": "Recarga todos de los plugins.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPrintChatHelp": {
- "message": "Publica al chat.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdInfoHelp": {
- "message": "Muestre la lista de los comandos disponibles.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteHelp": {
- "message": "Bloquea una palabra u oración que aperecer en el chat. Uso: /xlmute ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteListHelp": {
- "message": "Enumera las palabras u oraciónes qué están bloqueadas.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudUnmuteHelp": {
- "message": "Desbloquea una palabra u oración. Uso: /xlunmute ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudLastLinkHelp": {
- "message": "Abre el enlace anterior en su navegador por defecto.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBotJoinHelp": {
- "message": "Agrega el bot Discord de XIVLauncher que ha configurado a su servidor.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBgmSetHelp": {
- "message": "Configura la música ambiental del juego. Uso: /xlbgmset ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudItemLinkHelp": {
- "message": "Enlaza un artículo por nombre. Uso: /xlitem . Para emperejando un artículo exactamente, utiliza /xlitem +",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBonusHelp": {
- "message": "Notifícase cuando una ruleta tenga un extra que usted especifica. Ejecútalo sin parametres para más información. Uso: /xlbonus ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudDevMenuHelp": {
- "message": "Dibuja el menú dev DEBUG",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudInstallerHelp": {
- "message": "Abre el instalador de plugins",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCreditsHelp": {
- "message": "Abra los méritos de Dalamud.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdHelpAvailable": {
- "message": "Comandos disponibles:",
- "description": "Dalamud.OnHelpCommand"
- },
- "DalamudMuted": {
- "message": "Ha bloqueado \"{0}\".",
- "description": "Dalamud.OnBadWordsAddCommand"
- },
- "DalamudNoneMuted": {
- "message": "No hay palabras u oraciónes qué están bloqueadas.",
- "description": "Dalamud.OnBadWordsListCommand"
- },
- "DalamudUnmuted": {
- "message": "Ha desbloqueado \"{0}\".",
- "description": "Dalamud.OnBadWordsRemoveCommand"
- },
- "DalamudNoLastLink": {
- "message": "No hay un enlace anterior...",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudOpeningLink": {
- "message": "Está abriendo {0}",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudBotNotSetup": {
- "message": "El bot Discord de XIVLauncher no configuría corecto o no pudo conectar a Discord. Por favor revisa los ajustes y el FAQ.",
- "description": "Dalamud.OnBotJoinCommand"
- },
- "DalamudChannelNotSetup": {
- "message": "No configuría un canal Discord para estos notificaciónes - solo recibirá en el chat. Para que lo configura, por favor utiliza los ajustes de XIVLauncher en el juego.",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusSet": {
- "message": "Configura notificaciónes bonus para {0}({1}) a {2}",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudInvalidArguments": {
- "message": "Hay argumentes que no reconocido.",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusPossibleValues": {
- "message": "Valores posibles para ruleta: leveling, 506070, msq, guildhests, expert, trials, mentor, alliance, normal\nValores posibles para rol: tank, dps, healer, all, none/reset",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudItemNotFound": {
- "message": "No pudo encuentra el artículo.",
- "description": "<b__0>d.MoveNext"
- },
- "InstallerHeader": {
- "message": "Instalador de Plugins",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerHint": {
- "message": "Esta ventana permite que instalar y elimnar los plugins en el juego.\nFueron hechos por desarrolladores terceros.",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerLoading": {
- "message": "Está cargando los plugins...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDownloadFailed": {
- "message": "La descarga falló.",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInstalled": {
- "message": " (instalado)",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInProgress": {
- "message": "Instalación en curso...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDisable": {
- "message": "Desactiva",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerOpenConfig": {
- "message": "Abre Configuración",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdating": {
- "message": "Actualizando...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdateComplete": {
- "message": "¡{0} plugins han actualizado!",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerNoUpdates": {
- "message": "¡No hay actualizaciónes!",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdatePlugins": {
- "message": "Actualiza plugins",
- "description": "PluginInstallerWindow.Draw"
- },
- "Close": {
- "message": "Cierra",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerError": {
- "message": "El instalador falló",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerErrorHint": {
- "message": "El instalador de plugins corrió a una problema, o el plugin está incompatible.\nPor favor reinicia el juego y informa el error en neustro Discord.",
- "description": "PluginInstallerWindow.Draw"
- },
- "OK": {
- "message": "OK",
- "description": "PluginInstallerWindow.Draw"
- },
- "DalamudWelcome": {
- "message": "El extra In-Game v{0} de XIVLauncher ha cargado.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginLoaded": {
- "message": " 》 {0} v{1} ha cargado.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudUpdated": {
- "message": "¡El extra In-Game había actualizado o reinstalado con éxito! Por favor comproba el Discord para un changelog completo.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateRequired": {
- "message": "Uno o más de sus plugins deben habar actualizado. ¡Por favor utiliza el comando /xlplugins para los actualizan!",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateCheckFail": {
- "message": "No pudo buscar para actualizaciónes de los plugins.",
- "description": "ChatHandlers.OnChatMessage"
- }
-}
\ No newline at end of file
diff --git a/Dalamud/UIRes/loc/dalamud/dalamud_fr.json b/Dalamud/UIRes/loc/dalamud/dalamud_fr.json
deleted file mode 100644
index 9bba4cc16..000000000
--- a/Dalamud/UIRes/loc/dalamud/dalamud_fr.json
+++ /dev/null
@@ -1,194 +0,0 @@
-{
- "DalamudUnloadHelp": {
- "message": "Désactive l'addon in-game de XIVLauncher.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPluginReloadHelp": {
- "message": "Recharge tous les plugins.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPrintChatHelp": {
- "message": "Afficher dans le chat.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdInfoHelp": {
- "message": "Montre la liste des commandes disponibles.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteHelp": {
- "message": "Met en sourdine un mot ou une phrase dans le chat. Utilisation : /xlmute ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteListHelp": {
- "message": "Liste les mots ou phrases en sourdine.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudUnmuteHelp": {
- "message": "Ré-affiche un mot ou une phrase. Utilisation : /xlunmute ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudLastLinkHelp": {
- "message": "Ouvre le dernier lien affiché dans le chat dans votre navigateur par défaut.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBotJoinHelp": {
- "message": "Ajoute le bot discord XIVLauncher que vous avez configuré à votre serveur.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBgmSetHelp": {
- "message": "Définit la musique de fond. Utilisation : /xlbgmset ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudItemLinkHelp": {
- "message": "Envoie le lien d'un objet grâce à son nom. Utilisation : /xlitem . Pour trouver un objet précis, utilisez /xlitem +",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBonusHelp": {
- "message": "Informe lorsque une mission aléatoire possède le bonus spécifié. Exécuter sans paramètres pour plus d'infos. Utilisation : /xlbonus ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudDevMenuHelp": {
- "message": "Fait sortir le menu dev DEBUG",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudInstallerHelp": {
- "message": "Ouvrir l’installateur de plugins",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCreditsHelp": {
- "message": "Ouvre la liste des participants.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdHelpAvailable": {
- "message": "Commandes disponibles :",
- "description": "Dalamud.OnHelpCommand"
- },
- "DalamudMuted": {
- "message": "\"{0}\" est mis en sourdine.",
- "description": "Dalamud.OnBadWordsAddCommand"
- },
- "DalamudNoneMuted": {
- "message": "Pas de mots ou phrases en sourdine.",
- "description": "Dalamud.OnBadWordsListCommand"
- },
- "DalamudUnmuted": {
- "message": "\"{0}\" est de nouveau visible.",
- "description": "Dalamud.OnBadWordsRemoveCommand"
- },
- "DalamudNoLastLink": {
- "message": "Il n'y a pas de lien...",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudOpeningLink": {
- "message": "Ouverture de {0}",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudBotNotSetup": {
- "message": "Le bot discord XIVLauncher n'a pas été configuré correctement ou ne peut pas se connecter à discord. Veuillez vérifier les paramètres et la FAQ.",
- "description": "Dalamud.OnBotJoinCommand"
- },
- "DalamudChannelNotSetup": {
- "message": "Vous n'avez pas configuré de canal discord pour ces notifications - vous les recevrez uniquement dans le chat. Pour ce faire, veuillez utiliser les paramètres \"In-game\" dans XIVLauncher.",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusSet": {
- "message": "Définit les notifications de bonus pour {0}({1}) à {2}",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudInvalidArguments": {
- "message": "Arguments non-reconnus.",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusPossibleValues": {
- "message": "Valeurs possibles pour mission aléatoire : leveling, 506070, msq, guildhests, expert, trials, mentor, alliance, normal\nValeurs possibles pour rôle : tank, dps, healer, all, none/reset",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudItemNotFound": {
- "message": "L'objet n'a pas pu être trouvé.",
- "description": "<b__0>d.MoveNext"
- },
- "InstallerHeader": {
- "message": "Installateur de Plugin",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerHint": {
- "message": "Cette fenêtre vous autorise à installer ou retirer des plugins en jeu.\nIls sont créés par des développeurs tiers.",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerLoading": {
- "message": "Chargement des plugins...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDownloadFailed": {
- "message": "Le téléchargement a échoué.",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInstalled": {
- "message": " (installé)",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInProgress": {
- "message": "Installation en cours...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDisable": {
- "message": "Désactiver",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerOpenConfig": {
- "message": "Ouvrir la configuration",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdating": {
- "message": "Mise à jour...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdateComplete": {
- "message": "{0} plugin(s) mis à jour !",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerNoUpdates": {
- "message": "Pas de mise à jour trouvée !",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdatePlugins": {
- "message": "Mettre à jour les plugins",
- "description": "PluginInstallerWindow.Draw"
- },
- "Close": {
- "message": "Fermer",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerError": {
- "message": "Échec de l'installation",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerErrorHint": {
- "message": "L'installateur de plugins a rencontré un problème ou le plugin est incompatible.\nVeuillez redémarrer le jeu et rapporter cette erreur sur notre discord.",
- "description": "PluginInstallerWindow.Draw"
- },
- "OK": {
- "message": "OK",
- "description": "PluginInstallerWindow.Draw"
- },
- "DalamudWelcome": {
- "message": "Addon en jeu XIVLauncher v{0} chargé.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginLoaded": {
- "message": " 》 {0} v{1} chargé.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudUpdated": {
- "message": "L'addon en jeu à été mis à jour ou réinstallé avec succès ! Veuillez consulter le discord pour plus d'informations.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateRequired": {
- "message": "Un ou plusieurs plugins ne sont plus à jour. Veuillez utiliser la commande en jeu /xlplugins pour les mettre à jour !",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateCheckFail": {
- "message": "Impossible de vérifier les mises à jour des plugins.",
- "description": "ChatHandlers.OnChatMessage"
- }
-}
\ No newline at end of file
diff --git a/Dalamud/UIRes/loc/dalamud/dalamud_it.json b/Dalamud/UIRes/loc/dalamud/dalamud_it.json
deleted file mode 100644
index 8ed844ff0..000000000
--- a/Dalamud/UIRes/loc/dalamud/dalamud_it.json
+++ /dev/null
@@ -1,194 +0,0 @@
-{
- "DalamudUnloadHelp": {
- "message": "Disattiva l'addon in gioco di XIVLauncher.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPluginReloadHelp": {
- "message": "Ricarica tutti i plugin.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPrintChatHelp": {
- "message": "Stampa in chat.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdInfoHelp": {
- "message": "Mostra lista dei comandi disponibili.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteHelp": {
- "message": "Proibisci a una parola o a una frase di apparire in chat. Uso: /xlmute ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteListHelp": {
- "message": "Elenca parole e frasi proibite.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudUnmuteHelp": {
- "message": "Permetti a una parola o a una frase di apparire in chat. Uso: /xlunmute ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudLastLinkHelp": {
- "message": "Apri il link piú recente della chat nel tuo browser predefinito.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBotJoinHelp": {
- "message": "Aggiungi al tuo server il bot Discord di XIVLauncher che hai impostato.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBgmSetHelp": {
- "message": "Imposta la musica di sottofondo del gioco. Uso: /xlbgmset ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudItemLinkHelp": {
- "message": "Linka un oggetto per nome. Uso: /xlitem . Per abbinare un oggetto specifico, usa /xlitem +",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBonusHelp": {
- "message": "Notificami quando una roulette contiene un bonus specifico. Esegui senza parametri aggiuntivi per maggiori informazioni. Uso: /xlbonus ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudDevMenuHelp": {
- "message": "Mostra menu sviluppatore DEBUG",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudInstallerHelp": {
- "message": "Apri l'installatore dei plugin",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCreditsHelp": {
- "message": "Apri i titoli di coda per dalamud.",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdHelpAvailable": {
- "message": "Comandi disponibili:",
- "description": "Dalamud.OnHelpCommand"
- },
- "DalamudMuted": {
- "message": "Silenziato \"{0}\".",
- "description": "Dalamud.OnBadWordsAddCommand"
- },
- "DalamudNoneMuted": {
- "message": "Nessuna parola o frase proibita.",
- "description": "Dalamud.OnBadWordsListCommand"
- },
- "DalamudUnmuted": {
- "message": "Riattivato \"{0}\".",
- "description": "Dalamud.OnBadWordsRemoveCommand"
- },
- "DalamudNoLastLink": {
- "message": "Nessun link recente...",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudOpeningLink": {
- "message": "Aprendo {0}",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudBotNotSetup": {
- "message": "Il bot Discord di XIVLauncher non è stato impostato correttamente o non ha potuto connettersi a Discord. Per favore controlla le impostazioni e le FAQ.",
- "description": "Dalamud.OnBotJoinCommand"
- },
- "DalamudChannelNotSetup": {
- "message": "Non hai impostato un canale Discord per queste notifiche - Per fare ció, utilizza le impostazioni di gioco di XIVLauncher. Al momento, riceverai le notifiche solo nella chat.",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusSet": {
- "message": "Impostate notifiche bonus per {0}({1} a {2})",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudInvalidArguments": {
- "message": "Argomenti non risconosciuti.",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusPossibleValues": {
- "message": "Possibili valori per la roulette: leveling, 506070, msq, guildhests, expert, trials, mentor, alliance, normal\nPossibili valori per i ruoli: tank, dps, healer, all, none/reset",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudItemNotFound": {
- "message": "Oggetto non trovato.",
- "description": "<b__0>d.MoveNext"
- },
- "InstallerHeader": {
- "message": "Installatore Plugin",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerHint": {
- "message": "Questa finestra ti permette di installare e rimuovere i plugin di gioco.\nSono sviluppati da terze parti.",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerLoading": {
- "message": "Caricamento plugins...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDownloadFailed": {
- "message": "Download fallito.",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInstalled": {
- "message": " (installato)",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInProgress": {
- "message": "Installazione in corso...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDisable": {
- "message": "Disabilita",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerOpenConfig": {
- "message": "Apri configurazione",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdating": {
- "message": "Aggiornamento...",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdateComplete": {
- "message": "{0} plugins aggiornati!",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerNoUpdates": {
- "message": "Nessun aggiornamento trovato!",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdatePlugins": {
- "message": "Aggiorna plugins",
- "description": "PluginInstallerWindow.Draw"
- },
- "Close": {
- "message": "Chiudi",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerError": {
- "message": "Installazione fallita",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerErrorHint": {
- "message": "L'installatore ha riscontrato dei problemi o il plugin é incompatibile.\nRiavvia il gioco e segnalaci questo errore sul nostro Discord.",
- "description": "PluginInstallerWindow.Draw"
- },
- "OK": {
- "message": "OK",
- "description": "PluginInstallerWindow.Draw"
- },
- "DalamudWelcome": {
- "message": "XIVLauncher addon in gioco v{0} caricato.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginLoaded": {
- "message": " 》 {0} v{1} caricato.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudUpdated": {
- "message": "L'addon in gioco è stato aggiornato o reinstallato con successo! Controlla su Discord per un changelog completo.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateRequired": {
- "message": "Uno o piú dei tuoi plugins necessita un aggiornamento. Usa il comando /xlplugins in gioco per aggiornarli!",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateCheckFail": {
- "message": "Non è stato possibile controllare gli aggiornamenti dei plugin.",
- "description": "ChatHandlers.OnChatMessage"
- }
-}
\ No newline at end of file
diff --git a/Dalamud/UIRes/loc/dalamud/dalamud_ja.json b/Dalamud/UIRes/loc/dalamud/dalamud_ja.json
deleted file mode 100644
index c4f81d2bf..000000000
--- a/Dalamud/UIRes/loc/dalamud/dalamud_ja.json
+++ /dev/null
@@ -1,194 +0,0 @@
-{
- "DalamudUnloadHelp": {
- "message": "XIVLauncher In-Game アドオンをアンロードします。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPluginReloadHelp": {
- "message": "全てのプラグインをリロードします。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudPrintChatHelp": {
- "message": "チャットに出力する。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdInfoHelp": {
- "message": "利用可能なコマンド一覧を表示します。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteHelp": {
- "message": "チャットに表示される単語や文章をミュートします。 利用法: /xlmute <単語 または、文章>",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudMuteListHelp": {
- "message": "ミュートされた単語または文章の一覧を表示します。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudUnmuteHelp": {
- "message": "単語または文章のミュートを解除します。利用法: /xlunmute <単語 または、文章>",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudLastLinkHelp": {
- "message": "デフォルトブラウザで直前に投稿したリンクを開きます。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBotJoinHelp": {
- "message": "設定した XIVLauncher の Discord ボットを自分のサーバーへ追加します。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBgmSetHelp": {
- "message": "ゲームBGMを設定します。利用法: /xlbgmset ",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudItemLinkHelp": {
- "message": "アイテムを名前でリンクします。使用法: /xlitem <アイテム名> アイテム名を完全一致したい場合: /xlitem +<アイテム名>",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudBonusHelp": {
- "message": "ルーレットに指定したボーナスがある場合に通知します。詳細はパラメータなしで実行してください。使用法: /xlbonus <ルーレット名> <ロール名>",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudDevMenuHelp": {
- "message": "DEBUG 開発メニューを表示します。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudInstallerHelp": {
- "message": "プラグインインストーラを開きます",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCreditsHelp": {
- "message": "Dalamud のクレジットを開きます。",
- "description": "Dalamud.SetupCommands"
- },
- "DalamudCmdHelpAvailable": {
- "message": "利用可能なコマンド:",
- "description": "Dalamud.OnHelpCommand"
- },
- "DalamudMuted": {
- "message": "\"{0}\" をミュートしました。",
- "description": "Dalamud.OnBadWordsAddCommand"
- },
- "DalamudNoneMuted": {
- "message": "ミュートされている単語または、文章はありません。",
- "description": "Dalamud.OnBadWordsListCommand"
- },
- "DalamudUnmuted": {
- "message": "\"{0}\" のミュートを解除しました。",
- "description": "Dalamud.OnBadWordsRemoveCommand"
- },
- "DalamudNoLastLink": {
- "message": "直前のリンクがありません……",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudOpeningLink": {
- "message": "{0} を開いています。",
- "description": "Dalamud.OnLastLinkCommand"
- },
- "DalamudBotNotSetup": {
- "message": "XIVLauncher の Discordボットが正しく設定されていないか、Discord に接続できませんでした。設定やFAQをご確認ください。",
- "description": "Dalamud.OnBotJoinCommand"
- },
- "DalamudChannelNotSetup": {
- "message": "通知用の Discord チャンネルを設定していません (チャットでのみ受信できます)。Discord で通知を受け取るには、XIVLauncher の In-Game 設定をしてください。",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusSet": {
- "message": "{0}({1}) のボーナス通知を {2} に設定します",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudInvalidArguments": {
- "message": "認識できないパラメータです。",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudBonusPossibleValues": {
- "message": "ルーレットの可能な入力:leveling, 506070, msq, guildhests, expert, trials, mentor, alliance, normal\nロールの可能な入力:tank, dps, healer, all, none/reset",
- "description": "Dalamud.OnRouletteBonusNotifyCommand"
- },
- "DalamudItemNotFound": {
- "message": "アイテムを見つけられませんでした。",
- "description": "<b__0>d.MoveNext"
- },
- "InstallerHeader": {
- "message": "プラグインインストーラ",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerHint": {
- "message": "このウィンドウでは、In-Game プラグインのインストールと削除を行うことができます。\nこれらはサードパーティの開発者によって作られたものです。",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerLoading": {
- "message": "プラグインをロード中……",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDownloadFailed": {
- "message": "ダウンロードが失敗しました。",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInstalled": {
- "message": " (導入済み)",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerInProgress": {
- "message": "インストール中……",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerDisable": {
- "message": "無効化",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerOpenConfig": {
- "message": "設定を開く",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdating": {
- "message": "アップデートしています……",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdateComplete": {
- "message": "{0} のプラグインが更新されました!",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerNoUpdates": {
- "message": "アップデートが見つかりませんでした!",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerUpdatePlugins": {
- "message": "プラグインをアップデートする",
- "description": "PluginInstallerWindow.Draw"
- },
- "Close": {
- "message": "閉じる",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerError": {
- "message": "インストールが失敗しました",
- "description": "PluginInstallerWindow.Draw"
- },
- "InstallerErrorHint": {
- "message": "プラグインのインストーラに問題が発生したか、プラグインとの互換性がありません。\nゲームを再起動して、このエラーを私たちのディスコードで報告してください。",
- "description": "PluginInstallerWindow.Draw"
- },
- "OK": {
- "message": "OK",
- "description": "PluginInstallerWindow.Draw"
- },
- "DalamudWelcome": {
- "message": "XIVLauncher In-Game アドオン v{0} がロードされました.",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginLoaded": {
- "message": " 》 {0} v{1} がロードされました。",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudUpdated": {
- "message": "In-Game アドオンの更新または、再インストールに成功しました。詳細な変更履歴はDiscordで確認してください。",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateRequired": {
- "message": "いくつかのプラグインで更新が必要です。/xlplugins コマンドを使用して、プラグインを更新してください。",
- "description": "ChatHandlers.OnChatMessage"
- },
- "DalamudPluginUpdateCheckFail": {
- "message": "プラグインの更新を確認できませんでした。",
- "description": "ChatHandlers.OnChatMessage"
- }
-}
\ No newline at end of file
diff --git a/Dalamud/UIRes/logo.png b/Dalamud/UIRes/logo.png
deleted file mode 100644
index 5b118df26..000000000
Binary files a/Dalamud/UIRes/logo.png and /dev/null differ
diff --git a/README.md b/README.md
index 47c86fc5f..c72cb6481 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,16 @@
# Dalamud [](https://github.com/goaaats/Dalamud/actions) [](https://discord.gg/3NMcUV5)
-
+
Dalamud is a plugin development framework for FINAL FANTASY XIV that provides access to game data and native interoperability with the game itself to add functionality and quality-of-life.
-It is meant to be used in conjunction with [FFXIVQuickLauncher](https://github.com/goaaats/FFXIVQuickLauncher).
+It is meant to be used in conjunction with [FFXIVQuickLauncher](https://github.com/goatcorp/FFXIVQuickLauncher).
## Plugin development
Dalamud features a growing API for in-game plugin development with game data and chat access and overlays.
-Please see the [API documentation](https://goaaats.github.io/Dalamud/api/index.html) for more details.
+Please see the [API documentation](https://goatcorp.github.io/Dalamud/api/index.html) for more details.
If you need any support regarding the API or usage of Dalamud, please [join our discord server](https://discord.gg/3NMcUV5).
diff --git a/docs/README.html b/docs/README.html
index 000383d40..9b42138c2 100644
--- a/docs/README.html
+++ b/docs/README.html
@@ -63,13 +63,13 @@
Dalamud
-
+
Dalamud is a plugin development framework for FINAL FANTASY XIV that provides access to game data and native interoperability with the game itself to add functionality and quality-of-life.
Dalamud features a growing API for in-game plugin development with game data and chat access and overlays.
-Please see the API documentation for more details.
diff --git a/docs/api/ImGuiScene.FramerateLimit.LimitType.html b/docs/api/ImGuiScene.FramerateLimit.LimitType.html
index 6225c1f9e..091bfff68 100644
--- a/docs/api/ImGuiScene.FramerateLimit.LimitType.html
+++ b/docs/api/ImGuiScene.FramerateLimit.LimitType.html
@@ -122,10 +122,10 @@ This will disable vsync regardless of the fps value.
diff --git a/docs/api/ImGuiScene.GLTextureWrap.html b/docs/api/ImGuiScene.GLTextureWrap.html
index 1eb36fd37..1ae296054 100644
--- a/docs/api/ImGuiScene.GLTextureWrap.html
+++ b/docs/api/ImGuiScene.GLTextureWrap.html
@@ -121,10 +121,10 @@ Provides a simple wrapped view of the disposeable resource as well as the handle
|
- Improve this Doc
+ Improve this Doc
- View Source
+ View Source
diff --git a/docs/api/ImGuiScene.ImGui_Impl_DX11.html b/docs/api/ImGuiScene.ImGui_Impl_DX11.html
index d85c975dc..92c52508f 100644
--- a/docs/api/ImGuiScene.ImGui_Impl_DX11.html
+++ b/docs/api/ImGuiScene.ImGui_Impl_DX11.html
@@ -124,10 +124,10 @@ Would be nice to organize it better, but it seems to work
|
- Improve this Doc
+ Improve this Doc
- View Source
+ View Source
diff --git a/docs/api/ImGuiScene.ImGui_Impl_OpenGL3.html b/docs/api/ImGuiScene.ImGui_Impl_OpenGL3.html
index bb93ad0ef..5105e4b14 100644
--- a/docs/api/ImGuiScene.ImGui_Impl_OpenGL3.html
+++ b/docs/api/ImGuiScene.ImGui_Impl_OpenGL3.html
@@ -121,10 +121,10 @@ State backup IS done for this renderer, because SDL does not play nicely when us
|
- Improve this Doc
+ Improve this Doc
- View Source
+ View Source
diff --git a/docs/api/ImGuiScene.SimpleImGuiScene.html b/docs/api/ImGuiScene.SimpleImGuiScene.html
index 27fbb30db..f839f6e1f 100644
--- a/docs/api/ImGuiScene.SimpleImGuiScene.html
+++ b/docs/api/ImGuiScene.SimpleImGuiScene.html
@@ -121,10 +121,10 @@ Currently this always creates a new window rather than take ownership of an exis
|
- Improve this Doc
+ Improve this Doc
- View Source
+ View Source
diff --git a/docs/api/ImGuiScene.WindowCreateInfo.html b/docs/api/ImGuiScene.WindowCreateInfo.html
index 4d3569915..0f52e6d35 100644
--- a/docs/api/ImGuiScene.WindowCreateInfo.html
+++ b/docs/api/ImGuiScene.WindowCreateInfo.html
@@ -115,10 +115,10 @@
|
- Improve this Doc
+ Improve this Doc
- View Source
+ View Source
Fullscreen
Whether the window should be created fullscreen. This is a borderless windowed mode and will not affect desktop resolution.
@@ -146,10 +146,10 @@ Fullscreen windows are "always on top".
An optional float[4] color key used to make any matching portion of the window's client area transparent. For example, setting this to magenta will
@@ -238,10 +238,10 @@ Values are red, green, blue from 0 to 1.