Jump to content

Mod Examples

From fCraft Wiki
Revision as of 04:28, 23 June 2011 by F (talk | contribs)

This page demonstrates how to modify and extend fCraft.

Calling custom code at regular intervals

The following example will call BleepTask method every 10 seconds.

// Interval at which your callback is called
TimeSpan bleepInterval = TimeSpan.FromSeconds( 10 );

// Adding your callback
Scheduler.NewTask( BleepTask ).RunForever( bleepInterval );

// Your callback. Implements SchedulerCallback delegate.
void BleepTask( SchedulerTask task ){
    Chat.Say( Player.Console, "bleep" );
}

Besides RunForever(TimeSpan), SchedulerTask has many Run* methods for running a task once, several times, or forever - with different delays and at different intervals.


Reacting to server shutdown

There are two events associated with shutdown: Server.ShutdownBegan and Server.ShutdownEnded. Both supply a ShutdownEventArgs object that provides information about the shutdown parameters.

// Subscribing to the event
Server.ShutdownBegan += OnShutdown;

// Event handler
void OnShutdown( object sender, ShutdownEventArgs e ){
    Console.Write( "The end is near! Specifically, it's {0} seconds away.",
                   e.Delay );
    if( e.Restart ){
        Console.Write( "But we will be back shortly." );
    }
}


Adding a new command

New commands can be added by calling CommandManager.RegisterCustomCommand. You need to provide a CommandDescriptor object. If there is any conflict between your command and existing ones, or if some aspect of your command's descriptor is unacceptible, a CommandRegistrationException will be thrown.

// Command descriptor
CommandDescriptor CdBleep = new CommandDescriptor {
    Name = "bleep",
    Aliases = new[] { "bloop" },
    Category = CommandCategory.Chat,
    Permissions = new[] { Permission.Chat },
    Help = "Prints a number of bleeps in chat.",
    Usage = "/bleep [Times]",
    Handler = Bleep
};

// Command handler - must implement CommandHandler delegate
void Bleep( Player player, Command cmd ){
    int numberOfBleeps;

    // try to parse next argument as a number
    if( !cmd.NextInt( out numberOfBleeps ) ){
        // fall back to 10 if no number was given
        numberOfBleeps = 10;
    }

    // check the range
    if( numberOfBleeps < 1 || numberOfBleeps > 32 ){
        player.Message( "Specify between 1 and 32 bleeps." );
        return;
    }

    for( int i=0; i<numberOfBleeps; i++ ){
        Chat.SendGlobal( player, "bleep" );
    }
}

// Registering your command with the server
CommandManager.RegisterCustomCommand( CdBleep );