Crossfire Server, Trunk
server.cpp File Reference
#include "global.h"
#include <assert.h>
#include <ctype.h>
#include <fcntl.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "object.h"
#include "path.h"
#include "random_maps/random_map.h"
#include "random_maps/rproto.h"
#include "sproto.h"
#include "tod.h"
#include "version.h"
#include "server.h"
+ Include dependency graph for server.cpp:

Go to the source code of this file.

Macros

#define PORTAL_DESTINATION_NAME   "Town portal destination" /* this one should really be in a header file */
 
#define SPEED_DEBUG
 

Functions

bool check_password (const char *typed, const char *crypted)
 
static bool check_shutdown (void)
 
static char * clean_path (const char *file, char *newpath, int size)
 
void clean_tmp_files (void)
 
void cleanup (void)
 
static char const * crypt_string (char const *str, char const *salt)
 
static void do_follow (player *pl)
 
static void do_shutdown (void)
 
static void do_specials (void)
 
void enter_exit (object *op, object *exit_ob)
 
static void enter_fixed_template_map (object *pl, object *exit_ob)
 
static void enter_map (object *op, mapstruct *newmap, int x, int y)
 
void enter_player_maplevel (object *op)
 
void enter_player_savebed (object *op)
 
static void enter_random_map (object *pl, object *exit_ob)
 
static void enter_random_template_map (object *pl, object *exit_ob)
 
static void enter_unique_map (object *op, object *exit_ob)
 
int forbid_play (void)
 
void leave (player *pl, int draw_exit)
 
void login_check_shutdown (object *const op)
 
static int move_towards (object *ob, object *towards, unsigned int mindist)
 
char const * newhash (char const *password)
 
static bool object_in_icecube (object *op)
 
static bool object_on_exit (object *ob, object *exit)
 
void player_map_change_common (object *op, mapstruct *const oldmap, mapstruct *const newmap)
 
void process_events (void)
 
static void process_players1 (void)
 
static void process_players2 (void)
 
static void save_and_kick_all_players (void)
 
void server_main (int argc, char *argv[])
 
void set_map_timeout (mapstruct *oldmap)
 
static char * unclean_path (const char *src, char *newpath, int size)
 

Variables

static const char * days [] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}
 
volatile sig_atomic_t shutdown_flag
 
static const int shutdown_warn_times [] = {120, 90, 60, 45, 30, 15, 10, 5, 4, 3, 2, 1}
 

Detailed Description

Main server functions.

Definition in file server.cpp.

Macro Definition Documentation

◆ PORTAL_DESTINATION_NAME

#define PORTAL_DESTINATION_NAME   "Town portal destination" /* this one should really be in a header file */

◆ SPEED_DEBUG

#define SPEED_DEBUG

Definition at line 1069 of file server.cpp.

Function Documentation

◆ check_password()

bool check_password ( const char *  typed,
const char *  crypted 
)

Hash a password and compare it to the stored version.

Parameters
typedPassword entered by the user (not hashed).
cryptedStored password to check against (hashed).
Returns
True if the passwords match, false otherwise.

Definition at line 114 of file server.cpp.

References crypt_string(), llevError, and LOG().

Referenced by account_change_password(), account_login(), check_login(), receive_player_password(), and verify_player().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ check_shutdown()

static bool check_shutdown ( void  )
static

Check if we're ready to shut the server down.

Definition at line 1426 of file server.cpp.

References count_players(), draw_ext_info_format(), llevInfo, LOG(), MSG_TYPE_ADMIN, MSG_TYPE_ADMIN_DM, NDI_ALL, NDI_UNIQUE, shutdown_s::next_warn, shutdown_flag, SHUTDOWN_IDLE, SHUTDOWN_NONE, shutdown_state, SHUTDOWN_TIME, shutdown_warn_times, shutdown_s::time, and shutdown_s::type.

Referenced by do_specials().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ clean_path()

static char* clean_path ( const char *  file,
char *  newpath,
int  size 
)
static

Takes a path and replaces all / with _ We do a strcpy so that we do not change the original string.

Parameters
filepath to clean.
newpathbuffer that will contain the cleaned path. Should be at least as long as file.
sizelength of newpath.
Returns
newpath.

