7 Commits

Author SHA1 Message Date
cedd0ceb26 1.7.1.5
Some checks failed
Build and Update Repo / build-and-update-repo (push) Failing after 1m44s
2025-12-18 17:14:39 +00:00
374fc03ce9 Update workflow
API14
2025-12-18 17:01:42 +00:00
75f88d5104 Potential fix for Honorific throwing away data. Still testing efficacy.
All checks were successful
Build and Update Repo / build-and-update-repo (push) Successful in 1m13s
2025-09-24 20:37:12 +01:00
51004f3017 Update syncshell chat.
All checks were successful
Build and Update Repo / build-and-update-repo (push) Successful in 1m12s
Update /ss to /ps
Remove whitespaces from sending in syncshell chat.
2025-09-21 17:39:40 +01:00
60c1668492 1.7.1.2
All checks were successful
Build and Update Repo / build-and-update-repo (push) Successful in 1m9s
2025-09-14 01:09:29 +01:00
4f07dba409 Update check for other clients to correctly find Snowcloak. 2025-09-12 19:42:13 +01:00
003fc77628 Update workflows. 2025-09-12 19:41:41 +01:00
13 changed files with 97 additions and 50 deletions

View File

@@ -1,4 +1,4 @@
name: Release name: Build and Update Repo
on: on:
push: push:
@@ -7,10 +7,10 @@ on:
env: env:
PLUGIN_NAME: ClubPenguinSync PLUGIN_NAME: ClubPenguinSync
DOTNET_VERSION: 9.x DOTNET_VERSION: 10.x
jobs: jobs:
tag-and-release: build-and-update-repo:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write contents: write
@@ -22,10 +22,10 @@ jobs:
fetch-depth: 0 fetch-depth: 0
submodules: true submodules: true
- name: Setup .NET 9 SDK - name: Setup .NET 10 SDK
uses: actions/setup-dotnet@v4 uses: actions/setup-dotnet@v4
with: with:
dotnet-version: 9.x dotnet-version: 10.x
- name: Download Dalamud - name: Download Dalamud
run: | run: |
@@ -79,7 +79,9 @@ jobs:
if .InternalName == $internalName if .InternalName == $internalName
then then
.DalamudApiLevel = $dalamudApiLevel .DalamudApiLevel = $dalamudApiLevel
| .TestingDalamudApiLevel = $dalamudApiLevel
| .AssemblyVersion = $version | .AssemblyVersion = $version
| .TestingAssemblyVersion = $version
| .DownloadLinkInstall = $downloadUrl | .DownloadLinkInstall = $downloadUrl
| .DownloadLinkTesting = $downloadUrl | .DownloadLinkTesting = $downloadUrl
| .DownloadLinkUpdate = $downloadUrl | .DownloadLinkUpdate = $downloadUrl

View File

