The width of the window. Ignored for fullscreen windows.
The x location of the top left corner of the window. Ignored for fullscreen windows.
@@ -298,10 +298,10 @@ Values are red, green, blue from 0 to 1.
|
- Improve this Doc
+ Improve this Doc
- View Source
+ View Source
YPos
The y location of the top left corner of the window. Ignored for fullscreen windows.
@@ -334,10 +334,10 @@ Values are red, green, blue from 0 to 1.
diff --git a/docs/api/ImGuiScene.WindowFactory.html b/docs/api/ImGuiScene.WindowFactory.html
index 0465faaeb..39c3c0df4 100644
--- a/docs/api/ImGuiScene.WindowFactory.html
+++ b/docs/api/ImGuiScene.WindowFactory.html
@@ -115,10 +115,10 @@
|
- Improve this Doc
+ Improve this Doc
- View Source
+ View Source
CreateForRenderer(IRenderer, WindowCreateInfo)
@@ -176,10 +176,10 @@
diff --git a/docs/api/ImGuiScene.html b/docs/api/ImGuiScene.html
index 996da4b12..7362d09d7 100644
--- a/docs/api/ImGuiScene.html
+++ b/docs/api/ImGuiScene.html
@@ -156,6 +156,10 @@ Currently this always creates a new window rather than take ownership of an exis
+
+
+
+
diff --git a/docs/api/index.html b/docs/api/index.html
index 68f94eb2b..a47ebcfc3 100644
--- a/docs/api/index.html
+++ b/docs/api/index.html
@@ -69,7 +69,7 @@
Dalamud Plugin API
-This is the documentation for the publicly accessible Dalamud plugin API. See the market board plugin as an example.
+This is the documentation for the publicly accessible Dalamud plugin API. See the rich presence plugin as an example.
All plugins have to implement the IDalamudPlugin interface that gives them access to objects like the chat command manager and game client information.
diff --git a/docs/api/toc.html b/docs/api/toc.html
index bad624688..cf2897fe8 100644
--- a/docs/api/toc.html
+++ b/docs/api/toc.html
@@ -138,6 +138,9 @@
JobGauges
+
+ KeyState
+
@@ -1769,6 +1772,12 @@
RawDX11Scene.BuildUIDelegate
+
+ RawDX11Scene.NewInputFrameDelegate
+
+
+ RawDX11Scene.NewRenderFrameDelegate
+
RendererFactory
diff --git a/docs/manifest.json b/docs/manifest.json
index eb969327a..22ad3bc53 100644
--- a/docs/manifest.json
+++ b/docs/manifest.json
@@ -345,7 +345,7 @@
"output": {
".html": {
"relative_path": "api/Dalamud.Game.ClientState.Actors.ActorTable.html",
- "hash": "yOCYytufBeRJKRGnJBQcgA=="
+ "hash": "mb95lrWRdiWSDp4I73KhWQ=="
}
},
"is_incremental": true,
@@ -501,7 +501,7 @@
"output": {
".html": {
"relative_path": "api/Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.html",
- "hash": "/1SgQn1jAz1YeNeP1ODPoA=="
+ "hash": "07Wyr8sESUG4ZDkjLTosVg=="
}
},
"is_incremental": true,
@@ -537,10 +537,10 @@
"output": {
".html": {
"relative_path": "api/Dalamud.Game.ClientState.ClientState.html",
- "hash": "+GccwfOSsXxZ2DYVoV1pxQ=="
+ "hash": "UtaRpLJVIB29NN8nQdsxNQ=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -555,13 +555,25 @@
"is_incremental": true,
"version": ""
},
+ {
+ "type": "ManagedReference",
+ "source_relative_path": "api/Dalamud.Game.ClientState.KeyState.yml",
+ "output": {
+ ".html": {
+ "relative_path": "api/Dalamud.Game.ClientState.KeyState.html",
+ "hash": "fEHbTrdQ6qYqYfh9yaBbHw=="
+ }
+ },
+ "is_incremental": true,
+ "version": ""
+ },
{
"type": "ManagedReference",
"source_relative_path": "api/Dalamud.Game.ClientState.Structs.Actor.yml",
"output": {
".html": {
"relative_path": "api/Dalamud.Game.ClientState.Structs.Actor.html",
- "hash": "Pn5NZrqDMcsr8ledfwyE8Q=="
+ "hash": "W2MAH4EowjHSEak6pVUwuQ=="
}
},
"is_incremental": true,
@@ -909,10 +921,10 @@
"output": {
".html": {
"relative_path": "api/Dalamud.Game.ClientState.html",
- "hash": "bMXBheKNEeLNo4CIMwz3EA=="
+ "hash": "N0P2MvjdefFlVNN+/+6msQ=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1032,7 +1044,7 @@
"hash": "WU8PXcwlmcONSAzIRQWBRw=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1041,10 +1053,10 @@
"output": {
".html": {
"relative_path": "api/Dalamud.Game.Internal.Framework.html",
- "hash": "ac8TO3V+YFtEp9SlRg9LbQ=="
+ "hash": "uHiwmYC2THfu8sEJ2r5nrA=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1080,7 +1092,7 @@
"hash": "/c5QWDWMdBnF72QnRufrFA=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1128,7 +1140,7 @@
"hash": "m80x6jKz7GimYvD1uOs64A=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1200,7 +1212,7 @@
"hash": "mFZv4famcWJK4wp0V0cDIQ=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1212,7 +1224,7 @@
"hash": "Z6AULGl7gQ2srIhgUlXibQ=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1224,7 +1236,7 @@
"hash": "yYKSQqdLXtxP5fgvCLkFIA=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1440,7 +1452,7 @@
"hash": "x1Mo8zSLRaEVbDWPBN4v9g=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -1500,7 +1512,7 @@
"hash": "gi91bqC1OjFQNEqiOJKsJw=="
}
},
- "is_incremental": false,
+ "is_incremental": true,
"version": ""
},
{
@@ -6201,7 +6213,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiNET.RangeAccessor-1.html",
- "hash": "31V1mUauG5peFRm+w9OiuA=="
+ "hash": "Kh0MYHMlyDYvkQtSlSll3Q=="
}
},
"is_incremental": true,
@@ -6225,7 +6237,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiNET.RangePtrAccessor-1.html",
- "hash": "8x4YQsZqkK/v4cZX0kKb+Q=="
+ "hash": "vTcVpOM+Bj+06V7IrpE0Kw=="
}
},
"is_incremental": true,
@@ -6261,7 +6273,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.FramerateLimit.LimitType.html",
- "hash": "5V5/sn6Jofm6HDcSuICHiw=="
+ "hash": "3A0TH7QBcTsIdpO8pBjhbA=="
}
},
"is_incremental": true,
@@ -6273,7 +6285,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.FramerateLimit.html",
- "hash": "uS9J2/9fazfiV4z1AbPmMA=="
+ "hash": "DypLicBLVpHkaOi2i8xmcA=="
}
},
"is_incremental": true,
@@ -6285,7 +6297,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.GLTextureWrap.html",
- "hash": "gJpca+uAmTqvbbUGeeJ94w=="
+ "hash": "iHzURvRrCXz/jtHDE8wmlw=="
}
},
"is_incremental": true,
@@ -6297,7 +6309,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.IImGuiInputHandler.html",
- "hash": "PZeVIhVQvtaw8GIrUQuhKQ=="
+ "hash": "YtUy1x3njGDv6++qRvubkg=="
}
},
"is_incremental": true,
@@ -6309,7 +6321,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.IImGuiRenderer.html",
- "hash": "Js6HEhkYnC3GcUKSnMAOTQ=="
+ "hash": "ceCnQDgTY0i+Fzsht2vb1g=="
}
},
"is_incremental": true,
@@ -6321,7 +6333,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.IRenderer.html",
- "hash": "DFzoaA3p/8m7p2Oa+SpJKQ=="
+ "hash": "XSkfb9DmPjAf4g312jCa4Q=="
}
},
"is_incremental": true,
@@ -6333,7 +6345,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.ImGui_Impl_DX11.html",
- "hash": "V4a/XEnEaFSNnq9vPNNY1Q=="
+ "hash": "MgJdg9TrcMLEkEpCl3mTpQ=="
}
},
"is_incremental": true,
@@ -6345,7 +6357,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.ImGui_Impl_OpenGL3.html",
- "hash": "0/CtZG3IJA+cVxX0grX9cg=="
+ "hash": "qP0BJ7EHoLty9rDlI2EHeQ=="
}
},
"is_incremental": true,
@@ -6357,7 +6369,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.ImGui_Impl_SDL.html",
- "hash": "IarcrlouBalVBwPbBfkztg=="
+ "hash": "0NwPjPHoIhUWJz7hQIgOUg=="
}
},
"is_incremental": true,
@@ -6369,7 +6381,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.ImGui_Input_Impl_Direct.html",
- "hash": "rYFdCbkfO5pY+sdaNX25Uw=="
+ "hash": "KYg618RmjFW+/nkgIaTCkA=="
}
},
"is_incremental": true,
@@ -6381,7 +6393,31 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.RawDX11Scene.BuildUIDelegate.html",
- "hash": "GGBBCVJfL5Gh0m1SRIuk0A=="
+ "hash": "dln4AtnbhjLxqrfghRP2dA=="
+ }
+ },
+ "is_incremental": true,
+ "version": ""
+ },
+ {
+ "type": "ManagedReference",
+ "source_relative_path": "api/ImGuiScene.RawDX11Scene.NewInputFrameDelegate.yml",
+ "output": {
+ ".html": {
+ "relative_path": "api/ImGuiScene.RawDX11Scene.NewInputFrameDelegate.html",
+ "hash": "MzVOj5oyMcpNnedadNWMBQ=="
+ }
+ },
+ "is_incremental": true,
+ "version": ""
+ },
+ {
+ "type": "ManagedReference",
+ "source_relative_path": "api/ImGuiScene.RawDX11Scene.NewRenderFrameDelegate.yml",
+ "output": {
+ ".html": {
+ "relative_path": "api/ImGuiScene.RawDX11Scene.NewRenderFrameDelegate.html",
+ "hash": "lb/JfcyUZVPOc0Y/vJfEKA=="
}
},
"is_incremental": true,
@@ -6393,7 +6429,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.RawDX11Scene.html",
- "hash": "wU1RNQbTh2gzGovi+gFAIA=="
+ "hash": "KLPpr3W3B7WKLABct6zrmQ=="
}
},
"is_incremental": true,
@@ -6405,7 +6441,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.RendererFactory.RendererBackend.html",
- "hash": "3F8RQW2nwHvgr2UbYwrPdQ=="
+ "hash": "6QV68wiPU8TvB5Lt4ZKqkA=="
}
},
"is_incremental": true,
@@ -6417,7 +6453,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.RendererFactory.html",
- "hash": "UuLi6tDzLxjumLXOxBEVbg=="
+ "hash": "+StSuX0ZtRBgoQSJdr8MTg=="
}
},
"is_incremental": true,
@@ -6429,7 +6465,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.SDLWindowGL.html",
- "hash": "jgsb/BFkgImisDDOLnJfvw=="
+ "hash": "H5bnEfO/VK0EJQNQzZs7eg=="
}
},
"is_incremental": true,
@@ -6441,7 +6477,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.SimpleD3D.html",
- "hash": "sOZvfGpjU85HCZdZkcsmvQ=="
+ "hash": "LmK8KdW+bHtWj9PspTW88w=="
}
},
"is_incremental": true,
@@ -6453,7 +6489,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.SimpleImGuiScene.BuildUIDelegate.html",
- "hash": "Z7QZjEwN9aqI59JKOpG18w=="
+ "hash": "GtFcVDNYlwu26ybd5iZV2A=="
}
},
"is_incremental": true,
@@ -6465,7 +6501,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.SimpleImGuiScene.html",
- "hash": "g0R1aBWHO5LP90Y0RkbQAg=="
+ "hash": "jOXvV2xPwMyVteB3HllT+w=="
}
},
"is_incremental": true,
@@ -6477,7 +6513,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.SimpleOGL3.html",
- "hash": "AFUnh4UPtwtmWhDWkHCTlw=="
+ "hash": "hXMEGNd3ceYRxWxgmwu+yA=="
}
},
"is_incremental": true,
@@ -6489,7 +6525,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.SimpleSDLWindow.ProcessEventDelegate.html",
- "hash": "FSKXOWmfyrjByQeZPl7AGw=="
+ "hash": "vgklSpE7NE77/+RtEsyW5Q=="
}
},
"is_incremental": true,
@@ -6501,7 +6537,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.SimpleSDLWindow.html",
- "hash": "pcY+8h+fUgn7RmDorNpPag=="
+ "hash": "SfMNmJit3PpCGzbRGHB83w=="
}
},
"is_incremental": true,
@@ -6513,7 +6549,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.TextureWrap.html",
- "hash": "WO9knpS88XQfES52e1/6oA=="
+ "hash": "hYP/Rhre7ZxAkFpo2j+vVw=="
}
},
"is_incremental": true,
@@ -6525,7 +6561,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.WindowCreateInfo.html",
- "hash": "f7xc03wnzA7k4h+otVSS7w=="
+ "hash": "Kj2sHyIUKvKpPcLCW8UyYg=="
}
},
"is_incremental": true,
@@ -6537,7 +6573,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.WindowFactory.html",
- "hash": "BYs4qCBc2yfeU38eTpSlSg=="
+ "hash": "S+D60x7rmL+nKuBfZC+6uw=="
}
},
"is_incremental": true,
@@ -6549,7 +6585,7 @@
"output": {
".html": {
"relative_path": "api/ImGuiScene.html",
- "hash": "WrDfzUKGD64w4M2smza5iQ=="
+ "hash": "05HemJVfTpjHPGWweE+ChA=="
}
},
"is_incremental": true,
@@ -8217,10 +8253,10 @@
"output": {
".html": {
"relative_path": "api/index.html",
- "hash": "Y7W3npbJph/JcPu1DOK3aQ=="
+ "hash": "uS51zSUKzJYdepDkulBJ9Q=="
}
},
- "is_incremental": true,
+ "is_incremental": false,
"version": ""
},
{
@@ -8229,7 +8265,7 @@
"output": {
".html": {
"relative_path": "api/toc.html",
- "hash": "9xlGtKjjiJAIDdKg2f8qag=="
+ "hash": "Uez3KosDLlWbsSW5GonF7A=="
}
},
"is_incremental": false,
@@ -8244,7 +8280,7 @@
"hash": "s84u+FH+UKO4kliIcL2f7w=="
}
},
- "is_incremental": true,
+ "is_incremental": false,
"version": ""
}
],
@@ -8264,17 +8300,17 @@
"total_file_count": 0,
"skipped_file_count": 0
},
+ "ManagedReferenceDocumentProcessor": {
+ "can_incremental": true,
+ "incrementalPhase": "build",
+ "total_file_count": 686,
+ "skipped_file_count": 686
+ },
"ConceptualDocumentProcessor": {
"can_incremental": true,
"incrementalPhase": "build",
"total_file_count": 3,
- "skipped_file_count": 3
- },
- "ManagedReferenceDocumentProcessor": {
- "can_incremental": true,
- "incrementalPhase": "build",
- "total_file_count": 683,
- "skipped_file_count": 681
+ "skipped_file_count": 2
}
}
},
diff --git a/docs/xrefmap.yml b/docs/xrefmap.yml
index d0641d3f2..faba2ea5d 100644
--- a/docs/xrefmap.yml
+++ b/docs/xrefmap.yml
@@ -2238,6 +2238,32 @@ references:
isSpec: "True"
fullName: Dalamud.Game.ClientState.Actors.ActorTable.ActorTable
nameWithType: ActorTable.ActorTable
+- uid: Dalamud.Game.ClientState.Actors.ActorTable.Dispose
+ name: Dispose()
+ href: api/Dalamud.Game.ClientState.Actors.ActorTable.html#Dalamud_Game_ClientState_Actors_ActorTable_Dispose
+ commentId: M:Dalamud.Game.ClientState.Actors.ActorTable.Dispose
+ fullName: Dalamud.Game.ClientState.Actors.ActorTable.Dispose()
+ nameWithType: ActorTable.Dispose()
+- uid: Dalamud.Game.ClientState.Actors.ActorTable.Dispose*
+ name: Dispose
+ href: api/Dalamud.Game.ClientState.Actors.ActorTable.html#Dalamud_Game_ClientState_Actors_ActorTable_Dispose_
+ commentId: Overload:Dalamud.Game.ClientState.Actors.ActorTable.Dispose
+ isSpec: "True"
+ fullName: Dalamud.Game.ClientState.Actors.ActorTable.Dispose
+ nameWithType: ActorTable.Dispose
+- uid: Dalamud.Game.ClientState.Actors.ActorTable.Enable
+ name: Enable()
+ href: api/Dalamud.Game.ClientState.Actors.ActorTable.html#Dalamud_Game_ClientState_Actors_ActorTable_Enable
+ commentId: M:Dalamud.Game.ClientState.Actors.ActorTable.Enable
+ fullName: Dalamud.Game.ClientState.Actors.ActorTable.Enable()
+ nameWithType: ActorTable.Enable()
+- uid: Dalamud.Game.ClientState.Actors.ActorTable.Enable*
+ name: Enable
+ href: api/Dalamud.Game.ClientState.Actors.ActorTable.html#Dalamud_Game_ClientState_Actors_ActorTable_Enable_
+ commentId: Overload:Dalamud.Game.ClientState.Actors.ActorTable.Enable
+ isSpec: "True"
+ fullName: Dalamud.Game.ClientState.Actors.ActorTable.Enable
+ nameWithType: ActorTable.Enable
- uid: Dalamud.Game.ClientState.Actors.ActorTable.GetEnumerator
name: GetEnumerator()
href: api/Dalamud.Game.ClientState.Actors.ActorTable.html#Dalamud_Game_ClientState_Actors_ActorTable_GetEnumerator
@@ -2887,6 +2913,19 @@ references:
isSpec: "True"
fullName: Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.PlayerCharacter
nameWithType: PlayerCharacter.PlayerCharacter
+- uid: Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.CompanyTag
+ name: CompanyTag
+ href: api/Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.html#Dalamud_Game_ClientState_Actors_Types_PlayerCharacter_CompanyTag
+ commentId: P:Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.CompanyTag
+ fullName: Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.CompanyTag
+ nameWithType: PlayerCharacter.CompanyTag
+- uid: Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.CompanyTag*
+ name: CompanyTag
+ href: api/Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.html#Dalamud_Game_ClientState_Actors_Types_PlayerCharacter_CompanyTag_
+ commentId: Overload:Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.CompanyTag
+ isSpec: "True"
+ fullName: Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.CompanyTag
+ nameWithType: PlayerCharacter.CompanyTag
- uid: Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.CurrentWorld
name: CurrentWorld
href: api/Dalamud.Game.ClientState.Actors.Types.PlayerCharacter.html#Dalamud_Game_ClientState_Actors_Types_PlayerCharacter_CurrentWorld
@@ -2944,12 +2983,44 @@ references:
commentId: F:Dalamud.Game.ClientState.ClientState.ClientLanguage
fullName: Dalamud.Game.ClientState.ClientState.ClientLanguage
nameWithType: ClientState.ClientLanguage
+- uid: Dalamud.Game.ClientState.ClientState.Dispose
+ name: Dispose()
+ href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_Dispose
+ commentId: M:Dalamud.Game.ClientState.ClientState.Dispose
+ fullName: Dalamud.Game.ClientState.ClientState.Dispose()
+ nameWithType: ClientState.Dispose()
+- uid: Dalamud.Game.ClientState.ClientState.Dispose*
+ name: Dispose
+ href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_Dispose_
+ commentId: Overload:Dalamud.Game.ClientState.ClientState.Dispose
+ isSpec: "True"
+ fullName: Dalamud.Game.ClientState.ClientState.Dispose
+ nameWithType: ClientState.Dispose
+- uid: Dalamud.Game.ClientState.ClientState.Enable
+ name: Enable()
+ href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_Enable
+ commentId: M:Dalamud.Game.ClientState.ClientState.Enable
+ fullName: Dalamud.Game.ClientState.ClientState.Enable()
+ nameWithType: ClientState.Enable()
+- uid: Dalamud.Game.ClientState.ClientState.Enable*
+ name: Enable
+ href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_Enable_
+ commentId: Overload:Dalamud.Game.ClientState.ClientState.Enable
+ isSpec: "True"
+ fullName: Dalamud.Game.ClientState.ClientState.Enable
+ nameWithType: ClientState.Enable
- uid: Dalamud.Game.ClientState.ClientState.JobGauges
name: JobGauges
href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_JobGauges
commentId: F:Dalamud.Game.ClientState.ClientState.JobGauges
fullName: Dalamud.Game.ClientState.ClientState.JobGauges
nameWithType: ClientState.JobGauges
+- uid: Dalamud.Game.ClientState.ClientState.KeyState
+ name: KeyState
+ href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_KeyState
+ commentId: F:Dalamud.Game.ClientState.ClientState.KeyState
+ fullName: Dalamud.Game.ClientState.ClientState.KeyState
+ nameWithType: ClientState.KeyState
- uid: Dalamud.Game.ClientState.ClientState.LocalContentId
name: LocalContentId
href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_LocalContentId
@@ -2982,17 +3053,16 @@ references:
commentId: E:Dalamud.Game.ClientState.ClientState.PropertyChanged
fullName: Dalamud.Game.ClientState.ClientState.PropertyChanged
nameWithType: ClientState.PropertyChanged
+- uid: Dalamud.Game.ClientState.ClientState.TerritoryChanged
+ name: TerritoryChanged
+ href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_TerritoryChanged
+ commentId: F:Dalamud.Game.ClientState.ClientState.TerritoryChanged
+ fullName: Dalamud.Game.ClientState.ClientState.TerritoryChanged
+ nameWithType: ClientState.TerritoryChanged
- uid: Dalamud.Game.ClientState.ClientState.TerritoryType
name: TerritoryType
href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_TerritoryType
- commentId: P:Dalamud.Game.ClientState.ClientState.TerritoryType
- fullName: Dalamud.Game.ClientState.ClientState.TerritoryType
- nameWithType: ClientState.TerritoryType
-- uid: Dalamud.Game.ClientState.ClientState.TerritoryType*
- name: TerritoryType
- href: api/Dalamud.Game.ClientState.ClientState.html#Dalamud_Game_ClientState_ClientState_TerritoryType_
- commentId: Overload:Dalamud.Game.ClientState.ClientState.TerritoryType
- isSpec: "True"
+ commentId: F:Dalamud.Game.ClientState.ClientState.TerritoryType
fullName: Dalamud.Game.ClientState.ClientState.TerritoryType
nameWithType: ClientState.TerritoryType
- uid: Dalamud.Game.ClientState.JobGauges
@@ -3030,6 +3100,54 @@ references:
fullName.vb: Dalamud.Game.ClientState.JobGauges.Get(Of T)()
nameWithType: JobGauges.Get
()
nameWithType.vb: JobGauges.Get(Of T)()
+- uid: Dalamud.Game.ClientState.KeyState
+ name: KeyState
+ href: api/Dalamud.Game.ClientState.KeyState.html
+ commentId: T:Dalamud.Game.ClientState.KeyState
+ fullName: Dalamud.Game.ClientState.KeyState
+ nameWithType: KeyState
+- uid: Dalamud.Game.ClientState.KeyState.#ctor(Dalamud.Game.ClientState.ClientStateAddressResolver,System.IntPtr)
+ name: KeyState(ClientStateAddressResolver, IntPtr)
+ href: api/Dalamud.Game.ClientState.KeyState.html#Dalamud_Game_ClientState_KeyState__ctor_Dalamud_Game_ClientState_ClientStateAddressResolver_System_IntPtr_
+ commentId: M:Dalamud.Game.ClientState.KeyState.#ctor(Dalamud.Game.ClientState.ClientStateAddressResolver,System.IntPtr)
+ fullName: Dalamud.Game.ClientState.KeyState.KeyState(Dalamud.Game.ClientState.ClientStateAddressResolver, System.IntPtr)
+ nameWithType: KeyState.KeyState(ClientStateAddressResolver, IntPtr)
+- uid: Dalamud.Game.ClientState.KeyState.#ctor*
+ name: KeyState
+ href: api/Dalamud.Game.ClientState.KeyState.html#Dalamud_Game_ClientState_KeyState__ctor_
+ commentId: Overload:Dalamud.Game.ClientState.KeyState.#ctor
+ isSpec: "True"
+ fullName: Dalamud.Game.ClientState.KeyState.KeyState
+ nameWithType: KeyState.KeyState
+- uid: Dalamud.Game.ClientState.KeyState.ClearAll
+ name: ClearAll()
+ href: api/Dalamud.Game.ClientState.KeyState.html#Dalamud_Game_ClientState_KeyState_ClearAll
+ commentId: M:Dalamud.Game.ClientState.KeyState.ClearAll
+ fullName: Dalamud.Game.ClientState.KeyState.ClearAll()
+ nameWithType: KeyState.ClearAll()
+- uid: Dalamud.Game.ClientState.KeyState.ClearAll*
+ name: ClearAll
+ href: api/Dalamud.Game.ClientState.KeyState.html#Dalamud_Game_ClientState_KeyState_ClearAll_
+ commentId: Overload:Dalamud.Game.ClientState.KeyState.ClearAll
+ isSpec: "True"
+ fullName: Dalamud.Game.ClientState.KeyState.ClearAll
+ nameWithType: KeyState.ClearAll
+- uid: Dalamud.Game.ClientState.KeyState.Item(System.Int32)
+ name: Item[Int32]
+ href: api/Dalamud.Game.ClientState.KeyState.html#Dalamud_Game_ClientState_KeyState_Item_System_Int32_
+ commentId: P:Dalamud.Game.ClientState.KeyState.Item(System.Int32)
+ name.vb: Item(Int32)
+ fullName: Dalamud.Game.ClientState.KeyState.Item[System.Int32]
+ fullName.vb: Dalamud.Game.ClientState.KeyState.Item(System.Int32)
+ nameWithType: KeyState.Item[Int32]
+ nameWithType.vb: KeyState.Item(Int32)
+- uid: Dalamud.Game.ClientState.KeyState.Item*
+ name: Item
+ href: api/Dalamud.Game.ClientState.KeyState.html#Dalamud_Game_ClientState_KeyState_Item_
+ commentId: Overload:Dalamud.Game.ClientState.KeyState.Item
+ isSpec: "True"
+ fullName: Dalamud.Game.ClientState.KeyState.Item
+ nameWithType: KeyState.Item
- uid: Dalamud.Game.ClientState.Structs
name: Dalamud.Game.ClientState.Structs
href: api/Dalamud.Game.ClientState.Structs.html
@@ -3054,6 +3172,12 @@ references:
commentId: F:Dalamud.Game.ClientState.Structs.Actor.ClassJob
fullName: Dalamud.Game.ClientState.Structs.Actor.ClassJob
nameWithType: Actor.ClassJob
+- uid: Dalamud.Game.ClientState.Structs.Actor.CompanyTag
+ name: CompanyTag
+ href: api/Dalamud.Game.ClientState.Structs.Actor.html#Dalamud_Game_ClientState_Structs_Actor_CompanyTag
+ commentId: F:Dalamud.Game.ClientState.Structs.Actor.CompanyTag
+ fullName: Dalamud.Game.ClientState.Structs.Actor.CompanyTag
+ nameWithType: Actor.CompanyTag
- uid: Dalamud.Game.ClientState.Structs.Actor.CurrentHp
name: CurrentHp
href: api/Dalamud.Game.ClientState.Structs.Actor.html#Dalamud_Game_ClientState_Structs_Actor_CurrentHp
@@ -67760,12 +67884,36 @@ references:
isSpec: "True"
fullName: ImGuiScene.RawDX11Scene.LoadImage
nameWithType: RawDX11Scene.LoadImage
+- uid: ImGuiScene.RawDX11Scene.NewInputFrameDelegate
+ name: RawDX11Scene.NewInputFrameDelegate
+ href: api/ImGuiScene.RawDX11Scene.NewInputFrameDelegate.html
+ commentId: T:ImGuiScene.RawDX11Scene.NewInputFrameDelegate
+ fullName: ImGuiScene.RawDX11Scene.NewInputFrameDelegate
+ nameWithType: RawDX11Scene.NewInputFrameDelegate
+- uid: ImGuiScene.RawDX11Scene.NewRenderFrameDelegate
+ name: RawDX11Scene.NewRenderFrameDelegate
+ href: api/ImGuiScene.RawDX11Scene.NewRenderFrameDelegate.html
+ commentId: T:ImGuiScene.RawDX11Scene.NewRenderFrameDelegate
+ fullName: ImGuiScene.RawDX11Scene.NewRenderFrameDelegate
+ nameWithType: RawDX11Scene.NewRenderFrameDelegate
- uid: ImGuiScene.RawDX11Scene.OnBuildUI
name: OnBuildUI
href: api/ImGuiScene.RawDX11Scene.html#ImGuiScene_RawDX11Scene_OnBuildUI
commentId: F:ImGuiScene.RawDX11Scene.OnBuildUI
fullName: ImGuiScene.RawDX11Scene.OnBuildUI
nameWithType: RawDX11Scene.OnBuildUI
+- uid: ImGuiScene.RawDX11Scene.OnNewInputFrame
+ name: OnNewInputFrame
+ href: api/ImGuiScene.RawDX11Scene.html#ImGuiScene_RawDX11Scene_OnNewInputFrame
+ commentId: F:ImGuiScene.RawDX11Scene.OnNewInputFrame
+ fullName: ImGuiScene.RawDX11Scene.OnNewInputFrame
+ nameWithType: RawDX11Scene.OnNewInputFrame
+- uid: ImGuiScene.RawDX11Scene.OnNewRenderFrame
+ name: OnNewRenderFrame
+ href: api/ImGuiScene.RawDX11Scene.html#ImGuiScene_RawDX11Scene_OnNewRenderFrame
+ commentId: F:ImGuiScene.RawDX11Scene.OnNewRenderFrame
+ fullName: ImGuiScene.RawDX11Scene.OnNewRenderFrame
+ nameWithType: RawDX11Scene.OnNewRenderFrame
- uid: ImGuiScene.RawDX11Scene.OnPostResize(System.Int32,System.Int32)
name: OnPostResize(Int32, Int32)
href: api/ImGuiScene.RawDX11Scene.html#ImGuiScene_RawDX11Scene_OnPostResize_System_Int32_System_Int32_
From 4d6f7762e664cac218a3221cbdfeb5057d6e4d63 Mon Sep 17 00:00:00 2001
From: goat
Date: Tue, 31 Mar 2020 23:43:15 +0900
Subject: [PATCH 03/12] fix: create all .disabled files for previous versions,
just to be safe
---
Dalamud/Plugin/PluginRepository.cs | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/Dalamud/Plugin/PluginRepository.cs b/Dalamud/Plugin/PluginRepository.cs
index 0f386b1d1..af8ff3326 100644
--- a/Dalamud/Plugin/PluginRepository.cs
+++ b/Dalamud/Plugin/PluginRepository.cs
@@ -142,11 +142,6 @@ namespace Dalamud.Plugin
// DisablePlugin() below immediately creates a .disabled file anyway, but will fail
// with an exception if we try to do it twice in row like this
- // TODO: not sure if doing this for all versions is really necessary, since the
- // others really needed to be disabled before anyway
- //foreach (var sortedVersion in sortedVersions) {
- // File.Create(Path.Combine(sortedVersion.FullName, ".disabled"));
- //}
if (!dryRun)
{
@@ -161,6 +156,18 @@ namespace Dalamud.Plugin
hasError = true;
}
+ try {
+ // Just to be safe
+ foreach (var sortedVersion in sortedVersions)
+ {
+ var disabledFile = new FileInfo(Path.Combine(sortedVersion.FullName, ".disabled"));
+ if (!disabledFile.Exists)
+ disabledFile.Create();
+ }
+ } catch (Exception ex) {
+ Log.Error(ex, "Plugin disable failed");
+ }
+
var installSuccess = InstallPlugin(remoteInfo);
if (installSuccess)
From e02bca714ff2eb4ddb403c06d0b7f36c1eedd61a Mon Sep 17 00:00:00 2001
From: goat
Date: Wed, 1 Apr 2020 01:53:02 +0900
Subject: [PATCH 04/12] fix: some kind of mitigation for actortable crashes
---
Dalamud/Game/ClientState/Actors/ActorTable.cs | 28 +++++++++++++------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/Dalamud/Game/ClientState/Actors/ActorTable.cs b/Dalamud/Game/ClientState/Actors/ActorTable.cs
index 81cf2a31f..18205fb15 100644
--- a/Dalamud/Game/ClientState/Actors/ActorTable.cs
+++ b/Dalamud/Game/ClientState/Actors/ActorTable.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections;
+using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices;
+using System.Security;
using System.Windows.Forms;
using Dalamud.Game.ClientState.Actors.Types;
using Dalamud.Game.ClientState.Actors.Types.NonPlayer;
@@ -56,30 +58,35 @@ namespace Dalamud.Game.ClientState.Actors {
///
/// Spawn index.
/// at the specified spawn index.
- public Actor this[int index] {
- get {
+ public Actor this[int index] => At(index);
+
+ [HandleProcessCorruptedStateExceptions]
+ [SecurityCritical]
+ private Actor At(int index) {
+ try {
if (!this.isReady)
return null;
- if (this.someActorTableAccessHook != null) {
+ if (this.someActorTableAccessHook != null)
+ {
this.someActorTableAccessHook.Dispose();
this.someActorTableAccessHook = null;
}
if (index > Length)
return null;
-
- //Log.Information("Trying to get actor at {0}", index);
+
var tblIndex = this.realActorTablePtr + 8 + index * 8;
var offset = Marshal.ReadIntPtr(tblIndex);
- //Log.Information("Actor at {0}", offset.ToString());
+ Log.Information("Actor at {0} for {1}", offset.ToInt64().ToString("X"), index);
if (offset == IntPtr.Zero)
return null;
- try {
+ try
+ {
var actorStruct = Marshal.PtrToStructure(offset);
//Log.Debug("ActorTable[{0}]: {1} - {2} - {3}", index, tblIndex.ToString("X"), offset.ToString("X"),
@@ -91,9 +98,14 @@ namespace Dalamud.Game.ClientState.Actors {
case ObjectKind.BattleNpc: return new BattleNpc(actorStruct, this.dalamud);
default: return new Actor(actorStruct, this.dalamud);
}
- } catch (AccessViolationException) {
+ }
+ catch (AccessViolationException)
+ {
return null;
}
+ } catch (Exception e) {
+ Log.Error(e, "Could not get Actor.");
+ return null;
}
}
From 0dd46c50aeb496b88934c7541c17fec15d05a465 Mon Sep 17 00:00:00 2001
From: goat
Date: Wed, 1 Apr 2020 01:53:22 +0900
Subject: [PATCH 05/12] feat: show if plugins are installed in header
---
Dalamud/Plugin/PluginInstallerWindow.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Dalamud/Plugin/PluginInstallerWindow.cs b/Dalamud/Plugin/PluginInstallerWindow.cs
index 7931345ee..0c4d7474e 100644
--- a/Dalamud/Plugin/PluginInstallerWindow.cs
+++ b/Dalamud/Plugin/PluginInstallerWindow.cs
@@ -77,7 +77,10 @@ namespace Dalamud.Plugin
ImGui.PushID(pluginDefinition.InternalName + pluginDefinition.AssemblyVersion);
- if (ImGui.CollapsingHeader(pluginDefinition.Name)) {
+ var isInstalled = this.manager.Plugins.Where(x => x.Definition != null).Any(
+ x => x.Definition.InternalName == pluginDefinition.InternalName);
+
+ if (ImGui.CollapsingHeader(pluginDefinition.Name + (isInstalled ? " (installed)" : string.Empty))) {
ImGui.Indent();
ImGui.Text(pluginDefinition.Name);
@@ -86,9 +89,6 @@ namespace Dalamud.Plugin
ImGui.Text(pluginDefinition.Description);
- var isInstalled = this.manager.Plugins.Where(x => x.Definition != null).Any(
- x => x.Definition.InternalName == pluginDefinition.InternalName);
-
if (!isInstalled) {
if (this.installStatus == PluginInstallStatus.InProgress) {
ImGui.Button("Install in progress...");
From 5927692494918a62743bb6b75f28b142194d0c54 Mon Sep 17 00:00:00 2001
From: goat
Date: Wed, 1 Apr 2020 01:54:52 +0900
Subject: [PATCH 06/12] build: v4.8.0.0
---
Dalamud.Injector/Dalamud.Injector.csproj | 6 +++---
Dalamud/Dalamud.csproj | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/Dalamud.Injector/Dalamud.Injector.csproj b/Dalamud.Injector/Dalamud.Injector.csproj
index 514b9681d..40a9f6d19 100644
--- a/Dalamud.Injector/Dalamud.Injector.csproj
+++ b/Dalamud.Injector/Dalamud.Injector.csproj
@@ -14,10 +14,10 @@
true
- 4.7.22.0
- 4.7.22.0
+ 4.8.0.0
+ 4.8.0.0
XIVLauncher addon injection
- 4.7.22.0
+ 4.8.0.0
diff --git a/Dalamud/Dalamud.csproj b/Dalamud/Dalamud.csproj
index e4466d4d5..376b8a8d3 100644
--- a/Dalamud/Dalamud.csproj
+++ b/Dalamud/Dalamud.csproj
@@ -14,9 +14,9 @@
true
- 4.7.22.0
- 4.7.22.0
- 4.7.22.0
+ 4.8.0.0
+ 4.8.0
+ 4.8.0.0
From 0282d4127e7902d4d45496b53607a5be351f2460 Mon Sep 17 00:00:00 2001
From: karashiiro <49822414+karashiiro@users.noreply.github.com>
Date: Tue, 31 Mar 2020 12:46:07 -0700
Subject: [PATCH 07/12] chore: set log level of actor index message to verbose
---
Dalamud/Game/ClientState/Actors/ActorTable.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dalamud/Game/ClientState/Actors/ActorTable.cs b/Dalamud/Game/ClientState/Actors/ActorTable.cs
index 18205fb15..407ce7132 100644
--- a/Dalamud/Game/ClientState/Actors/ActorTable.cs
+++ b/Dalamud/Game/ClientState/Actors/ActorTable.cs
@@ -80,7 +80,7 @@ namespace Dalamud.Game.ClientState.Actors {
var offset = Marshal.ReadIntPtr(tblIndex);
- Log.Information("Actor at {0} for {1}", offset.ToInt64().ToString("X"), index);
+ Log.Verbose("Actor at {0} for {1}", offset.ToInt64().ToString("X"), index);
if (offset == IntPtr.Zero)
return null;
From c45492ae8da71e8f3fa72e2cebcd475e06538b0c Mon Sep 17 00:00:00 2001
From: goaaats <16760685+goaaats@users.noreply.github.com>
Date: Wed, 1 Apr 2020 05:51:58 +0900
Subject: [PATCH 08/12] ci: build on pr
---
.github/workflows/main.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index f36c27185..3a24e747e 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1,5 +1,5 @@
name: Build Dalamud
-on: [push]
+on: [push, pull_request]
jobs:
build:
From 218bad90b1ee44e23486a99d142c96aaf8e3a19c Mon Sep 17 00:00:00 2001
From: meli <57847713+ff-meli@users.noreply.github.com>
Date: Tue, 31 Mar 2020 14:34:19 -0700
Subject: [PATCH 09/12] temporary workaround for actor table crash on logout;
switch reading memory to use ReadProcessMemory, and just return null if it
fails. Ugly but functional until we find a better way
---
Dalamud/Game/ClientState/Actors/ActorTable.cs | 49 +++++++++++++------
1 file changed, 35 insertions(+), 14 deletions(-)
diff --git a/Dalamud/Game/ClientState/Actors/ActorTable.cs b/Dalamud/Game/ClientState/Actors/ActorTable.cs
index 81cf2a31f..061f1b63b 100644
--- a/Dalamud/Game/ClientState/Actors/ActorTable.cs
+++ b/Dalamud/Game/ClientState/Actors/ActorTable.cs
@@ -1,5 +1,7 @@
using System;
using System.Collections;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Dalamud.Game.ClientState.Actors.Types;
@@ -12,6 +14,17 @@ namespace Dalamud.Game.ClientState.Actors {
/// This collection represents the currently spawned FFXIV actors.
///
public class ActorTable : ICollection, IDisposable {
+
+ #region temporary imports for crash workaround
+ [DllImport("kernel32.dll", SetLastError = true)]
+ static extern bool ReadProcessMemory(
+ IntPtr hProcess,
+ IntPtr lpBaseAddress,
+ IntPtr lpBuffer,
+ int dwSize,
+ out IntPtr lpNumberOfBytesRead);
+ #endregion
+
private ClientStateAddressResolver Address { get; }
private Dalamud dalamud;
@@ -43,6 +56,8 @@ namespace Dalamud.Game.ClientState.Actors {
public void Dispose() {
if (!this.isReady)
this.someActorTableAccessHook.Dispose();
+
+ this.isReady = false;
}
private IntPtr SomeActorTableAccessDetour(IntPtr manager, IntPtr offset) {
@@ -66,7 +81,7 @@ namespace Dalamud.Game.ClientState.Actors {
this.someActorTableAccessHook = null;
}
- if (index > Length)
+ if (index >= Length)
return null;
//Log.Information("Trying to get actor at {0}", index);
@@ -79,21 +94,27 @@ namespace Dalamud.Game.ClientState.Actors {
if (offset == IntPtr.Zero)
return null;
- try {
- var actorStruct = Marshal.PtrToStructure(offset);
-
- //Log.Debug("ActorTable[{0}]: {1} - {2} - {3}", index, tblIndex.ToString("X"), offset.ToString("X"),
- // actorStruct.ObjectKind.ToString());
-
- switch (actorStruct.ObjectKind)
- {
- case ObjectKind.Player: return new PlayerCharacter(actorStruct, this.dalamud);
- case ObjectKind.BattleNpc: return new BattleNpc(actorStruct, this.dalamud);
- default: return new Actor(actorStruct, this.dalamud);
- }
- } catch (AccessViolationException) {
+ // 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 _))
+ {
+ Log.Debug("ActorTable - ReadProcessMemory failed: likely player deletion during logout");
return null;
}
+
+ var actorStruct = Marshal.PtrToStructure(actorMem);
+ Marshal.FreeHGlobal(actorMem);
+
+ //Log.Debug("ActorTable[{0}]: {1} - {2} - {3}", index, tblIndex.ToString("X"), offset.ToString("X"),
+ // actorStruct.ObjectKind.ToString());
+
+ switch (actorStruct.ObjectKind)
+ {
+ case ObjectKind.Player: return new PlayerCharacter(actorStruct, this.dalamud);
+ case ObjectKind.BattleNpc: return new BattleNpc(actorStruct, this.dalamud);
+ default: return new Actor(actorStruct, this.dalamud);
+ }
}
}
From 1e00a33577dec6953eafd87d74e99ff61b777aa8 Mon Sep 17 00:00:00 2001
From: goat
Date: Wed, 1 Apr 2020 15:19:29 +0900
Subject: [PATCH 10/12] build: v4.8.1.0
---
Dalamud.Injector/Dalamud.Injector.csproj | 6 +++---
Dalamud/Dalamud.csproj | 6 +++---
Dalamud/Game/ClientState/Actors/ActorTable.cs | 2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/Dalamud.Injector/Dalamud.Injector.csproj b/Dalamud.Injector/Dalamud.Injector.csproj
index 40a9f6d19..e0844bcd2 100644
--- a/Dalamud.Injector/Dalamud.Injector.csproj
+++ b/Dalamud.Injector/Dalamud.Injector.csproj
@@ -14,10 +14,10 @@
true
- 4.8.0.0
- 4.8.0.0
+ 4.8.1.0
+ 4.8.1.0
XIVLauncher addon injection
- 4.8.0.0
+ 4.8.1.0
diff --git a/Dalamud/Dalamud.csproj b/Dalamud/Dalamud.csproj
index 376b8a8d3..a5f910449 100644
--- a/Dalamud/Dalamud.csproj
+++ b/Dalamud/Dalamud.csproj
@@ -14,9 +14,9 @@
true
- 4.8.0.0
- 4.8.0
- 4.8.0.0
+ 4.8.1.0
+ 4.8.1
+ 4.8.1.0
diff --git a/Dalamud/Game/ClientState/Actors/ActorTable.cs b/Dalamud/Game/ClientState/Actors/ActorTable.cs
index 65b874a00..e11374fb9 100644
--- a/Dalamud/Game/ClientState/Actors/ActorTable.cs
+++ b/Dalamud/Game/ClientState/Actors/ActorTable.cs
@@ -87,7 +87,7 @@ namespace Dalamud.Game.ClientState.Actors {
var offset = Marshal.ReadIntPtr(tblIndex);
- Log.Verbose("Actor at {0} for {1}", offset.ToInt64().ToString("X"), index);
+ //Log.Verbose("Actor at {0} for {1}", offset.ToInt64().ToString("X"), index);
if (offset == IntPtr.Zero)
return null;
From 6b2c531eed44dc112bda68d92dc94584bad15dbb Mon Sep 17 00:00:00 2001
From: goat
Date: Thu, 2 Apr 2020 19:59:51 +0900
Subject: [PATCH 11/12] feat: add HoveredItem data to
Dalamud.Game.Internal.Gui.GameGui
---
Dalamud/Game/Internal/Gui/GameGui.cs | 41 ++++++++++++++++++-
.../Internal/Gui/GameGuiAddressResolver.cs | 3 +-
2 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/Dalamud/Game/Internal/Gui/GameGui.cs b/Dalamud/Game/Internal/Gui/GameGui.cs
index 370341300..6444c0374 100644
--- a/Dalamud/Game/Internal/Gui/GameGui.cs
+++ b/Dalamud/Game/Internal/Gui/GameGui.cs
@@ -12,9 +12,23 @@ namespace Dalamud.Game.Internal.Gui {
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
private delegate IntPtr SetGlobalBgmDelegate(UInt16 bgmKey, byte a2, UInt32 a3, UInt32 a4, UInt32 a5, byte a6);
-
private readonly Hook setGlobalBgmHook;
+ [UnmanagedFunctionPointer(CallingConvention.ThisCall)]
+ private delegate IntPtr HandleItemHoverDelegate(IntPtr hoverState, IntPtr a2, IntPtr a3, ulong a4);
+ private readonly Hook handleItemHoverHook;
+
+ ///
+ /// The item ID that is currently hovered by the player. 0 when no item is hovered.
+ /// If > 1.000.000, subtract 1.000.000 and treat it as HQ
+ ///
+ public ulong HoveredItem { get; set; }
+
+ ///
+ /// Event that is fired when the currently hovered item changes.
+ ///
+ public EventHandler HoveredItemChanged { get; set; }
+
public GameGui(IntPtr baseAddress, SigScanner scanner, Dalamud dalamud) {
Address = new GameGuiAddressResolver(baseAddress);
Address.Setup(scanner);
@@ -23,6 +37,7 @@ namespace Dalamud.Game.Internal.Gui {
Log.Verbose("GameGuiManager address {Address}", Address.BaseAddress);
Log.Verbose("SetGlobalBgm address {Address}", Address.SetGlobalBgm);
+ Log.Verbose("HandleItemHover address {Address}", Address.HandleItemHover);
Chat = new ChatGui(Address.ChatManager, scanner, dalamud);
@@ -30,6 +45,10 @@ namespace Dalamud.Game.Internal.Gui {
new Hook(Address.SetGlobalBgm,
new SetGlobalBgmDelegate(HandleSetGlobalBgmDetour),
this);
+ this.handleItemHoverHook =
+ new Hook(Address.HandleItemHover,
+ new HandleItemHoverDelegate(HandleItemHoverDetour),
+ this);
}
private IntPtr HandleSetGlobalBgmDetour(UInt16 bgmKey, byte a2, UInt32 a3, UInt32 a4, UInt32 a5, byte a6) {
@@ -40,16 +59,36 @@ namespace Dalamud.Game.Internal.Gui {
return retVal;
}
+ private IntPtr HandleItemHoverDetour(IntPtr hoverState, IntPtr a2, IntPtr a3, ulong a4) {
+ var retVal = this.handleItemHoverHook.Original(hoverState, a2, a3, a4);
+
+ if (retVal.ToInt64() == 22) {
+ var itemId = (ulong)Marshal.ReadInt32(hoverState, 0x130);
+
+ try {
+ HoveredItemChanged?.Invoke(this, itemId);
+ } catch (Exception e) {
+ Log.Error(e, "Could not dispatch HoveredItemChanged event.");
+ }
+
+ Log.Verbose("HoverItemId: {0}", itemId);
+ }
+
+ return retVal;
+ }
+
public void SetBgm(ushort bgmKey) => this.setGlobalBgmHook.Original(bgmKey, 0, 0, 0, 0, 0);
public void Enable() {
Chat.Enable();
this.setGlobalBgmHook.Enable();
+ this.handleItemHoverHook.Enable();
}
public void Dispose() {
Chat.Dispose();
this.setGlobalBgmHook.Dispose();
+ this.handleItemHoverHook.Dispose();
}
}
}
diff --git a/Dalamud/Game/Internal/Gui/GameGuiAddressResolver.cs b/Dalamud/Game/Internal/Gui/GameGuiAddressResolver.cs
index c0127e8d4..091543c56 100644
--- a/Dalamud/Game/Internal/Gui/GameGuiAddressResolver.cs
+++ b/Dalamud/Game/Internal/Gui/GameGuiAddressResolver.cs
@@ -9,6 +9,7 @@ namespace Dalamud.Game.Internal.Gui {
public IntPtr ChatManager { get; private set; }
public IntPtr SetGlobalBgm { get; private set; }
+ public IntPtr HandleItemHover { get; set; }
public GameGuiAddressResolver(IntPtr baseAddress) {
BaseAddress = baseAddress;
@@ -24,8 +25,8 @@ namespace Dalamud.Game.Internal.Gui {
}
protected override void Setup64Bit(SigScanner sig) {
- //SetGlobalBgm = sig.ScanText("4C 8B 15 ?? ?? ?? ?? 4D 85 D2 74 58 41 83 7A ?? ?? 76 51 4D 8B 92 ?? ?? ?? ?? 0F B6 44 24 ?? 49 81 C2 ?? ?? ?? ?? 66 41 89 4A ?? 33 C9 41 88 52 30 41 89 4A 14 66 41 89 4A ?? 41 88 42 12 49 89 4A 38 41 89 4A 40 49 89 4A 48 41 38 4A 30 74 14 8B 44 24 28 41 89 42 40 45 89 42 38");
SetGlobalBgm = sig.ScanText("4C 8B 15 ?? ?? ?? ?? 4D 85 D2 74 58");
+ HandleItemHover = sig.ScanText("E8 ?? ?? ?? ?? 48 8B 5C 24 ?? 48 89 AE ?? ?? ?? ??");
}
}
}
From 19de5a475c8260dd721288a889a493a55cc8301f Mon Sep 17 00:00:00 2001
From: Florian Maunier
Date: Thu, 2 Apr 2020 23:22:45 +0200
Subject: [PATCH 12/12] Add fixed Item sheet for GetExcelSheet
---
Dalamud/Data/TransientSheet/Item.cs | 481 ++++++++++++++++++++++++++++
1 file changed, 481 insertions(+)
create mode 100644 Dalamud/Data/TransientSheet/Item.cs
diff --git a/Dalamud/Data/TransientSheet/Item.cs b/Dalamud/Data/TransientSheet/Item.cs
new file mode 100644
index 000000000..2b6018042
--- /dev/null
+++ b/Dalamud/Data/TransientSheet/Item.cs
@@ -0,0 +1,481 @@
+using System;
+using Lumina.Data.Structs.Excel;
+using Lumina.Excel;
+
+namespace Dalamud.Data.TransientSheet
+{
+ [Sheet("Item", columnHash: 0x9f2e970b)]
+ public class Item : IExcelRow
+ {
+ // column defs from Mon, 24 Feb 2020 17:34:06 GMT
+
+
+ // col: 00 offset: 0000
+ public string Singular;
+
+ // col: 02 offset: 0004
+ public string Plural;
+
+ // col: 08 offset: 0008
+ public string Description;
+
+ // col: 09 offset: 000c
+ public string Name;
+
+ // col: 01 offset: 0010
+ public sbyte Adjective;
+
+ // col: 03 offset: 0011
+ public sbyte PossessivePronoun;
+
+ // col: 04 offset: 0012
+ public sbyte StartsWithVowel;
+
+ // col: 05 offset: 0013
+ public sbyte unknown13;
+
+ // col: 06 offset: 0014
+ public sbyte Pronoun;
+
+ // col: 07 offset: 0015
+ public sbyte Article;
+
+ // col: 47 offset: 0018
+ public ulong ModelMain;
+
+ // col: 48 offset: 0020
+ public ulong ModelSub;
+
+ // col: 51 offset: 0028
+ public ushort DamagePhys;
+
+ // col: 52 offset: 002a
+ public ushort DamageMag;
+
+ // col: 53 offset: 002c
+ public ushort Delayms;
+
+ // col: 55 offset: 002e
+ public ushort BlockRate;
+
+ // col: 56 offset: 0030
+ public ushort Block;
+
+ // col: 57 offset: 0032
+ public ushort DefensePhys;
+
+ // col: 58 offset: 0034
+ public ushort DefenseMag;
+
+ // col: 66 offset: 003c
+ public short unknown3c;
+
+ // col: 68 offset: 003e
+ public short unknown3e;
+
+ // col: 70 offset: 0040
+ public short unknown40;
+
+ // col: 80 offset: 0048
+ public short unknown48;
+
+ // col: 82 offset: 004a
+ public short unknown4a;
+
+ // col: 84 offset: 004c
+ public short unknown4c;
+
+ // col: 40 offset: 004e
+ public byte LevelEquip;
+
+ // col: 41 offset: 004f
+ public byte unknown4f;
+
+ // col: 42 offset: 0050
+ public byte EquipRestriction;
+
+ // col: 43 offset: 0051
+ public byte ClassJobCategory;
+
+ // col: 44 offset: 0052
+ public byte GrandCompany;
+
+ // col: 45 offset: 0053
+ public byte ItemSeries;
+
+ // col: 46 offset: 0054
+ public byte BaseParamModifier;
+
+ // col: 49 offset: 0055
+ public byte ClassJobUse;
+
+ // col: 50 offset: 0056
+ public byte unknown56;
+
+ // col: 54 offset: 0057
+ public byte unknown57;
+
+ // col: 59 offset: 0058
+ public short[] unknown58;
+
+ // col: 65 offset: 005b
+ public byte unknown5b;
+
+ // col: 67 offset: 005c
+ public byte unknown5c;
+
+ // col: 69 offset: 005d
+ public byte unknown5d;
+
+ // col: 71 offset: 005e
+ public byte ItemSpecialBonus;
+
+ // col: 72 offset: 005f
+ public byte ItemSpecialBonusParam;
+
+ // col: 73 offset: 0060
+ public short[] unknown60;
+
+ // col: 79 offset: 0063
+ public byte unknown63;
+
+ // col: 81 offset: 0064
+ public byte unknown64;
+
+ // col: 83 offset: 0065
+ public byte unknown65;
+
+ // col: 85 offset: 0066
+ public byte MaterializeType;
+
+ // col: 86 offset: 0067
+ public byte MateriaSlotCount;
+
+ // col: 89 offset: 0068
+ public byte unknown68;
+
+ // col: 87 offset: 0069
+ private byte packed69;
+ public bool IsAdvancedMeldingPermitted => (packed69 & 0x1) == 0x1;
+ public bool IsPvP => (packed69 & 0x2) == 0x2;
+ public bool IsGlamourous => (packed69 & 0x4) == 0x4;
+
+ // col: 14 offset: 0070
+ public uint AdditionalData;
+
+ // col: 19 offset: 0074
+ public uint StackSize;
+
+ // col: 24 offset: 0078
+ public uint PriceMid;
+
+ // col: 25 offset: 007c
+ public uint PriceLow;
+
+ // col: 33 offset: 0080
+ public int ItemRepair;
+
+ // col: 34 offset: 0084
+ public int ItemGlamour;
+
+ // col: 10 offset: 0088
+ public ushort Icon;
+
+ // col: 11 offset: 008a
+ public ushort LevelItem;
+
+ // col: 18 offset: 008c
+ public ushort unknown8c;
+
+ // col: 29 offset: 008e
+ public ushort ItemAction;
+
+ // col: 31 offset: 0090
+ public ushort Cooldowns;
+
+ // col: 35 offset: 0092
+ public ushort Salvage;
+
+ // col: 36 offset: 0094
+ public ushort unknown94;
+
+ // col: 39 offset: 0096
+ public ushort AetherialReduce;
+
+ // col: 12 offset: 0098
+ public byte Rarity;
+
+ // col: 13 offset: 0099
+ public byte FilterGroup;
+
+ // col: 15 offset: 009a
+ public byte ItemUICategory;
+
+ // col: 16 offset: 009b
+ public byte ItemSearchCategory;
+
+ // col: 17 offset: 009c
+ public byte EquipSlotCategory;
+
+ // col: 30 offset: 009d
+ public byte unknown9d;
+
+ // col: 32 offset: 009e
+ public byte ClassJobRepair;
+
+ // col: 20 offset: 009f
+ private byte packed9f;
+ public bool IsUnique => (packed9f & 0x1) == 0x1;
+ public bool IsUntradable => (packed9f & 0x2) == 0x2;
+ public bool IsIndisposable => (packed9f & 0x4) == 0x4;
+ public bool Lot => (packed9f & 0x8) == 0x8;
+ public bool CanBeHq => (packed9f & 0x10) == 0x10;
+ public bool IsDyeable => (packed9f & 0x20) == 0x20;
+ public bool IsCrestWorthy => (packed9f & 0x40) == 0x40;
+ public bool IsCollectable => (packed9f & 0x80) == 0x80;
+
+ // col: 38 offset: 00a0
+ private byte packeda0;
+ public bool AlwaysCollectable => (packeda0 & 0x1) == 0x1;
+
+
+ public int RowId { get; set; }
+ public int SubRowId { get; set; }
+
+ public void PopulateData(RowParser parser, global::Lumina.Lumina lumina)
+ {
+ RowId = parser.Row;
+ SubRowId = parser.SubRow;
+
+ // col: 0 offset: 0000
+ Singular = parser.ReadOffset(0x0);
+
+ // col: 2 offset: 0004
+ Plural = parser.ReadOffset(0x4);
+
+ // col: 8 offset: 0008
+ Description = parser.ReadOffset(0x8);
+
+ // col: 9 offset: 000c
+ Name = parser.ReadOffset(0xc);
+
+ // col: 1 offset: 0010
+ Adjective = parser.ReadOffset(0x10);
+
+ // col: 3 offset: 0011
+ PossessivePronoun = parser.ReadOffset(0x11);
+
+ // col: 4 offset: 0012
+ StartsWithVowel = parser.ReadOffset(0x12);
+
+ // col: 5 offset: 0013
+ unknown13 = parser.ReadOffset(0x13);
+
+ // col: 6 offset: 0014
+ Pronoun = parser.ReadOffset(0x14);
+
+ // col: 7 offset: 0015
+ Article = parser.ReadOffset(0x15);
+
+ // col: 47 offset: 0018
+ ModelMain = parser.ReadOffset(0x18);
+
+ // col: 48 offset: 0020
+ ModelSub = parser.ReadOffset(0x20);
+
+ // col: 51 offset: 0028
+ DamagePhys = parser.ReadOffset(0x28);
+
+ // col: 52 offset: 002a
+ DamageMag = parser.ReadOffset(0x2a);
+
+ // col: 53 offset: 002c
+ Delayms = parser.ReadOffset(0x2c);
+
+ // col: 55 offset: 002e
+ BlockRate = parser.ReadOffset(0x2e);
+
+ // col: 56 offset: 0030
+ Block = parser.ReadOffset(0x30);
+
+ // col: 57 offset: 0032
+ DefensePhys = parser.ReadOffset(0x32);
+
+ // col: 58 offset: 0034
+ DefenseMag = parser.ReadOffset(0x34);
+
+ // col: 66 offset: 003c
+ unknown3c = parser.ReadOffset(0x3c);
+
+ // col: 68 offset: 003e
+ unknown3e = parser.ReadOffset(0x3e);
+
+ // col: 70 offset: 0040
+ unknown40 = parser.ReadOffset(0x40);
+
+ // col: 80 offset: 0048
+ unknown48 = parser.ReadOffset(0x48);
+
+ // col: 82 offset: 004a
+ unknown4a = parser.ReadOffset(0x4a);
+
+ // col: 84 offset: 004c
+ unknown4c = parser.ReadOffset(0x4c);
+
+ // col: 40 offset: 004e
+ LevelEquip = parser.ReadOffset(0x4e);
+
+ // col: 41 offset: 004f
+ unknown4f = parser.ReadOffset(0x4f);
+
+ // col: 42 offset: 0050
+ EquipRestriction = parser.ReadOffset(0x50);
+
+ // col: 43 offset: 0051
+ ClassJobCategory = parser.ReadOffset(0x51);
+
+ // col: 44 offset: 0052
+ GrandCompany = parser.ReadOffset(0x52);
+
+ // col: 45 offset: 0053
+ ItemSeries = parser.ReadOffset(0x53);
+
+ // col: 46 offset: 0054
+ BaseParamModifier = parser.ReadOffset(0x54);
+
+ // col: 49 offset: 0055
+ ClassJobUse = parser.ReadOffset(0x55);
+
+ // col: 50 offset: 0056
+ unknown56 = parser.ReadOffset(0x56);
+
+ // col: 54 offset: 0057
+ unknown57 = parser.ReadOffset(0x57);
+
+ // col: 59 offset: 0058
+ unknown58 = new short[6];
+ unknown58[0] = parser.ReadOffset(0x58);
+ unknown58[1] = parser.ReadOffset(0x36);
+ unknown58[2] = parser.ReadOffset(0x59);
+ unknown58[3] = parser.ReadOffset(0x38);
+ unknown58[4] = parser.ReadOffset(0x5a);
+ unknown58[5] = parser.ReadOffset(0x3a);
+
+ // col: 65 offset: 005b
+ unknown5b = parser.ReadOffset(0x5b);
+
+ // col: 67 offset: 005c
+ unknown5c = parser.ReadOffset(0x5c);
+
+ // col: 69 offset: 005d
+ unknown5d = parser.ReadOffset(0x5d);
+
+ // col: 71 offset: 005e
+ ItemSpecialBonus = parser.ReadOffset(0x5e);
+
+ // col: 72 offset: 005f
+ ItemSpecialBonusParam = parser.ReadOffset(0x5f);
+
+ // col: 73 offset: 0060
+ unknown60 = new short[6];
+ unknown60[0] = parser.ReadOffset(0x60);
+ unknown60[1] = parser.ReadOffset(0x42);
+ unknown60[2] = parser.ReadOffset(0x61);
+ unknown60[3] = parser.ReadOffset(0x44);
+ unknown60[4] = parser.ReadOffset(0x62);
+ unknown60[5] = parser.ReadOffset(0x46);
+
+ // col: 79 offset: 0063
+ unknown63 = parser.ReadOffset(0x63);
+
+ // col: 81 offset: 0064
+ unknown64 = parser.ReadOffset(0x64);
+
+ // col: 83 offset: 0065
+ unknown65 = parser.ReadOffset(0x65);
+
+ // col: 85 offset: 0066
+ MaterializeType = parser.ReadOffset(0x66);
+
+ // col: 86 offset: 0067
+ MateriaSlotCount = parser.ReadOffset(0x67);
+
+ // col: 89 offset: 0068
+ unknown68 = parser.ReadOffset(0x68);
+
+ // col: 87 offset: 0069
+ packed69 = parser.ReadOffset(0x69, ExcelColumnDataType.UInt8);
+
+ // col: 14 offset: 0070
+ AdditionalData = parser.ReadOffset(0x70);
+
+ // col: 19 offset: 0074
+ StackSize = parser.ReadOffset(0x74);
+
+ // col: 24 offset: 0078
+ PriceMid = parser.ReadOffset(0x78);
+
+ // col: 25 offset: 007c
+ PriceLow = parser.ReadOffset(0x7c);
+
+ // col: 33 offset: 0080
+ ItemRepair = parser.ReadOffset(0x80);
+
+ // col: 34 offset: 0084
+ ItemGlamour = parser.ReadOffset(0x84);
+
+ // col: 10 offset: 0088
+ Icon = parser.ReadOffset(0x88);
+
+ // col: 11 offset: 008a
+ LevelItem = parser.ReadOffset(0x8a);
+
+ // col: 18 offset: 008c
+ unknown8c = parser.ReadOffset(0x8c);
+
+ // col: 29 offset: 008e
+ ItemAction = parser.ReadOffset(0x8e);
+
+ // col: 31 offset: 0090
+ Cooldowns = parser.ReadOffset(0x90);
+
+ // col: 35 offset: 0092
+ Salvage = parser.ReadOffset(0x92);
+
+ // col: 36 offset: 0094
+ unknown94 = parser.ReadOffset(0x94);
+
+ // col: 39 offset: 0096
+ AetherialReduce = parser.ReadOffset(0x96);
+
+ // col: 12 offset: 0098
+ Rarity = parser.ReadOffset(0x98);
+
+ // col: 13 offset: 0099
+ FilterGroup = parser.ReadOffset(0x99);
+
+ // col: 15 offset: 009a
+ ItemUICategory = parser.ReadOffset(0x9a);
+
+ // col: 16 offset: 009b
+ ItemSearchCategory = parser.ReadOffset(0x9b);
+
+ // col: 17 offset: 009c
+ EquipSlotCategory = parser.ReadOffset(0x9c);
+
+ // col: 30 offset: 009d
+ unknown9d = parser.ReadOffset(0x9d);
+
+ // col: 32 offset: 009e
+ ClassJobRepair = parser.ReadOffset(0x9e);
+
+ // col: 20 offset: 009f
+ packed9f = parser.ReadOffset(0x9f, ExcelColumnDataType.UInt8);
+
+ // col: 38 offset: 00a0
+ packeda0 = parser.ReadOffset(0xa0, ExcelColumnDataType.UInt8);
+
+
+ }
+ }
+}