Definition at line 322 of file server.cpp.

References mad_mage_user::file, and strlcpy().

Referenced by enter_unique_map().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ clean_tmp_files()

void clean_tmp_files ( void  )

Save unique maps and clean up temporary map files unless recycling temporary maps. The function name is somewhat misleading.

Definition at line 1226 of file server.cpp.

References clean_tmp_map(), first_map, m, MAP_IN_MEMORY, give::next, Settings::recycle_tmp_maps, save_map(), SAVE_MODE_NORMAL, settings, swap_map(), and write_todclock().

Referenced by cleanup().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ cleanup()

◆ crypt_string()

static char const* crypt_string ( char const *  str,
char const *  salt 
)
static

Encrypt a string. Used for password storage on disk.

Really, there is no reason to crypt the passwords any system. But easier to just leave this enabled for backward compatibility. Put the simple case at top - no encryption - makes it easier to read.

Parameters
strstring to crypt.
saltsalt to crypt with.
Returns
crypted str.
Todo:
make thread-safe?

Definition at line 70 of file server.cpp.

References c, Settings::crypt_mode, make_face_from_files::int, RANDOM, settings, and make_face_from_files::str.

Referenced by check_password(), and newhash().

+ Here is the caller graph for this function:

◆ do_follow()

static void do_follow ( player pl)
static

◆ do_shutdown()

static void do_shutdown ( void  )
static

Definition at line 1414 of file server.cpp.

References cleanup(), draw_ext_info(), MSG_TYPE_ADMIN, MSG_TYPE_ADMIN_DM, NDI_ALL, NDI_UNIQUE, and save_and_kick_all_players().

Referenced by do_specials().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ do_specials()

static void do_specials ( void  )
static

Collection of functions to call from time to time.

Modified 2000-1-14 MSW to use the global pticks count to determine how often to do things. This will allow us to spred them out more often. I use prime numbers for the factor count - in that way, it is less likely these actions will fall on the same tick (compared to say using 500/2500/15000 which would mean on that 15,000 tick count a whole bunch of stuff gets done). Of course, there can still be times where multiple specials are done on the same tick, but that will happen very infrequently

I also think this code makes it easier to see how often we really are doing the various things.

Definition at line 1519 of file server.cpp.

References accounts_save(), check_shutdown(), clean_friendly_list(), CS_LOGTIME, cst_lst, do_shutdown(), fix_luck(), fix_weight(), flush_old_maps(), knowledge_process_incremental(), metaserver_update(), party_obsolete_parties(), pticks, PTICKS_PER_CLOCK, tick_the_clock(), CS_Stats::time_start, watchdog(), write_book_archive(), and write_cs_stats().

Referenced by server_main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ enter_exit()

void enter_exit ( object op,
object exit_ob 
)

Tries to move 'op' to exit_ob.

Largely redone by MSW 2001-01-21 - this function was overly complex and had some obscure bugs.

May call abort() in some situations.

Parameters
opcharacter or monster that is using the exit.
exit_obexit object (boat, door, teleporter, etc.)

Definition at line 727 of file server.cpp.

References AP_UNAPPLY, object::attacktype, buf, living::dam, draw_ext_info_format(), enter_fixed_template_map(), enter_map(), enter_random_map(), enter_random_template_map(), enter_unique_map(), EXIT_PATH, EXIT_X, EXIT_Y, FLAG_DAMNED, FLAG_UNIQUE, FLAG_UNPAID, FOR_OB_AND_BELOW_FINISH, FOR_OB_AND_BELOW_PREPARE, FORCE, FREE_OBJ_NO_DESTROY_CALLBACK, hit_player(), HUGE_BUF, llevDebug, LOG(), object::map, MAP_ENTER_X, MAP_ENTER_Y, map_path_unique(), MAP_PLAYER_UNIQUE, MAX_BUF, object::msg, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_FAILURE, MSG_TYPE_SPELL, MSG_TYPE_SPELL_FAILURE, object::name, NDI_UNIQUE, ob_apply(), ob_describe(), object_copy(), object_find_by_type_and_slaying(), object_free(), object_new(), object_remove(), object_update_speed(), give::op, mapstruct::path, path_combine_and_normalize(), PLAYER, PORTAL_DESTINATION_NAME, QUERY_FLAG, ready_map_name(), save_player(), SP_WORD_OF_RECALL, object::speed, object::stats, object::subtype, Ice::tmp, diamondslots::x, and diamondslots::y.