@@ -3,6 +3,7 @@ using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Hooking; using Dalamud.Hooking;
using Dalamud.Memory; using Dalamud.Memory;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility;
using Dalamud.Utility.Signatures; using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.System.String; using FFXIVClientStructs.FFXIV.Client.System.String;
using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI;
@@ -26,7 +27,7 @@ public unsafe sealed class GameChatHooks : IDisposable
// Based on https://git.anna.lgbt/anna/ExtraChat/src/branch/main/client/ExtraChat/GameFunctions.cs // Based on https://git.anna.lgbt/anna/ExtraChat/src/branch/main/client/ExtraChat/GameFunctions.cs
private readonly ILogger<GameChatHooks> _logger; private readonly ILogger<GameChatHooks> _logger;
private readonly Action<int, byte[]> _ssCommandHandler; private readonly Action<int, byte[]> _psCommandHandler;
#region signatures #region signatures
#pragma warning disable CS0649 #pragma warning disable CS0649
@@ -130,10 +131,10 @@ public unsafe sealed class GameChatHooks : IDisposable
} }
} }
public GameChatHooks(ILogger<GameChatHooks> logger, IGameInteropProvider gameInteropProvider, Action<int, byte[]> ssCommandHandler) public GameChatHooks(ILogger<GameChatHooks> logger, IGameInteropProvider gameInteropProvider, Action<int, byte[]> psCommandHandler)
{ {
_logger = logger; _logger = logger;
_ssCommandHandler = ssCommandHandler; _psCommandHandler = psCommandHandler;
logger.LogInformation("Initializing GameChatHooks"); logger.LogInformation("Initializing GameChatHooks");
gameInteropProvider.InitializeFromAttributes(this); gameInteropProvider.InitializeFromAttributes(this);
@@ -209,19 +210,41 @@ public unsafe sealed class GameChatHooks : IDisposable
if (isReply) if (isReply)
_nextMessageIsReply = utcNow + TimeSpan.FromMilliseconds(100); _nextMessageIsReply = utcNow + TimeSpan.FromMilliseconds(100);
// If it is a command, check if it begins with /ss first so we can handle the message directly // If it is a command, check if it begins with /ps first so we can handle the message directly
// Letting Dalamud handle the commands causes all of the special payloads to be dropped // Letting Dalamud handle the commands causes all of the special payloads to be dropped
if (isCommand && messageSpan.StartsWith(System.Text.Encoding.ASCII.GetBytes("/ss"))) if (isCommand && messageSpan.StartsWith(System.Text.Encoding.ASCII.GetBytes("/ps")))
{ {
for (int i = 1; i <= ChatService.CommandMaxNumber; ++i) for (int i = 1; i <= ChatService.CommandMaxNumber; ++i)
{ {
var cmdString = $"/ss{i} "; var cmdString = $"/ps{i} ";
if (messageSpan.StartsWith(System.Text.Encoding.ASCII.GetBytes(cmdString))) if (messageSpan.StartsWith(System.Text.Encoding.ASCII.GetBytes(cmdString)))
{ {
var ssChatBytes = ProcessChatMessage(message); var psChatBytes = ProcessChatMessage(message);
ssChatBytes = ssChatBytes.Skip(cmdString.Length).ToArray(); psChatBytes = psChatBytes.Skip(cmdString.Length).ToArray();
_ssCommandHandler?.Invoke(i, ssChatBytes); if (psChatBytes.Length > 0)
return; {
bool isBlank = true;
int j;
for (j = 0; j < psChatBytes.Length; j++)
{
if(!char.IsWhiteSpace((char)psChatBytes[j]))
{
isBlank = false;
break;
}
}
if (isBlank)
{
SendMessageHook!.OriginalDisposeSafe(thisPtr, message, uiModule);
return;
}
_psCommandHandler?.Invoke(i, psChatBytes);
return;
}
} }
} }
} }

View File

@@ -14,6 +14,7 @@ public sealed class IpcCallerHonorific : IIpcCaller
private readonly ICallGateSubscriber<int, object> _honorificClearCharacterTitle; private readonly ICallGateSubscriber<int, object> _honorificClearCharacterTitle;
private readonly ICallGateSubscriber<object> _honorificDisposing; private readonly ICallGateSubscriber<object> _honorificDisposing;
private readonly ICallGateSubscriber<string> _honorificGetLocalCharacterTitle; private readonly ICallGateSubscriber<string> _honorificGetLocalCharacterTitle;
private readonly ICallGateSubscriber<int, string> _honorificGetCharacterTitle;
private readonly ICallGateSubscriber<string, object> _honorificLocalCharacterTitleChanged; private readonly ICallGateSubscriber<string, object> _honorificLocalCharacterTitleChanged;
private readonly ICallGateSubscriber<object> _honorificReady; private readonly ICallGateSubscriber<object> _honorificReady;
private readonly ICallGateSubscriber<int, string, object> _honorificSetCharacterTitle; private readonly ICallGateSubscriber<int, string, object> _honorificSetCharacterTitle;
@@ -29,6 +30,7 @@ public sealed class IpcCallerHonorific : IIpcCaller
_dalamudUtil = dalamudUtil; _dalamudUtil = dalamudUtil;
_honorificApiVersion = pi.GetIpcSubscriber<(uint, uint)>("Honorific.ApiVersion"); _honorificApiVersion = pi.GetIpcSubscriber<(uint, uint)>("Honorific.ApiVersion");
_honorificGetLocalCharacterTitle = pi.GetIpcSubscriber<string>("Honorific.GetLocalCharacterTitle"); _honorificGetLocalCharacterTitle = pi.GetIpcSubscriber<string>("Honorific.GetLocalCharacterTitle");
_honorificGetCharacterTitle = pi.GetIpcSubscriber<int, string>("Honorific.GetCharacterTitle");
_honorificClearCharacterTitle = pi.GetIpcSubscriber<int, object>("Honorific.ClearCharacterTitle"); _honorificClearCharacterTitle = pi.GetIpcSubscriber<int, object>("Honorific.ClearCharacterTitle");
_honorificSetCharacterTitle = pi.GetIpcSubscriber<int, string, object>("Honorific.SetCharacterTitle"); _honorificSetCharacterTitle = pi.GetIpcSubscriber<int, string, object>("Honorific.SetCharacterTitle");
_honorificLocalCharacterTitleChanged = pi.GetIpcSubscriber<string, object>("Honorific.LocalCharacterTitleChanged"); _honorificLocalCharacterTitleChanged = pi.GetIpcSubscriber<string, object>("Honorific.LocalCharacterTitleChanged");
@@ -84,6 +86,23 @@ public sealed class IpcCallerHonorific : IIpcCaller
return string.IsNullOrEmpty(title) ? string.Empty : Convert.ToBase64String(Encoding.UTF8.GetBytes(title)); return string.IsNullOrEmpty(title) ? string.Empty : Convert.ToBase64String(Encoding.UTF8.GetBytes(title));
} }
public async Task<string> GetTitleForPlayer(IntPtr character)
{
if (!APIAvailable) return string.Empty;
string title = await _dalamudUtil.RunOnFrameworkThread(() =>
{
var gameObj = _dalamudUtil.CreateGameObject(character);
if (gameObj is IPlayerCharacter pc)
{
return _honorificGetCharacterTitle.InvokeFunc(pc.ObjectIndex);
}
return string.Empty;
}).ConfigureAwait(false);
return string.IsNullOrEmpty(title) ? string.Empty : Convert.ToBase64String(Encoding.UTF8.GetBytes(title));
}
public async Task SetTitleAsync(IntPtr character, string honorificDataB64) public async Task SetTitleAsync(IntPtr character, string honorificDataB64)
{ {
if (!APIAvailable) return; if (!APIAvailable) return;

View File

@@ -28,9 +28,9 @@ public sealed class IpcCallerOtherSync : DisposableMediatorSubscriberBase
_lightlessLoaded = msg.IsLoaded; _lightlessLoaded = msg.IsLoaded;
}); });
_snowcloakLoaded = PluginWatcherService.GetInitialPluginState(pi, "SnowcloakSync")?.IsLoaded ?? false; _snowcloakLoaded = PluginWatcherService.GetInitialPluginState(pi, "Snowcloak")?.IsLoaded ?? false;
Mediator.SubscribeKeyed<PluginChangeMessage>(this, "SnowcloakSync", (msg) => Mediator.SubscribeKeyed<PluginChangeMessage>(this, "Snowcloak", (msg) =>
{ {
_snowcloakLoaded = msg.IsLoaded; _snowcloakLoaded = msg.IsLoaded;
}); });

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Dalamud.NET.Sdk/13.1.0"> <Project Sdk="Dalamud.NET.Sdk/14.0.0">
<PropertyGroup> <PropertyGroup>
<AssemblyName>ClubPenguinSync</AssemblyName> <AssemblyName>ClubPenguinSync</AssemblyName>
<Version>1.7.1.1</Version> <Version>1.7.1.5</Version>
<PackageProjectUrl>https://github.com/Rawrington/ClubPenguinSync/</PackageProjectUrl> <PackageProjectUrl>https://github.com/Rawrington/ClubPenguinSync/</PackageProjectUrl>
</PropertyGroup> </PropertyGroup>

