diff --git a/client/Message.cs b/client/Message.cs index c165d7d..a93cedd 100644 --- a/client/Message.cs +++ b/client/Message.cs @@ -20,6 +20,9 @@ internal class Message { public int NegativeVotes { get; set; } public int UserVote { get; set; } + public uint? Emote { get; set; } + public byte[]? Customise { get; set; } + public int Glyph { get; set; } internal Vector3 Position => new(this.X, this.Y, this.Z); @@ -45,6 +48,9 @@ internal class MessageWithTerritory { public int NegativeVotes { get; init; } public int UserVote { get; set; } + public uint? Emote { get; set; } + public byte[]? Customise { get; set; } + public int Glyph { get; set; } public bool IsHidden { get; set; } @@ -62,12 +68,56 @@ internal class MessageWithTerritory { PositiveVotes = message.PositiveVotes, NegativeVotes = message.NegativeVotes, UserVote = message.UserVote, + Emote = message.Emote, + Customise = message.Customise, Glyph = message.Glyph, IsHidden = false, }; } } +[Serializable] +[JsonObject(NamingStrategyType = typeof(SnakeCaseNamingStrategy))] +internal class EmoteData { + public uint Id { get; set; } + public byte[] Customise { get; set; } + public EquipmentData[] Equipment { get; set; } + public WeaponData[] Weapon { get; set; } + public bool HatHidden { get; set; } + public bool VisorToggled { get; set; } + public bool WeaponHidden { get; set; } +} + +[Serializable] +[JsonObject(NamingStrategyType = typeof(SnakeCaseNamingStrategy))] +internal class EquipmentData { + public ushort Id { get; set; } + public byte Variant { get; set; } + public byte Stain0 { get; set; } + public byte Stain1 { get; set; } + public ulong Value { get; set; } +} + +[Serializable] +[JsonObject(NamingStrategyType = typeof(SnakeCaseNamingStrategy))] +internal class WeaponData { + public WeaponModelId ModelId { get; set; } + public byte State { get; set; } + public ushort Flags1 { get; set; } + public byte Flags2 { get; set; } +} + +[Serializable] +[JsonObject(NamingStrategyType = typeof(SnakeCaseNamingStrategy))] +internal class WeaponModelId { + public ushort Id { get; set; } + public ushort Type { get; set; } + public ushort Variant { get; set; } + public byte Stain0 { get; set; } + public byte Stain1 { get; set; } + public ulong Value { get; set; } +} + [Serializable] [JsonObject(NamingStrategyType = typeof(SnakeCaseNamingStrategy))] internal class ErrorMessage { diff --git a/client/Util/ActorManager.cs b/client/Util/ActorManager.cs index e966b47..9dc699b 100644 --- a/client/Util/ActorManager.cs +++ b/client/Util/ActorManager.cs @@ -21,10 +21,6 @@ internal class ActorManager : IDisposable { } private unsafe void OnFramework(IFramework framework) { - if (this._idx is not { } idx) { - return; - } - if (!this._tasks.TryPeek(out var actorAction)) { return; } @@ -60,15 +56,8 @@ internal class ActorManager : IDisposable { } } - internal unsafe void Spawn(Message message) { - if (this._idx != null) { - Plugin.Log.Warning("refusing to spawn more than one actor"); - return; - } - - Plugin.Log.Debug("spawning actor"); - - + internal void Spawn(Message message) { + this._tasks.Enqueue(new SpawnAction(message)); } internal void Despawn() { @@ -80,7 +69,7 @@ internal class ActorManager : IDisposable { this._tasks.Enqueue(new DeleteAction()); } - private unsafe abstract class BaseActorAction { + private abstract unsafe class BaseActorAction { /// /// Run this action. /// @@ -130,6 +119,7 @@ internal class ActorManager : IDisposable { var chara = (BattleChara*) objMan->GetObjectByIndex((ushort) idx); chara->ObjectKind = ObjectKind.BattleNpc; + chara->TargetableStatus = 0; chara->Position = message.Position; chara->Rotation = message.Yaw; var drawData = &chara->DrawData; @@ -183,6 +173,7 @@ internal class ActorManager : IDisposable { } objMan->DeleteObjectByIndex((ushort) idx, 0); + manager._idx = null; return true; } }