diff --git a/Uchu.World/Handlers/Commands/OperatorCommandHandler.cs b/Uchu.World/Handlers/Commands/OperatorCommandHandler.cs index d0ceb6b4..590a4a02 100644 --- a/Uchu.World/Handlers/Commands/OperatorCommandHandler.cs +++ b/Uchu.World/Handlers/Commands/OperatorCommandHandler.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore; using Uchu.Core; using Uchu.World.Scripting.Managed; +using Uchu.World.Social; namespace Uchu.World.Handlers.Commands { @@ -130,5 +131,50 @@ public string PythonList(string[] arguments, Player python) return builder.ToString(); } + + [CommandHandler(Signature = "failed", Help = "Display failed message", GameMasterLevel = GameMasterLevel.Admin)] + public string Failed(string[] arguments, Player player) + { + if (arguments.Length == default) return "failed <...message...>"; + + var args = arguments.ToList(); + + var id = args[0]; + + args.RemoveAt(0); + + if (!uint.TryParse(id, out var eId)) return "Invalid "; + + var message = string.Join(" ", args); + + player.Message(new NotifyClientFailedPreconditionMessage + { + Associate = player, + Id = (int) eId, + Reason = message + }); + + return "Sent failed condition."; + } + + [CommandHandler(Signature = "state", Help = "Send UI state message", GameMasterLevel = GameMasterLevel.Admin)] + public async Task State(string[] arguments, Player player) + { + var state = string.Join(" ", arguments); + + await UiHelper.StateAsync(player, state); + + return "Sent ui message."; + } + + [CommandHandler(Signature = "toggle", Help = "Send toggle ui message", GameMasterLevel = GameMasterLevel.Admin)] + public async Task Toggle(string[] arguments, Player player) + { + if (arguments.Length != 2) return "toggle "; + + await UiHelper.ToggleAsync(player, arguments[0], !bool.TryParse(arguments[1], out var state) || state); + + return "Sent ui message."; + } } } \ No newline at end of file diff --git a/Uchu.World/Objects/Components/Player/MissionInventoryComponent.cs b/Uchu.World/Objects/Components/Player/MissionInventoryComponent.cs index eed64db7..ef8b69ea 100644 --- a/Uchu.World/Objects/Components/Player/MissionInventoryComponent.cs +++ b/Uchu.World/Objects/Components/Player/MissionInventoryComponent.cs @@ -50,6 +50,13 @@ public void MessageOfferMission(int missionId, GameObject missionGiver) MissionId = missionId, QuestGiver = missionGiver }); + + As().Message(new OfferMissionMessage + { + Associate = missionGiver, + MissionId = missionId, + QuestGiver = missionGiver + }); } public MissionInventoryComponent() diff --git a/Uchu.World/Packets/GameMessages/Server/NotifyClientFailedPreconditionMessage.cs b/Uchu.World/Packets/GameMessages/Server/NotifyClientFailedPreconditionMessage.cs new file mode 100644 index 00000000..2a01b320 --- /dev/null +++ b/Uchu.World/Packets/GameMessages/Server/NotifyClientFailedPreconditionMessage.cs @@ -0,0 +1,22 @@ +using RakDotNet.IO; +using Uchu.Core; + +namespace Uchu.World +{ + public class NotifyClientFailedPreconditionMessage : ServerGameMessage + { + public override GameMessageId GameMessageId => GameMessageId.NotifyClientFailedPrecondition; + + public string Reason { get; set; } + + public int Id { get; set; } + + public override void SerializeMessage(BitWriter writer) + { + writer.Write((uint) Reason.Length); + writer.WriteString(Reason, Reason.Length, true); + + writer.Write(Id); + } + } +} \ No newline at end of file diff --git a/Uchu.World/Social/Amf3Helper.cs b/Uchu.World/Social/Amf3Helper.cs index 7732ea8d..677f011d 100644 --- a/Uchu.World/Social/Amf3Helper.cs +++ b/Uchu.World/Social/Amf3Helper.cs @@ -142,5 +142,14 @@ public static void WriteText(BitWriter writer, string value) writer.Write((byte) character); } } + + public static void Array(BitWriter writer, int length) + { + writer.Write((byte) Amf3Type.Array); + + var size = (length << 1) | 1; + + WriteNumber2(writer, (uint) size); + } } } \ No newline at end of file diff --git a/Uchu.World/Social/UiHelper.cs b/Uchu.World/Social/UiHelper.cs index 6b87de10..f5fac118 100644 --- a/Uchu.World/Social/UiHelper.cs +++ b/Uchu.World/Social/UiHelper.cs @@ -75,5 +75,47 @@ public static async Task AnnouncementAsync(Player player, string title, string m MessageName = "ToggleAnnounce" }); } + + public static async Task StateAsync(Player player, string state) + { + await using var stream = new MemoryStream(); + using var writer = new BitWriter(stream); + + writer.Write((byte) Amf3Type.Array); + writer.Write(1); + Amf3Helper.WriteText(writer, "state"); + + writer.Write((byte) Amf3Type.String); + Amf3Helper.WriteText(writer, state); + + writer.Write((byte) Amf3Type.Null); + + player.Message(new UiMessageServerToSingleClientMessage + { + Associate = player, + Content = stream.ToArray(), + MessageName = "pushGameState" + }); + } + + public static async Task ToggleAsync(Player player, string name, bool value) + { + await using var stream = new MemoryStream(); + using var writer = new BitWriter(stream); + + writer.Write((byte) Amf3Type.Array); + writer.Write(1); + Amf3Helper.WriteText(writer, "visible"); + + writer.Write((byte) (value ? Amf3Type.True : Amf3Type.False)); + writer.Write((byte) Amf3Type.Null); + + player.Message(new UiMessageServerToSingleClientMessage + { + Associate = player, + Content = stream.ToArray(), + MessageName = name + }); + } } } \ No newline at end of file