mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-10-06 04:25:05 -04:00
112 lines
3.2 KiB
C#
112 lines
3.2 KiB
C#
// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace ClassicalSharp.Commands {
|
|
|
|
public class CommandList : IGameComponent {
|
|
|
|
const string prefix = "/client";
|
|
public bool IsCommandPrefix( string input ) {
|
|
if( game.Server.IsSinglePlayer && Utils.CaselessStarts( input, "/" ) )
|
|
return true;
|
|
|
|
return Utils.CaselessStarts( input, prefix + " " )
|
|
|| Utils.CaselessEquals( input, prefix );
|
|
}
|
|
|
|
protected Game game;
|
|
public List<Command> RegisteredCommands = new List<Command>();
|
|
public void Init( Game game ) {
|
|
this.game = game;
|
|
Register( new CommandsCommand() );
|
|
Register( new GpuInfoCommand() );
|
|
Register( new HelpCommand() );
|
|
Register( new RenderTypeCommand() );
|
|
|
|
if( !game.Server.IsSinglePlayer ) return;
|
|
Register( new ModelCommand() );
|
|
Register( new CuboidCommand() );
|
|
}
|
|
|
|
public void Ready( Game game ) { }
|
|
public void Reset( Game game ) { }
|
|
public void OnNewMap( Game game ) { }
|
|
public void OnNewMapLoaded( Game game ) { }
|
|
|
|
public void Register( Command command ) {
|
|
command.game = game;
|
|
for( int i = 0; i < RegisteredCommands.Count; i++ ) {
|
|
Command cmd = RegisteredCommands[i];
|
|
if( Utils.CaselessEquals( cmd.Name, command.Name ) )
|
|
throw new InvalidOperationException( "Another command already has name : " + command.Name );
|
|
}
|
|
RegisteredCommands.Add( command );
|
|
}
|
|
|
|
public Command GetMatch( string cmdName ) {
|
|
Command match = null;
|
|
for( int i = 0; i < RegisteredCommands.Count; i++ ) {
|
|
Command cmd = RegisteredCommands[i];
|
|
if( !Utils.CaselessStarts( cmd.Name, cmdName ) ) continue;
|
|
|
|
if( match != null ) {
|
|
game.Chat.Add( "&e/client: Multiple commands found that start with: \"&f" + cmdName + "&e\"." );
|
|
return null;
|
|
}
|
|
match = cmd;
|
|
}
|
|
|
|
if( match == null )
|
|
game.Chat.Add( "&e/client: Unrecognised command: \"&f" + cmdName + "&e\"." );
|
|
return match;
|
|
}
|
|
|
|
static char[] splitChar = { ' ' };
|
|
public void Execute( string text ) {
|
|
if( Utils.CaselessStarts( text, prefix ) ) { // /client command args
|
|
text = text.Substring( prefix.Length ).TrimStart( splitChar );
|
|
} else { // /command args
|
|
text = text.Substring( 1 );
|
|
}
|
|
|
|
if( text.Length == 0 ) { // only / or /client
|
|
game.Chat.Add( "&eList of client commands:" );
|
|
PrintDefinedCommands( game );
|
|
game.Chat.Add( "&eTo see a particular command's help, type /client help [cmd name]" );
|
|
return;
|
|
}
|
|
|
|
string[] args = text.Split( splitChar );
|
|
Command cmd = GetMatch( args[0] );
|
|
if( cmd == null ) return;
|
|
cmd.Execute( args );
|
|
}
|
|
|
|
public void PrintDefinedCommands( Game game ) {
|
|
StringBuffer sb = new StringBuffer( Utils.StringLength );
|
|
int index = 0;
|
|
|
|
for( int i = 0; i < RegisteredCommands.Count; i++ ) {
|
|
Command cmd = RegisteredCommands[i];
|
|
string name = cmd.Name;
|
|
|
|
if( (sb.Length + name.Length + 2) > sb.Capacity ) {
|
|
game.Chat.Add( sb.ToString() );
|
|
sb.Clear();
|
|
index = 0;
|
|
}
|
|
sb.Append( ref index, name );
|
|
sb.Append( ref index, ", " );
|
|
}
|
|
|
|
if( sb.Length > 0 )
|
|
game.Chat.Add( sb.ToString() );
|
|
}
|
|
|
|
public void Dispose() {
|
|
RegisteredCommands.Clear();
|
|
}
|
|
}
|
|
}
|