first commit

This commit is contained in:
Beyhan Oğur
2026-09-03 04:45:36 +03:00
commit d5f52cc3d3
1038 changed files with 169579 additions and 0 deletions
@@ -0,0 +1,212 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ClassicAssist.Shared;
using ClassicAssist.Data.Macros.Commands;
using ClassicAssist.Shared.Resources;
using ClassicAssist.UO.Data;
using ClassicAssist.UO.Objects;
using UOC = ClassicAssist.Shared.UO.Commands;
// ReSharper disable UnusedVariable
namespace ClassicAssist.Data.Commands
{
public class CommandsManager
{
private static Dictionary<string, Func<string[], bool>> _commands;
private static readonly byte[] _speechPacketIDs = { 0xAD, 0x03 };
public static void Initialize()
{
_commands = new Dictionary<string, Func<string[], bool>>
{
{ "help", OnHelp },
{ "where", OnSendLocation },
{ "addfriend", OnAddFriend },
{ "removefriend", OnRemoveFriend },
{ "info", OnInfo },
{ "resync", OnResync },
{ "hide", OnHide }
};
}
private static bool OnHide( string[] arg )
{
Task.Run( async () =>
{
int serial = await UOC.GetTargeSerialAsync();
if ( serial == 0 )
{
UOC.SystemMessage( Strings.Cannot_find_item___ );
return;
}
UOC.RemoveObject( serial );
} );
return true;
}
private static bool OnResync( string[] arg )
{
MainCommands.Resync();
return true;
}
private static bool OnInfo( string[] arg )
{
//TODO
//Task.Run( async () => await UOC.InspectObjectAsync() );
return true;
}
private static bool OnRemoveFriend( string[] args )
{
if ( args.Length != 0 )
{
return false;
}
Task.Run( () => MobileCommands.RemoveFriend() );
return true;
}
private static bool OnAddFriend( string[] args )
{
if ( args.Length != 0 )
{
return false;
}
Task.Run( () => MobileCommands.AddFriend() );
return true;
}
private static bool OnHelp( string[] args )
{
if ( args.Length != 0 )
{
return false;
}
string[] commands = _commands.Select( kvp => kvp.Key ).ToArray();
UOC.SystemMessage( $"{Strings.Commands_} {string.Join( " ", commands )}" );
return true;
}
public static bool IsSpeechPacket( byte packetId )
{
return _speechPacketIDs?.Contains( packetId ) ?? false;
}
private static bool OnSendLocation( string[] args )
{
if ( Engine.Player == null )
{
return false;
}
PlayerMobile player = Engine.Player;
if ( args?.Length != 0 )
{
return false;
}
UOC.SystemMessage( $"{Strings.Current_Location_} {player.X}, {player.Y}, {player.Map}" );
UOC.SystemMessage( $"Region: {Regions.Regions.GetRegion( Engine.Player )}" );
return true;
}
public static bool CheckCommand( byte[] data, int length )
{
string text = null;
if ( data[0] == 0xAD )
{
text = ParseUnicodeSpeech( data, data.Length );
}
else if ( data[0] == 0x03 )
{
text = ParseAsciiSpeech( data, data.Length );
}
if ( string.IsNullOrEmpty( text ) || text[0] != Options.CurrentOptions.CommandPrefix )
{
return false;
}
string[] args = text.Remove( 0, 1 ).Split( ' ' );
return _commands.ContainsKey( args[0] ) && _commands[args[0]].Invoke( args.Skip( 1 ).ToArray() );
}
private static string ParseAsciiSpeech( byte[] data, int length )
{
PacketReader reader = new PacketReader( data, length, false );
int messageType = reader.ReadByte();
int hue = reader.ReadInt16();
int font = reader.ReadInt16();
string text = reader.ReadString();
return text.Trim();
}
internal static string ParseUnicodeSpeech( byte[] data, int length )
{
PacketReader reader = new PacketReader( data, length, false );
int messageType = reader.ReadByte();
int hue = reader.ReadInt16();
int font = reader.ReadInt16();
string lang = reader.ReadString( 4 );
string text;
// skip keywords
if ( ( messageType & 0xC0 ) != 0 )
{
//https://github.com/runuo/runuo/blob/master/Server/Network/PacketHandlers.cs
int count = ( reader.ReadInt16() & 0xFFF0 ) >> 4;
if ( count < 0 || count > 50 )
{
return null;
}
for ( int i = 0; i < count; ++i )
{
if ( ( i & 1 ) == 0 )
{
reader.ReadByte();
}
else
{
reader.ReadInt16();
}
}
text = reader.ReadString();
}
else
{
text = reader.ReadUnicodeString();
}
return text.Trim();
}
}
}