View File

@@ -149,7 +149,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
public string? PlayerName { get; private set; } public string? PlayerName { get; private set; }
public string PlayerNameHash => Pair.Ident; public string PlayerNameHash => Pair.Ident;
public void ApplyCharacterData(Guid applicationBase, CharacterData characterData, bool forceApplyCustomization = false) public async void ApplyCharacterData(Guid applicationBase, CharacterData characterData, bool forceApplyCustomization = false)
{ {
if (_configService.Current.HoldCombatApplication && _dalamudUtil.IsInCombatOrPerforming) if (_configService.Current.HoldCombatApplication && _dalamudUtil.IsInCombatOrPerforming)
{ {
@@ -175,7 +175,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
Logger.LogDebug("[BASE-{appBase}] Received data but player was in invalid state, charaHandlerIsNull: {charaIsNull}, playerPointerIsNull: {ptrIsNull}", Logger.LogDebug("[BASE-{appBase}] Received data but player was in invalid state, charaHandlerIsNull: {charaIsNull}, playerPointerIsNull: {ptrIsNull}",
applicationBase, _charaHandler == null, PlayerCharacter == IntPtr.Zero); applicationBase, _charaHandler == null, PlayerCharacter == IntPtr.Zero);
var hasDiffMods = characterData.CheckUpdatedData(applicationBase, _cachedData, Logger, var hasDiffMods = characterData.CheckUpdatedData(applicationBase, _cachedData, Logger,
this, forceApplyCustomization, forceApplyMods: false) this, forceApplyCustomization, forceApplyMods: false, string.Empty)
.Any(p => p.Value.Contains(PlayerChanges.ModManip) || p.Value.Contains(PlayerChanges.ModFiles)); .Any(p => p.Value.Contains(PlayerChanges.ModManip) || p.Value.Contains(PlayerChanges.ModFiles));
_forceApplyMods = hasDiffMods || _forceApplyMods || (PlayerCharacter == IntPtr.Zero && _cachedData == null); _forceApplyMods = hasDiffMods || _forceApplyMods || (PlayerCharacter == IntPtr.Zero && _cachedData == null);
_cachedData = characterData; _cachedData = characterData;
@@ -201,7 +201,7 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
$"Not applying character data: {reasons}"))); $"Not applying character data: {reasons}")));
Logger.LogDebug("[BASE-{appBase}] Not applying due to hold: {reasons}", applicationBase, reasons); Logger.LogDebug("[BASE-{appBase}] Not applying due to hold: {reasons}", applicationBase, reasons);
var hasDiffMods = characterData.CheckUpdatedData(applicationBase, _cachedData, Logger, var hasDiffMods = characterData.CheckUpdatedData(applicationBase, _cachedData, Logger,
this, forceApplyCustomization, forceApplyMods: false) this, forceApplyCustomization, forceApplyMods: false, _ipcManager.Honorific.GetTitleForPlayer(PlayerCharacter).GetAwaiter().GetResult())
.Any(p => p.Value.Contains(PlayerChanges.ModManip) || p.Value.Contains(PlayerChanges.ModFiles)); .Any(p => p.Value.Contains(PlayerChanges.ModManip) || p.Value.Contains(PlayerChanges.ModFiles));
_forceApplyMods = hasDiffMods || _forceApplyMods || (PlayerCharacter == IntPtr.Zero && _cachedData == null); _forceApplyMods = hasDiffMods || _forceApplyMods || (PlayerCharacter == IntPtr.Zero && _cachedData == null);
_cachedData = characterData; _cachedData = characterData;
@@ -228,7 +228,8 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
_forceApplyMods |= forceApplyCustomization; _forceApplyMods |= forceApplyCustomization;
var charaDataToUpdate = characterData.CheckUpdatedData(applicationBase, _cachedData?.DeepClone() ?? new(), Logger, this, forceApplyCustomization, _forceApplyMods); string oldHonorificTitle = _ipcManager.Honorific.GetTitleForPlayer(PlayerCharacter).GetAwaiter().GetResult();
var charaDataToUpdate = characterData.CheckUpdatedData(applicationBase, _cachedData?.DeepClone() ?? new(), Logger, this, forceApplyCustomization, _forceApplyMods, oldHonorificTitle);
if (_charaHandler != null && _forceApplyMods) if (_charaHandler != null && _forceApplyMods)
{ {

View File

@@ -72,7 +72,7 @@ public class ChatService : DisposableMediatorSubscriberBase
{ {
var chatMsg = message.ChatMsg; var chatMsg = message.ChatMsg;
var prefix = new SeStringBuilder(); var prefix = new SeStringBuilder();
prefix.AddText("[BnnuyChat] "); prefix.AddText("[PenguinChat] ");
_chatGui.Print(new XivChatEntry{ _chatGui.Print(new XivChatEntry{
MessageBytes = [..prefix.Build().Encode(), ..message.ChatMsg.PayloadContent], MessageBytes = [..prefix.Build().Encode(), ..message.ChatMsg.PayloadContent],
Name = chatMsg.SenderName, Name = chatMsg.SenderName,
@@ -121,7 +121,7 @@ public class ChatService : DisposableMediatorSubscriberBase
} }
if (color != 0) if (color != 0)
msg.AddUiForeground((ushort)color); msg.AddUiForeground((ushort)color);
msg.AddText($"[SS{shellNumber}]<"); msg.AddText($"[PS{shellNumber}]<");
if (message.ChatMsg.Sender.UID.Equals(_apiController.UID, StringComparison.Ordinal)) if (message.ChatMsg.Sender.UID.Equals(_apiController.UID, StringComparison.Ordinal))
{ {
// Don't link to your own character // Don't link to your own character
@@ -179,7 +179,7 @@ public class ChatService : DisposableMediatorSubscriberBase
if (_gameChatHooks.IsValueCreated && _gameChatHooks.Value.ChatChannelOverride != null) if (_gameChatHooks.IsValueCreated && _gameChatHooks.Value.ChatChannelOverride != null)
{ {
// Very dumb and won't handle re-numbering -- need to identify the active chat channel more reliably later // Very dumb and won't handle re-numbering -- need to identify the active chat channel more reliably later
if (_gameChatHooks.Value.ChatChannelOverride.ChannelName.StartsWith($"SS [{shellNumber}]", StringComparison.Ordinal)) if (_gameChatHooks.Value.ChatChannelOverride.ChannelName.StartsWith($"PS [{shellNumber}]", StringComparison.Ordinal))
SwitchChatShell(shellNumber); SwitchChatShell(shellNumber);
} }
} }
@@ -200,7 +200,7 @@ public class ChatService : DisposableMediatorSubscriberBase
// BUG: This doesn't always update the chat window e.g. when renaming a group // BUG: This doesn't always update the chat window e.g. when renaming a group
_gameChatHooks.Value.ChatChannelOverride = new() _gameChatHooks.Value.ChatChannelOverride = new()
{ {
ChannelName = $"SS [{shellNumber}]: {name}", ChannelName = $"PS [{shellNumber}]: {name}",
ChatMessageHandler = chatBytes => SendChatShell(shellNumber, chatBytes) ChatMessageHandler = chatBytes => SendChatShell(shellNumber, chatBytes)
}; };
return; return;

View File

@@ -1,5 +1,6 @@
using Dalamud.Game.Command; using Dalamud.Game.Command;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility;
using MareSynchronos.FileCache; using MareSynchronos.FileCache;
using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration;
using MareSynchronos.MareConfiguration.Models; using MareSynchronos.MareConfiguration.Models;
@@ -17,7 +18,7 @@ public sealed class CommandManagerService : IDisposable
private const string _commandName = "/sync"; private const string _commandName = "/sync";
private const string _commandName2 = "/clubpenguin"; private const string _commandName2 = "/clubpenguin";
private const string _ssCommandPrefix = "/ss"; private const string _psCommandPrefix = "/ps";
private readonly ApiController _apiController; private readonly ApiController _apiController;
private readonly ICommandManager _commandManager; private readonly ICommandManager _commandManager;
@@ -52,7 +53,7 @@ public sealed class CommandManagerService : IDisposable
// Lazy registration of all possible /ss# commands which tbf is what the game does for linkshells anyway // Lazy registration of all possible /ss# commands which tbf is what the game does for linkshells anyway
for (int i = 1; i <= ChatService.CommandMaxNumber; ++i) for (int i = 1; i <= ChatService.CommandMaxNumber; ++i)
{ {
_commandManager.AddHandler($"{_ssCommandPrefix}{i}", new CommandInfo(OnChatCommand) _commandManager.AddHandler($"{_psCommandPrefix}{i}", new CommandInfo(OnChatCommand)
{ {
ShowInHelp = false ShowInHelp = false
}); });
@@ -65,7 +66,7 @@ public sealed class CommandManagerService : IDisposable
_commandManager.RemoveHandler(_commandName2); _commandManager.RemoveHandler(_commandName2);
for (int i = 1; i <= ChatService.CommandMaxNumber; ++i) for (int i = 1; i <= ChatService.CommandMaxNumber; ++i)
_commandManager.RemoveHandler($"{_ssCommandPrefix}{i}"); _commandManager.RemoveHandler($"{_psCommandPrefix}{i}");
} }
private void OnCommand(string command, string args) private void OnCommand(string command, string args)
@@ -139,9 +140,9 @@ public sealed class CommandManagerService : IDisposable
if (_mareConfigService.Current.DisableSyncshellChat) if (_mareConfigService.Current.DisableSyncshellChat)
return; return;
int shellNumber = int.Parse(command[_ssCommandPrefix.Length..]); int shellNumber = int.Parse(command[_psCommandPrefix.Length..]);
if (args.Length == 0) if (args.Length == 0 || args.IsNullOrWhitespace())
{ {
_chatService.SwitchChatShell(shellNumber); _chatService.SwitchChatShell(shellNumber);
} }

View File

@@ -7,6 +7,7 @@ using Dalamud.Utility;
using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Game.Control; using FFXIVClientStructs.FFXIV.Client.Game.Control;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using FFXIVClientStructs.FFXIV.Client.UI.Agent; using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using Lumina.Excel.Sheets; using Lumina.Excel.Sheets;
@@ -139,7 +140,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
_ = RunOnFrameworkThread(() => _ = RunOnFrameworkThread(() =>
{ {
var addr = GetPlayerCharacterFromCachedTableByIdent(ident); var addr = GetPlayerCharacterFromCachedTableByIdent(ident);
var pc = _clientState.LocalPlayer!; var pc = _objectTable.LocalPlayer!;
var gobj = CreateGameObject(addr); var gobj = CreateGameObject(addr);
// Any further than roughly 55y is out of range for targetting // Any further than roughly 55y is out of range for targetting
if (gobj != null && Vector3.Distance(pc.Position, gobj.Position) < 55.0f) if (gobj != null && Vector3.Distance(pc.Position, gobj.Position) < 55.0f)
@@ -243,7 +244,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
public bool GetIsPlayerPresent() public bool GetIsPlayerPresent()
{ {
EnsureIsOnFramework(); EnsureIsOnFramework();
return _clientState.LocalPlayer != null && _clientState.LocalPlayer.IsValid(); return _objectTable.LocalPlayer != null && _objectTable.LocalPlayer.IsValid();
} }
public async Task<bool> GetIsPlayerPresentAsync() public async Task<bool> GetIsPlayerPresentAsync()
@@ -287,7 +288,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
public IPlayerCharacter GetPlayerCharacter() public IPlayerCharacter GetPlayerCharacter()
{ {
EnsureIsOnFramework(); EnsureIsOnFramework();
return _clientState.LocalPlayer!; return _objectTable.LocalPlayer!;
} }
public IntPtr GetPlayerCharacterFromCachedTableByName(string characterName) public IntPtr GetPlayerCharacterFromCachedTableByName(string characterName)
@@ -309,7 +310,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
public string GetPlayerName() public string GetPlayerName()
{ {
EnsureIsOnFramework(); EnsureIsOnFramework();
return _clientState.LocalPlayer?.Name.ToString() ?? "--"; return _objectTable.LocalPlayer?.Name.ToString() ?? "--";
} }
public async Task<string> GetPlayerNameAsync() public async Task<string> GetPlayerNameAsync()
@@ -325,7 +326,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
public IntPtr GetPlayerPointer() public IntPtr GetPlayerPointer()
{ {
EnsureIsOnFramework(); EnsureIsOnFramework();
return _clientState.LocalPlayer?.Address ?? IntPtr.Zero; return _objectTable.LocalPlayer?.Address ?? IntPtr.Zero;
} }
public async Task<IntPtr> GetPlayerPointerAsync() public async Task<IntPtr> GetPlayerPointerAsync()
@@ -336,13 +337,13 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
public uint GetHomeWorldId() public uint GetHomeWorldId()
{ {
EnsureIsOnFramework(); EnsureIsOnFramework();
return _clientState.LocalPlayer?.HomeWorld.RowId ?? 0; return _objectTable.LocalPlayer?.HomeWorld.RowId ?? 0;
} }
public uint GetWorldId() public uint GetWorldId()
{ {
EnsureIsOnFramework(); EnsureIsOnFramework();
return _clientState.LocalPlayer!.CurrentWorld.RowId; return _objectTable.LocalPlayer!.CurrentWorld.RowId;
} }
public unsafe LocationInfo GetMapData() public unsafe LocationInfo GetMapData()
@@ -351,8 +352,8 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
var agentMap = AgentMap.Instance(); var agentMap = AgentMap.Instance();
var houseMan = HousingManager.Instance(); var houseMan = HousingManager.Instance();
uint serverId = 0; uint serverId = 0;
if (_clientState.LocalPlayer == null) serverId = 0; if (_objectTable.LocalPlayer == null) serverId = 0;
else serverId = _clientState.LocalPlayer.CurrentWorld.RowId; else serverId = _objectTable.LocalPlayer.CurrentWorld.RowId;
uint mapId = agentMap == null ? 0 : agentMap->CurrentMapId; uint mapId = agentMap == null ? 0 : agentMap->CurrentMapId;
uint territoryId = agentMap == null ? 0 : agentMap->CurrentTerritoryId; uint territoryId = agentMap == null ? 0 : agentMap->CurrentTerritoryId;
uint divisionId = houseMan == null ? 0 : (uint)(houseMan->GetCurrentDivision()); uint divisionId = houseMan == null ? 0 : (uint)(houseMan->GetCurrentDivision());
@@ -473,7 +474,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
_framework.Update += ClubPenguinSync.Plugin.Self.OnFrameworkUpdate; _framework.Update += ClubPenguinSync.Plugin.Self.OnFrameworkUpdate;
if (IsLoggedIn) if (IsLoggedIn)
{ {
_classJobId = _clientState.LocalPlayer!.ClassJob.RowId; _classJobId = _objectTable.LocalPlayer!.ClassJob.RowId;
} }
_logger.LogInformation("Started DalamudUtilService"); _logger.LogInformation("Started DalamudUtilService");
@@ -582,7 +583,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
bool isDrawingChanged = false; bool isDrawingChanged = false;
if ((nint)drawObj != IntPtr.Zero) if ((nint)drawObj != IntPtr.Zero)
{ {
isDrawing = gameObj->RenderFlags == 0b100000000000; isDrawing = gameObj->RenderFlags == VisibilityFlags.Model;
if (!isDrawing) if (!isDrawing)
{ {
isDrawing = ((CharacterBase*)drawObj)->HasModelInSlotLoaded != 0; isDrawing = ((CharacterBase*)drawObj)->HasModelInSlotLoaded != 0;
@@ -635,7 +636,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
private unsafe void FrameworkOnUpdateInternal() private unsafe void FrameworkOnUpdateInternal()
{ {
if (_clientState.LocalPlayer?.IsDead ?? false) if (_objectTable.LocalPlayer?.IsDead ?? false)
{ {
return; return;
} }
@@ -764,7 +765,7 @@ public class DalamudUtilService : IHostedService, IMediatorSubscriber
Mediator.Publish(new ResumeScanMessage(nameof(ConditionFlag.BetweenAreas))); Mediator.Publish(new ResumeScanMessage(nameof(ConditionFlag.BetweenAreas)));
} }
var localPlayer = _clientState.LocalPlayer; var localPlayer = _objectTable.LocalPlayer;
if (localPlayer != null) if (localPlayer != null)
{ {
_classJobId = localPlayer.ClassJob.RowId; _classJobId = localPlayer.ClassJob.RowId;

View File

@@ -246,7 +246,7 @@ internal sealed class GroupPanel
if (!_mareConfig.Current.DisableSyncshellChat && shellConfig.Enabled) if (!_mareConfig.Current.DisableSyncshellChat && shellConfig.Enabled)
{ {
ImGui.TextUnformatted($"[{shellNumber}]"); ImGui.TextUnformatted($"[{shellNumber}]");
UiSharedService.AttachToolTip("Chat command prefix: /ss" + shellNumber); UiSharedService.AttachToolTip("Chat command prefix: /ps" + shellNumber);
} }
if (textIsGid) ImGui.PushFont(UiBuilder.MonoFont); if (textIsGid) ImGui.PushFont(UiBuilder.MonoFont);
ImGui.SameLine(); ImGui.SameLine();

View File

@@ -56,7 +56,7 @@ public static class VariousExtensions
} }
public static Dictionary<ObjectKind, HashSet<PlayerChanges>> CheckUpdatedData(this CharacterData newData, Guid applicationBase, public static Dictionary<ObjectKind, HashSet<PlayerChanges>> CheckUpdatedData(this CharacterData newData, Guid applicationBase,
CharacterData? oldData, ILogger logger, PairHandler cachedPlayer, bool forceApplyCustomization, bool forceApplyMods) CharacterData? oldData, ILogger logger, PairHandler cachedPlayer, bool forceApplyCustomization, bool forceApplyMods, string oldHonorificData)
{ {
oldData ??= new(); oldData ??= new();
var charaDataToUpdate = new Dictionary<ObjectKind, HashSet<PlayerChanges>>(); var charaDataToUpdate = new Dictionary<ObjectKind, HashSet<PlayerChanges>>();
@@ -182,7 +182,7 @@ public static class VariousExtensions
charaDataToUpdate[objectKind].Add(PlayerChanges.Heels); charaDataToUpdate[objectKind].Add(PlayerChanges.Heels);
} }
bool honorificDataDifferent = !string.Equals(oldData.HonorificData, newData.HonorificData, StringComparison.Ordinal); bool honorificDataDifferent = !string.Equals(oldHonorificData, newData.HonorificData, StringComparison.Ordinal);
if (honorificDataDifferent || (forceApplyCustomization && !string.IsNullOrEmpty(newData.HonorificData))) if (honorificDataDifferent || (forceApplyCustomization && !string.IsNullOrEmpty(newData.HonorificData)))
{ {
logger.LogDebug("[BASE-{appBase}] Updating {object}/{kind} (Diff honorific data) => {change}", applicationBase, cachedPlayer, objectKind, PlayerChanges.Honorific); logger.LogDebug("[BASE-{appBase}] Updating {object}/{kind} (Diff honorific data) => {change}", applicationBase, cachedPlayer, objectKind, PlayerChanges.Honorific);