Referenced by command_reset(), command_summon(), command_teleport(), create_player_cmd(), do_follow(), do_goto(), enter_player_savebed(), execute_word_of_recall(), exit_type_apply(), exit_type_move_on(), key_change_class(), move_teleporter(), player_arrest(), and player_changer_type_process().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ enter_fixed_template_map()

static void enter_fixed_template_map ( object pl,
object exit_ob 
)
static

The player is trying to enter a non-randomly generated template map. In this case, use a map file for a template.

Parameters
plplayer.
exit_obexit containing template map parameters.

Definition at line 448 of file server.cpp.

References create_pathname(), create_template_pathname(), draw_ext_info_format(), enter_map(), EXIT_PATH, EXIT_X, EXIT_Y, HUGE_BUF, mapstruct::is_template, llevError, LOG(), object::map, MAP_PLAYER_UNIQUE, mapfile_load(), MAX_BUF, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_FAILURE, mapstruct::name, object::name, NDI_UNIQUE, python_init::path, mapstruct::path, path_combine_and_normalize(), altar_valkyrie::pl, ready_map_name(), replace(), strlcpy(), object::x, and object::y.

Referenced by enter_exit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ enter_map()

static void enter_map ( object op,
mapstruct newmap,
int  x,
int  y 
)
static

◆ enter_player_maplevel()

void enter_player_maplevel ( object op)

Move a player to its stored map level. This function is used to place the player just after logging in. Since the map may no longer exist, dump the player to an alternative 'emergency' location if that's the case.

Definition at line 682 of file server.cpp.

References draw_ext_info_format(), Settings::emergency_mapname, Settings::emergency_x, Settings::emergency_y, enter_map(), flags, llevError, LOG(), MAP_ENTER_X, MAP_ENTER_Y, MSG_TYPE_MISC, NDI_UNIQUE, give::op, PLAYER, ready_map_name(), settings, diamondslots::x, and diamondslots::y.

Referenced by check_login(), and set_first_map().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ enter_player_savebed()

void enter_player_savebed ( object op)

This is a basic little function to put the player back to his savebed. We do some error checking - its possible that the savebed map may no longer exist, so we make sure the player goes someplace.

Parameters
opplayer.

Definition at line 142 of file server.cpp.

References add_string(), Settings::emergency_mapname, Settings::emergency_x, Settings::emergency_y, enter_exit(), EXIT_PATH, EXIT_X, EXIT_Y, FREE_OBJ_NO_DESTROY_CALLBACK, free_string(), llevDebug, LOG(), MAX_BUF, object_free(), object_new(), give::op, mapstruct::path, safe_strncpy, settings, and Ice::tmp.

Referenced by kill_player_not_permadeath(), and save_life().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ enter_random_map()

static void enter_random_map ( object pl,
object exit_ob 
)
static

The player is trying to enter a randomly generated map. In this case, generate the random map as needed.

Parameters
plplayer.
exit_obexit containing random map parameters.

Definition at line 375 of file server.cpp.

References add_string(), buf, enter_map(), EXIT_PATH, EXIT_X, EXIT_Y, RMParms::final_map, generate_random_map(), get_region_by_map(), HUGE_BUF, RMParms::link_source_map, object::map, MAP_ENTER_X, MAP_ENTER_Y, object::msg, RMParms::origin_map, RMParms::origin_x, RMParms::origin_y, mapstruct::path, altar_valkyrie::pl, RMParms::region, mapstruct::reset_group, safe_strncpy, set_random_map_variable(), strlcpy(), diamondslots::x, object::x, RMParms::Xsize, diamondslots::y, object::y, and RMParms::Ysize.

Referenced by enter_exit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ enter_random_template_map()

static void enter_random_template_map ( object pl,
object exit_ob 
)
static

The player is trying to enter a randomly generated template map. In this case, generate the map as needed.

Parameters
plplayer.
exit_obexit containing random template map parameters.

Definition at line 539 of file server.cpp.

