Improve lobby handling so it doesn't spam errors anymore

This commit is contained in:
RisaDev
2024-09-30 23:32:48 +03:00
parent a0c21635ad
commit b2d110980e
2 changed files with 23 additions and 18 deletions

View File

@@ -3,11 +3,13 @@ using Dalamud.Game.ClientState.Objects;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Control;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using OtterGui.Log;
using Penumbra.GameData.Actors;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop;
using Penumbra.GameData.Structs;
using Penumbra.String;
namespace CustomizePlus.GameData.Services;
@@ -84,7 +86,7 @@ public class ObjectManager(
IsInGPose = gPose.Utf8Name.Length > 0;
//C+ custom
IsInLobby = AddLobbyCharacter();
IsInLobby = AddLobbyCharacters();
return true;
}
@@ -136,10 +138,6 @@ public class ObjectManager(
}
}
//c+ custom
public Actor LobbyActor
=> IsInLobby ? this[200] : nint.Zero;
public Actor GPosePlayer
=> this[(int)ScreenActor.GPosePlayer];
@@ -218,22 +216,32 @@ public class ObjectManager(
}
//c+ custom
private unsafe bool AddLobbyCharacter()
private unsafe bool AddLobbyCharacters()
{
var agent = AgentLobby.Instance();
if (agent == null || agent->LobbyData.CharaSelectEntries.LongCount() == 0)
if (agent == null)
return false;
var chara = agent->LobbyData.CharaSelectEntries[(long)agent->SelectedCharacterContentId].Value;
if (chara == null)
return false;
var span = agent->LobbyData.CharaSelectEntries.AsSpan();
var actor = CutsceneCharacters.FirstOrDefault();
// The lobby uses the first 8 cutscene actors.
int cnt = 0;
foreach (var actor in CutsceneCharacters.Take(8))
{
if (!actor.Valid) //shouldn't happen so should be safe to break?
break;
if (!actor.Valid)
return false;
if (cnt >= span.Length)
break;
HandleIdentifier(actors.CreatePlayer(new ByteString(chara->Name), chara->HomeWorldId), actor);
if (span[cnt].Value == null) //should mean the end of valid actors so should be safe to break?
break;
var chara = span[cnt].Value;
HandleIdentifier(actors.CreatePlayer(new ByteString(chara->Name), chara->HomeWorldId), actor);
cnt++;
}
return true;
}