diff --git a/data/extensions/Spells/Commands/InfoCommand.cs b/data/extensions/Spells/Commands/InfoCommand.cs new file mode 100644 index 000000000..c618e9042 --- /dev/null +++ b/data/extensions/Spells/Commands/InfoCommand.cs @@ -0,0 +1,65 @@ +using System; +using System.Linq; +using NeoServer.Game.Combat.Spells; +using NeoServer.Game.Common; +using NeoServer.Game.Common.Contracts.Creatures; +using NeoServer.Game.Common.Contracts.Items; +using NeoServer.Game.Common.Contracts.Items.Types; +using NeoServer.Game.Common.Creatures; +using NeoServer.Game.Items; +using NeoServer.Networking.Packets.Outgoing; +using NeoServer.Server.Common.Contracts; +using NeoServer.Server.Configurations; +using NeoServer.Server.Helpers; + +namespace NeoServer.Extensions.Spells.Commands; + +public class InfoCommand : CommandSpell +{ + public override bool OnCast(ICombatActor actor, string words, out InvalidOperation error) + { + error = InvalidOperation.NotPossible; + + if (Params.Length != 1) + return false; + + var ctx = IoC.GetInstance(); + ctx.TryGetPlayer(Params[0].ToString(), out var target); + + if (target is null) + return false; + + var info = CreateItemInfo(); + + var message = + $""" + AccountId: {target.AccountId} + Position: {target.Location.X}, {target.Location.Y}, {target.Location.Z} + Capacity: {target.TotalCapacity} + PremiumTime: {target.PremiumTime} + Level: {target.Level} + Skills: + {target.Skills.Where(item => item.Key != SkillType.Level).Select(Item => " * " + Item.Key + ": " + Item.Value.Level + "\n").Aggregate((a, b) => a + b)} + """; + + var window = new ListCommandsCommand.TextWindow(info, target.Location, message); + var serverConfiguration = IoC.GetInstance(); + + window.WrittenBy = $"{serverConfiguration.ServerName} - SERVER"; + window.WrittenOn = DateTime.Now; + + var player = actor as IPlayer; + + player.Read(window); + + return true; + } + + private static IItemType CreateItemInfo() + { + var item = new ItemType(); + item.SetName("Info Status"); + item.SetClientId(2821); + return item; + } +} \ No newline at end of file diff --git a/data/extensions/Spells/Commands/ListCommandsCommand.cs b/data/extensions/Spells/Commands/ListCommandsCommand.cs index 2b5c79917..ed7a89cde 100644 --- a/data/extensions/Spells/Commands/ListCommandsCommand.cs +++ b/data/extensions/Spells/Commands/ListCommandsCommand.cs @@ -53,26 +53,33 @@ private static string BuildTextFromSpells(List> spel var lines = new List(); foreach (var spell in spells) { - var (words, name) = ExtractSpellAttributes(spell); + var (words, name, description) = ExtractSpellAttributes(spell); if (string.IsNullOrEmpty(words) || words == command) continue; - lines.Add($"{words} {name}"); + if (string.IsNullOrEmpty(description)) + { + lines.Add($"{words} {name}"); + continue; + } + + lines.Add($"{words} {name} - {description}"); } return string.Join(Environment.NewLine + Environment.NewLine, lines); } - private static (string, string) ExtractSpellAttributes(IDictionary spell) + private static (string, string, string) ExtractSpellAttributes(IDictionary spell) { if (spell is null || !spell.ContainsKey("type") || spell["type"]?.ToString() != SPELL_TYPE) - return (string.Empty, string.Empty); + return (string.Empty, string.Empty, string.Empty); var words = spell["words"].ToString(); var name = spell["name"].ToString(); + var description = spell["description"]?.ToString(); - return (words, name); + return (words, name, description); } private static List> LoadSpells() @@ -84,7 +91,7 @@ private static List> LoadSpells() new List>(0); } - private sealed class TextWindow : BaseItem, IReadable + public sealed class TextWindow : BaseItem, IReadable { public TextWindow(IItemType metadata, Location location, string text) : base(metadata, location) { @@ -94,7 +101,7 @@ public TextWindow(IItemType metadata, Location location, string text) : base(met public string Text { get; private set; } public ushort MaxLength => (ushort)(Text?.Length ?? 0); public bool CanWrite => false; - public string WrittenBy { get; } + public string WrittenBy { get; set; } public DateTime? WrittenOn { get; set; } public Result Write(string text, IPlayer writtenBy) diff --git a/data/extensions/Spells/Commands/SpyPlayerCommand.cs b/data/extensions/Spells/Commands/SpyPlayerCommand.cs new file mode 100644 index 000000000..2997b8dd2 --- /dev/null +++ b/data/extensions/Spells/Commands/SpyPlayerCommand.cs @@ -0,0 +1,49 @@ +using System; +using System.Text; +using NeoServer.Game.Combat.Spells; +using NeoServer.Game.Common; +using NeoServer.Game.Common.Contracts.Creatures; +using NeoServer.Game.Items; +using NeoServer.Server.Common.Contracts; +using NeoServer.Server.Configurations; +using NeoServer.Server.Helpers; + +namespace NeoServer.Extensions.Spells.Commands; + +public class SpyPlayerCommand : CommandSpell +{ + public override bool OnCast(ICombatActor actor, string words, out InvalidOperation error) + { + error = InvalidOperation.NotPossible; + + if (Params.Length == 0) + return false; + + var ctx = IoC.GetInstance(); + + if (!ctx.TryGetPlayer(Params[0].ToString(), out var player)) + return false; + + var stringBuilder = new StringBuilder(1000); + + stringBuilder.AppendLine($"*** Name: {player.Name} *****"); + + foreach (var inventoryDressingItem in player.Inventory.DressingItems) + { + stringBuilder.AppendLine($"ClientId: {inventoryDressingItem.Metadata.ClientId}-{inventoryDressingItem.FullName}"); + } + + var item = new ItemType(); + item.SetClientId(2821); + + var window = new ListCommandsCommand.TextWindow(item, player.Location, stringBuilder.ToString()); + var serverConfiguration = IoC.GetInstance(); + + window.WrittenBy = $"{serverConfiguration.ServerName} - SERVER"; + window.WrittenOn = DateTime.Now; + + player.Read(window); + + return true; + } +} \ No newline at end of file diff --git a/data/spells/spells.json b/data/spells/spells.json index b09f0a27e..222eacc72 100644 --- a/data/spells/spells.json +++ b/data/spells/spells.json @@ -149,6 +149,7 @@ "name": "Create Item", "words": "/i", "script": "ItemCreator", + "description": "", "mana": 0, "cooldown": "0", "level": 1, @@ -158,6 +159,7 @@ "name": "Create Monster", "words": "/m", "script": "MonsterCreator", + "description": "", "mana": 0, "cooldown": "0", "level": 1, @@ -167,6 +169,7 @@ "name": "Up", "words": "/up", "script": "UpDownCommand", + "description": "", "mana": 0, "cooldown": "0", "level": 1, @@ -176,6 +179,7 @@ "name": "Down", "words": "/down", "script": "UpDownCommand", + "description": "", "mana": 0, "cooldown": "0", "level": 1, @@ -185,6 +189,7 @@ "name": "Teleport", "words": "/a", "script": "TeleportCommand", + "description": "", "mana": 0, "cooldown": "0", "level": 1, @@ -194,6 +199,7 @@ "name": "Hide", "words": "/hide", "script": "HideCommand", + "description": "", "mana": 0, "cooldown": "0", "level": 1, @@ -203,6 +209,7 @@ "name": "Reload", "words": "/reload", "script": "ReloadCommand", + "description": "", "mana": 0, "cooldown": "0", "level": 1, @@ -212,6 +219,7 @@ "name": "PullPlayer", "words": "/c", "script": "PullPlayerCommand", + "description": "", "mana": 0, "cooldown": "0", "level": 1, @@ -221,6 +229,7 @@ "name": "TeleportToTemple", "words": "/t", "script": "TeleportToTempleCommand", + "description": "For teleport the temple.", "mana": 0, "cooldown": "0", "level": 1, @@ -230,6 +239,7 @@ "name": "GoTo", "words": "/goto", "script": "GoToCommand", + "description": "For teleport the player for some location.", "mana": 0, "cooldown": "0", "level": 1, @@ -239,6 +249,7 @@ "name": "Kick Player", "words": "/kick", "script": "KickPlayerCommand", + "description": "To kick an player.", "mana": 0, "cooldown": "0", "level": 1, @@ -249,6 +260,7 @@ "name": "Kick All Players", "words": "/masskick", "script": "MassKickPlayersCommand", + "description": "To masskick list of player.", "mana": 0, "cooldown": "0", "level": 1, @@ -259,6 +271,7 @@ "name": "Ban Player", "words": "/ban", "script": "BanPlayerCommand", + "description": "To ban someone player.", "mana": 0, "cooldown": "0", "level": 1, @@ -269,6 +282,7 @@ "name": "Attributes on Player", "words": "/attr", "script": "AttrPlayerCommand", + "description": "Add attributes for the player.", "mana": 0, "cooldown": "0", "level": 1, @@ -279,6 +293,7 @@ "name": "List Commands", "words": "/commands", "script": "ListCommandsCommand", + "description": "Get list of server commands.", "mana": 0, "cooldown": "0", "level": 1, @@ -289,6 +304,29 @@ "name": "Broadcast", "words": "/bc", "script": "BroadcastCommand", + "description": "Send message for everyone on Server.", + "mana": 0, + "cooldown": "0", + "level": 1, + "vocations": [11], + "type": "command" + }, + { + "name": "Info", + "words": "/info", + "description": "Get informations about the player!", + "script": "InfoCommand", + "mana": 0, + "cooldown": "0", + "level": 1, + "vocations": [11], + "type": "command" + }, +{ + "name": "Spy", + "words": "/spy", + "description": "Get informations of Player inventory!", + "script": "SpyPlayerCommand", "mana": 0, "cooldown": "0", "level": 1, diff --git a/src/Standalone/appsettings.Local.json b/src/Standalone/appsettings.Local.json index dc414e629..fc96c39c8 100644 --- a/src/Standalone/appsettings.Local.json +++ b/src/Standalone/appsettings.Local.json @@ -3,6 +3,6 @@ "data": "../../data" }, "database": { - "active": "SQLITE" + "active": "INMEMORY" } } \ No newline at end of file