References create_template_pathname(), enter_map(), EXIT_PATH, EXIT_X, EXIT_Y, generate_random_map(), get_region_by_map(), HUGE_BUF, mapstruct::is_template, object::map, MAP_ENTER_X, MAP_ENTER_Y, MAP_PLAYER_UNIQUE, MAX_BUF, object::msg, mapstruct::name, RMParms::origin_map, RMParms::origin_x, RMParms::origin_y, mapstruct::path, path_combine_and_normalize(), altar_valkyrie::pl, ready_map_name(), RMParms::region, replace(), mapstruct::reset_group, safe_strncpy, set_random_map_variable(), strlcpy(), diamondslots::x, object::x, RMParms::Xsize, diamondslots::y, object::y, and RMParms::Ysize.

Referenced by enter_exit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ enter_unique_map()

static void enter_unique_map ( object op,
object exit_ob 
)
static

Player is entering a unique map.

Parameters
opplayer.
exit_obexit containing unique map information.

Definition at line 607 of file server.cpp.

References apply_auto_fix(), clean_path(), draw_ext_info_format(), enter_map(), EXIT_PATH, EXIT_X, EXIT_Y, HUGE_BUF, llevDebug, LOG(), object::map, MAP_PLAYER_UNIQUE, mapfile_load(), MAX_BUF, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_FAILURE, object::name, NDI_UNIQUE, give::op, python_init::path, mapstruct::path, path_combine_and_normalize(), ready_map_name(), strlcpy(), unclean_path(), mapstruct::unique, object::x, and object::y.

Referenced by enter_exit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ forbid_play()

int forbid_play ( void  )

Checks if server should be started.

Returns
1 if play is forbidden, 0 if ok.
Todo:
document forbidden stuff.

Definition at line 1359 of file server.cpp.

References buf, Settings::confdir, days, llevDebug, LOG(), logfile, MAX_BUF, PERM_FILE, settings, and roll-o-matic::stop().

Referenced by init_startup().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ leave()

void leave ( player pl,
int  draw_exit 
)

Player logs out, or was disconnected.

Parameters
plplayer.
draw_exitif set, display leaving message to other players.

Definition at line 1298 of file server.cpp.

References DEAD_OBJECT, draw_ext_info_format(), FLAG_REMOVED, FLAG_WIZ, hiscore_check(), llevInfo, LOG(), MAP_IN_MEMORY, MAP_TIMEOUT, MAX_BUF, MSG_TYPE_ADMIN, MSG_TYPE_ADMIN_PLAYER, give::name, NDI_ALL, NDI_DK_ORANGE, NDI_UNIQUE, Ns_Dead, object_remove(), party_leave(), pets_terminate_all(), altar_valkyrie::pl, QUERY_FLAG, query_name(), ST_CONFIRM_PASSWORD, ST_GET_NAME, and ST_GET_PASSWORD.

Referenced by check_login(), do_server(), receive_play_again(), save_and_kick_all_players(), and shop_mat_type_move_on().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ login_check_shutdown()

void login_check_shutdown ( object *const  op)

Warn op if a server shutdown is scheduled. Used to inform players about scheduled shutdowns when they log in.

Definition at line 1483 of file server.cpp.

References draw_ext_info_format(), MSG_TYPE_ADMIN, MSG_TYPE_ADMIN_DM, NDI_UNIQUE, give::op, SHUTDOWN_IDLE, SHUTDOWN_NONE, shutdown_state, SHUTDOWN_TIME, shutdown_warn_times, shutdown_s::time, and shutdown_s::type.

Referenced by check_login().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ move_towards()

static int move_towards ( object ob,
object towards,
unsigned int  mindist 
)
static

Move 'ob' in the direction of 'towards' (without any pathfinding) if the two objects are farther than 'mindist' apart. Used to implement do_follow().

Returns
Direction to move in, or zero if cannot move.

Definition at line 886 of file server.cpp.

References rv_vector::direction, rv_vector::distance, get_rangevector(), move_player(), and guildjoin::ob.

Referenced by do_follow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ newhash()

char const* newhash ( char const *  password)

Definition at line 101 of file server.cpp.

References crypt_string().

Referenced by account_change_password(), account_new(), create_player_cmd(), and receive_player_password().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ object_in_icecube()

static bool object_in_icecube ( object op)
static

Definition at line 1071 of file server.cpp.

References give::op.

Referenced by process_events().

+ Here is the caller graph for this function:

◆ object_on_exit()

static bool object_on_exit ( object ob,
object exit 
)
static

Return true if the player object is on the given exit. This is required because some multi-tile exits are unpassable from a certain direction.

Definition at line 899 of file server.cpp.

References guildjoin::ob, object_get_multi_size(), diamondslots::x, object::x, diamondslots::y, and object::y.

Referenced by do_follow().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ player_map_change_common()

void player_map_change_common ( object op,
mapstruct *const  oldmap,
mapstruct *const  newmap 
)

Definition at line 282 of file server.cpp.

References EVENT_MAPENTER, EVENT_MAPLEAVE, events_execute_global_event(), give::op, player_update_bg_music(), mapstruct::players, set_map_timeout(), and mapstruct::timeout.

Referenced by enter_map(), and move_player_attack().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ process_events()

◆ process_players1()

static void process_players1 ( void  )
static

Do all player-related stuff before objects have been updated.

See also
process_players2().

Definition at line 956 of file server.cpp.

References AUTOSAVE, Settings::casting_time, do_follow(), do_some_living(), first_player, FLAG_REMOVED, get_map_flags(), handle_newcs_player(), hiscore_check(), P_NO_CLERIC, altar_valkyrie::pl, pticks, QUERY_FLAG, save_player(), settings, ST_PLAYING, and TRUE.

Referenced by process_events().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ process_players2()

static void process_players2 ( void  )
static

Do all player-related stuff after objects have been updated.

See also
process_players1().
Todo:
explain why 2 passes for players.

Definition at line 1048 of file server.cpp.

References first_player, and altar_valkyrie::pl.

Referenced by process_events().

+ Here is the caller graph for this function:

◆ save_and_kick_all_players()

static void save_and_kick_all_players ( void  )
static

Definition at line 1404 of file server.cpp.

References final_free_player(), first_player, leave(), altar_valkyrie::pl, and save_player().

Referenced by do_shutdown().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ server_main()

void server_main ( int  argc,
char *  argv[] 
)

Server main function.

Parameters
argclength of argv.
argvcommand-line options.

Definition at line 1574 of file server.cpp.

References bRunning, cftimer_process_timers(), check_active_maps(), do_server(), do_specials(), EVENT_CLOCK, events_execute_global_event(), init(), initPlugins(), llevInfo, LOG(), nroferrors, process_events(), PROFILE_BEGIN, PROFILE_END, tick_game_time(), TRUE, and update_players().

Referenced by main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ set_map_timeout()

void set_map_timeout ( mapstruct oldmap)

Enable swapping for the given map. Called when all players leave a map, because maps with players are marked as ineligible for swap.

Parameters
oldmapmap to process.

Definition at line 305 of file server.cpp.

References MAP_MINTIMEOUT, and mapstruct::timeout.

Referenced by flush_old_maps(), place_exits(), and player_map_change_common().

+ Here is the caller graph for this function:

◆ unclean_path()

static char* unclean_path ( const char *  src,
char *  newpath,
int  size 
)
static

Takes a path and replaces all _ with / This basically undoes clean_path(). We do a strcpy so that we do not change the original string. We are smart enough to start after the last / in case we are getting passed a string that points to a unique map path.

Parameters
srcpath to unclean.
newpathbuffer that will contain the uncleaned path. Should be at least as long as file.
sizelength of newpath.
Returns
newpath.

Definition at line 350 of file server.cpp.

References strlcpy().

Referenced by enter_unique_map().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ days

const char* days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}
static

Ingame days.

Definition at line 51 of file server.cpp.

Referenced by forbid_play().

◆ shutdown_flag

volatile sig_atomic_t shutdown_flag

Definition at line 53 of file server.cpp.

Referenced by check_shutdown(), and signal_shutdown().

◆ shutdown_warn_times

const int shutdown_warn_times[] = {120, 90, 60, 45, 30, 15, 10, 5, 4, 3, 2, 1}
static

How many minutes before a shutdown to warn players, in reverse order.

Definition at line 48 of file server.cpp.

Referenced by check_shutdown(), and login_check_shutdown().