Crossfire Server, Trunk  R20513
Macros | Functions | Variables
request.c File Reference

Client handling. More...

#include "global.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include "commands.h"
#include "living.h"
#include "newserver.h"
#include "shared/newclient.h"
#include "sounds.h"
#include "sproto.h"
Include dependency graph for request.c:

Go to the source code of this file.

Macros

#define AddIfFloat(Old, New, Type)
 
#define AddIfInt(Old, New, Type)
 
#define AddIfInt64(Old, New, Type)
 
#define AddIfShort(Old, New, Type)
 
#define AddIfString(Old, New, Type)
 
#define MAX_CHOICES   100
 
#define MAX_HEAD_POS   MAX(MAX_CLIENT_X, MAX_CLIENT_Y)
 

Functions

void account_add_player_cmd (char *buf, int len, socket_struct *ns)
 Handle accountaddplayer from server (add a character to this account). More...
 
static int account_block_create (const socket_struct *ns)
 Checks if account creation is blocked for this connection. More...
 
void account_login_cmd (char *buf, int len, socket_struct *ns)
 Handles the account login. More...
 
void account_new_cmd (char *buf, int len, socket_struct *ns)
 Handles the account creation This function shares a fair amount of the same logic as account_login_cmd() above. More...
 
void account_password (char *buf, int len, socket_struct *ns)
 Handles the account password change. More...
 
void account_play_cmd (char *buf, int len, socket_struct *ns)
 We have received an accountplay command. More...
 
static void add_char_field (SockList *sl, int type, const char *data)
 Basic helper function which adds a piece of data for the accountplayers protocol command. More...
 
void add_me_cmd (char *buf, int len, socket_struct *ns)
 The client has requested to be added to the game. More...
 
static void append_spell (player *pl, SockList *sl, object *spell)
 appends the spell *spell to the Socklist we will send the data to. More...
 
void ask_smooth_cmd (char *buf, int len, socket_struct *ns)
 Tells client the picture it has to use to smooth a picture number given as argument. More...
 
static int check_probe (int ax, int ay, const object *ob, SockList *sl, socket_struct *ns, int *has_obj, int *alive_layer)
 Check if a hp bar should be added to the map square. More...
 
static void check_space_for_heads (int ax, int ay, SockList *sl, socket_struct *ns)
 
void create_player_cmd (char *buf, int len, socket_struct *ns)
 We have received a createplayer command. More...
 
static int decode_name_password (const char *buf, int *len, char *name, char *password)
 This is a basic routine which extracts the name/password from the buffer. More...
 
void draw_client_map (object *pl)
 Draws client map. More...
 
void draw_client_map2 (object *pl)
 
void esrv_add_spells (player *pl, object *spell)
 This tells the client to add the spell *spell, if spell is NULL, then add all spells in the player's inventory. More...
 
void esrv_map_scroll (socket_struct *ns, int dx, int dy)
 
void esrv_new_player (player *pl, uint32_t weight)
 Tells the client that here is a player it should start using. More...
 
void esrv_remove_spell (player *pl, object *spell)
 
void esrv_send_animation (socket_struct *ns, short anim_num)
 Need to send an animation sequence to the client. More...
 
void esrv_send_pickup (player *pl)
 Sends the "pickup" state to pl if client wants it requested. More...
 
void esrv_update_spells (player *pl)
 This looks for any spells the player may have that have changed their stats. More...
 
void esrv_update_stats (player *pl)
 Sends a statistics update. More...
 
static int map2_add_ob (int ax, int ay, int layer, const object *ob, SockList *sl, socket_struct *ns, int *has_obj, int is_head)
 object 'ob' at 'ax,ay' on 'layer' is visible to the client. More...
 
static int map2_delete_layer (int ax, int ay, int layer, SockList *sl, socket_struct *ns)
 
static void map_clearcell (struct map_cell_struct *cell, int face, int count)
 Clears a map cell. More...
 
void map_newmap_cmd (socket_struct *ns)
 Sound related function. More...
 
void move_cmd (char *buf, int len, player *pl)
 Moves an object (typically, container to inventory). More...
 
void new_player_cmd (uint8_t *buf, int len, player *pl)
 This handles the commands issued by the player (ie, north, fire, cast, etc.). More...
 
void reply_cmd (char *buf, int len, player *pl)
 This is a reply to a previous query. More...
 
void send_account_players (socket_struct *ns)
 Upon successful login/account creation, we send a list of characters associated with the account to the client - in this way, it lets the client present a nice list so that the player can choose one. More...
 
void send_plugin_custom_message (object *pl, char *buf)
 GROS: The following one is used to allow a plugin to send a generic cmd to a player. More...
 
void send_query (socket_struct *ns, uint8_t flags, const char *text)
 Asks the client to query the user. More...
 
static void send_smooth (socket_struct *ns, uint16_t face)
 A lot like the old AskSmooth (in fact, now called by AskSmooth). More...
 
void send_tick (player *pl)
 
void set_up_cmd (char *buf, int len, socket_struct *ns)
 This is the Setup cmd - easy first implementation. More...
 
static int spell_client_use (const object *spell)
 Give the client-side use information for a spell, to know how to use a spell. More...
 
void version_cmd (char *buf, int len, socket_struct *ns)
 Client tells its version. More...
 

Variables

static const short atnr_cs_stat [NROFATTACKS]
 This table translates the attack numbers as used within the program to the value we use when sending STATS command to the client. More...
 
static const objectheads [MAX_HEAD_POS][MAX_HEAD_POS][MAP_LAYERS]
 Using a global really isn't a good approach, but saves the over head of allocating and deallocating such a block of data each time run through, and saves the space of allocating this in the socket object when we only need it for this cycle. More...
 

Detailed Description

Client handling.

Date
2003-12-02

This file implements all of the goo on the server side for handling clients. It's got a bunch of global variables for keeping track of each of the clients.

Note: All functions that are used to process data from the client have the prototype of (char *data, int datalen, int client_num). This way, we can use one dispatch table.

esrv_map_scroll tells the client to scroll the map, and does similarily for the locally cached copy.

Todo:
smoothing should be automatic for latest clients. Remove some stuff we can assume is always on. fix comments for this file.

This file should probably be broken up into smaller sections - having all request handling from the client in one file makes this a very large file in which it is hard to find data (and know how it is related). In addition, a lot of the function is not actually requests from the client, but push from the server (stats, maps)

Definition in file request.c.

Macro Definition Documentation

#define AddIfFloat (   Old,
  New,
  Type 
)
Value:
if (Old != New) { \
Old = New; \
SockList_AddChar(&sl, Type); \
SockList_AddInt(&sl, (long)(New*FLOAT_MULTI));\
}
void SockList_AddInt(SockList *sl, uint32_t data)
Adds a 32 bit value.
Definition: lowlevel.c:119
#define FLOAT_MULTI
Integer representation (float to int).
Definition: newclient.h:79
void SockList_AddChar(SockList *sl, char c)
Adds an 8 bit value.
Definition: lowlevel.c:98

Definition at line 704 of file request.c.

Referenced by esrv_update_stats().

#define AddIfInt (   Old,
  New,
  Type 
)
Value:
if (Old != New) { \
Old = New; \
SockList_AddChar(&sl, Type); \
SockList_AddInt(&sl, New); \
}
void SockList_AddInt(SockList *sl, uint32_t data)
Adds a 32 bit value.
Definition: lowlevel.c:119
void SockList_AddChar(SockList *sl, char c)
Adds an 8 bit value.
Definition: lowlevel.c:98

Definition at line 690 of file request.c.

Referenced by esrv_update_stats().

#define AddIfInt64 (   Old,
  New,
  Type 
)
Value:
if (Old != New) { \
Old = New; \
SockList_AddChar(&sl, Type); \
SockList_AddInt64(&sl, New); \
}
void SockList_AddChar(SockList *sl, char c)
Adds an 8 bit value.
Definition: lowlevel.c:98
void SockList_AddInt64(SockList *sl, uint64_t data)
Adds a 64 bit value.
Definition: lowlevel.c:132

Definition at line 683 of file request.c.

Referenced by esrv_update_stats().

#define AddIfShort (   Old,
  New,
  Type 
)
Value:
if (Old != New) { \
Old = New; \
SockList_AddChar(&sl, Type); \
SockList_AddShort(&sl, New); \
}
void SockList_AddShort(SockList *sl, uint16_t data)
Adds a 16 bit value.
Definition: lowlevel.c:108
void SockList_AddChar(SockList *sl, char c)
Adds an 8 bit value.
Definition: lowlevel.c:98

Definition at line 697 of file request.c.

Referenced by esrv_update_stats().

#define AddIfString (   Old,
  New,
  Type 
)
Value:
if (Old == NULL || strcmp(Old, New)) { \
free(Old); \
Old = strdup_local(New); \
SockList_AddChar(&sl, Type); \
SockList_AddLen8Data(&sl, New, strlen(New));\
}
#define strdup_local
Definition: compat.h:25
void SockList_AddChar(SockList *sl, char c)
Adds an 8 bit value.
Definition: lowlevel.c:98
void SockList_AddLen8Data(SockList *sl, const void *data, size_t len)
Adds a data block prepended with an 8 bit length field.
Definition: lowlevel.c:171

Definition at line 711 of file request.c.

Referenced by esrv_update_stats().

#define MAX_CHOICES   100

Definition at line 2480 of file request.c.

Referenced by create_player_cmd().

#define MAX_HEAD_POS   MAX(MAX_CLIENT_X, MAX_CLIENT_Y)

Definition at line 926 of file request.c.

Function Documentation

void account_add_player_cmd ( char *  buf,
int  len,
socket_struct ns 
)

Handle accountaddplayer from server (add a character to this account).

We check to see if character exists, if password is correct, if character is associated with other account.

Parameters
bufsocket data to process
lenlength of socket data.
nssocket of incoming request.

Definition at line 2271 of file request.c.

References account_char_free(), account_char_load(), account_char_remove(), account_char_save(), socket_struct::account_chars, account_get_account_for_char(), account_is_logged_in(), account_link(), socket_struct::account_name, account_remove_player(), decode_name_password(), socket_struct::host, llevDebug, LOG(), MAX_BUF, send_account_players(), Send_With_Handling(), SockList_AddString(), SockList_Init(), SockList_Term(), and verify_player().

Here is the call graph for this function:

static int account_block_create ( const socket_struct ns)
static

Checks if account creation is blocked for this connection.

Parameters
nspointer to socket structure.
Return values
0Account creation is not blocked.
1Account creation is blocked for this connection.

Definition at line 2127 of file request.c.

References Settings::account_block_create, Settings::account_trusted_host, socket_struct::host, settings, and strdup_local.

Referenced by account_new_cmd().

Here is the caller graph for this function:

void account_login_cmd ( char *  buf,
int  len,
socket_struct ns 
)

Handles the account login.

Parameters
bufremaining socket data - from this we need to extract name & password
lenlength of this buffer
nspointer to socket structure.

Definition at line 2037 of file request.c.

References account_exists(), account_get_logged_in_init_socket(), account_get_logged_in_player(), account_login(), socket_struct::account_name, decode_name_password(), socket_struct::host, llevDebug, LOG(), MAX_BUF, Ns_Dead, send_account_players(), Send_With_Handling(), pl::socket, SockList_AddString(), SockList_Init(), SockList_Term(), socket_struct::status, and strdup_local.

Here is the call graph for this function:

void account_new_cmd ( char *  buf,
int  len,
socket_struct ns 
)

Handles the account creation This function shares a fair amount of the same logic as account_login_cmd() above.

Parameters
bufremaining socket data - from this we need to extract name & password
lenlength of this buffer
nspointer to socket structure.

Definition at line 2163 of file request.c.

References account_block_create(), account_check_string(), account_exists(), socket_struct::account_name, account_new(), accounts_save(), decode_name_password(), socket_struct::host, llevDebug, llevInfo, LOG(), MAX_BUF, send_account_players(), Send_With_Handling(), SockList_AddString(), SockList_Init(), SockList_Term(), and strdup_local.

Here is the call graph for this function:

void account_password ( char *  buf,
int  len,
socket_struct ns 
)

Handles the account password change.

Parameters
bufremaining socket data - from this we need to extract old & new password
lenlength of this buffer
nspointer to socket structure.

Definition at line 2862 of file request.c.

References account_change_password(), account_check_string(), socket_struct::account_name, decode_name_password(), socket_struct::host, llevDebug, LOG(), MAX_BUF, send_account_players(), Send_With_Handling(), SockList_AddString(), SockList_Init(), and SockList_Term().

Here is the call graph for this function:

void account_play_cmd ( char *  buf,
int  len,
socket_struct ns 
)
static void add_char_field ( SockList sl,
int  type,
const char *  data 
)
static

Basic helper function which adds a piece of data for the accountplayers protocol command.

Called from send_account_players. If data is empty, we don't add.

Parameters
slsocklist to add data to.
typetype of data (ACL_.. value)
datastring data to add

Definition at line 1827 of file request.c.

References SockList_AddChar(), and SockList_AddString().

Referenced by send_account_players().

Here is the call graph for this function:

Here is the caller graph for this function:

void add_me_cmd ( char *  buf,
int  len,
socket_struct ns 
)

The client has requested to be added to the game.

This is what takes care of it. We tell the client how things worked out. I am not sure if this file is the best place for this function. However, it either has to be here or init_sockets needs to be exported.

Todo:
can ns->status not be Ns_Add?

Definition at line 347 of file request.c.

References add_player(), socket_struct::cs_version, find_player_socket(), MSG_TYPE_ADMIN, MSG_TYPE_ADMIN_VERSION, NDI_RED, Ns_Add, Ns_Avail, print_ext_msg(), socket_struct::sc_version, Send_With_Handling(), settings, SockList_AddString(), SockList_Init(), SockList_Term(), and socket_struct::status.

Here is the call graph for this function:

static void append_spell ( player pl,
SockList sl,
object spell 
)
static
void ask_smooth_cmd ( char *  buf,
int  len,
socket_struct ns 
)

Tells client the picture it has to use to smooth a picture number given as argument.

Definition at line 423 of file request.c.

References socket_struct::host, llevDebug, LOG(), and send_smooth().

Here is the call graph for this function:

static int check_probe ( int  ax,
int  ay,
const object ob,
SockList sl,
socket_struct ns,
int *  has_obj,
int *  alive_layer 
)
static

Check if a hp bar should be added to the map square.

Parameters
axx coordinate.
ayy coordinate.
obobject to check for hp bar.
slwhere to write data.
nsto know if the face was sent or not.
has_objnumber of objects, modified.
alive_layerwill be filled with the layer containing the hp bar if applicable.
Returns
1 if a bar was added, in which case alive_layer is modified, else 0.

Definition at line 1132 of file request.c.

References archt::clone, DISEASE, FLAG_PROBE, FORCE, obj::head, liv::hp, obj::level, map2_add_ob(), MAP_LAYER_FLY2, liv::maxhp, object_find_by_type_and_name(), object_present_in_ob(), POISONING, probe(), QUERY_FLAG, snprintf, obj::stats, and try_find_archetype().

Referenced by draw_client_map2().

Here is the call graph for this function:

Here is the caller graph for this function:

static void check_space_for_heads ( int  ax,
int  ay,
SockList sl,
socket_struct ns 
)
static

Definition at line 1204 of file request.c.

References Map::cells, socket_struct::lastmap, SockList::len, map2_add_ob(), MAP2_COORD_ENCODE, map2_delete_layer(), map_clearcell(), MAP_LAYERS, SockList_AddChar(), and SockList_AddShort().

Referenced by draw_client_map2().

Here is the call graph for this function:

Here is the caller graph for this function:

void create_player_cmd ( char *  buf,
int  len,
socket_struct ns 
)
static int decode_name_password ( const char *  buf,
int *  len,
char *  name,
char *  password 
)
static

This is a basic routine which extracts the name/password from the buffer.

Several of the account login routines provide a length prefixed string for name, and another for password.

Parameters
bufcharacter data to process.
lenlength of this buffer. This will be updated to be the next byte to process in the case that there is additional data in this packet that the caller may need to process.
namepreallocated (MAX_BUF) buffer to return the name (really, first string) in
passwordpreallocated (MAX_BUF) buffer to return the password (second string) in
Returns
0 - success 1 - name is too long 2 - password is too long

Definition at line 2001 of file request.c.

References MAX_BUF.

Referenced by account_add_player_cmd(), account_login_cmd(), account_new_cmd(), account_password(), and create_player_cmd().

Here is the caller graph for this function:

void draw_client_map ( object pl)

Draws client map.

Definition at line 1438 of file request.c.

References obj::contr, pl::do_los, draw_client_map2(), get_map_flags(), mapdef::in_memory, llevError, LOG(), obj::map, MAP_IN_MEMORY, socket_struct::mapx, socket_struct::mapy, P_NEED_UPDATE, P_NEW_MAP, P_OUT_OF_MAP, PLAYER, pl::socket, mapdef::timeout, pl::transport, obj::type, update_los(), update_position(), obj::x, and obj::y.

Referenced by do_server().

Here is the call graph for this function:

Here is the caller graph for this function:

void draw_client_map2 ( object pl)
void esrv_add_spells ( player pl,
object spell 
)

This tells the client to add the spell *spell, if spell is NULL, then add all spells in the player's inventory.

Todo:
casting_requirements should be a constant somewhere

Definition at line 1738 of file request.c.

References append_spell(), FOR_INV_FINISH, FOR_INV_PREPARE, llevError, LOG(), socket_struct::monitor_spells, obj::msg, obj::name, pl::ob, object_get_value(), Send_With_Handling(), pl::socket, SockList_AddString(), SockList_Avail(), SockList_Init(), SockList_Reset(), SockList_Term(), SPELL, and obj::type.

Referenced by check_login(), and do_learn_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

void esrv_map_scroll ( socket_struct ns,
int  dx,
int  dy 
)
void esrv_new_player ( player pl,
uint32_t  weight 
)

Tells the client that here is a player it should start using.

Definition at line 856 of file request.c.

References obj::count, esrv_send_face(), obj::face, socket_struct::faces_sent, FLAG_CLIENT_SENT, pl::last_weight, obj::name, NS_FACESENT_FACE, new_face_struct::number, pl::ob, Send_With_Handling(), SET_FLAG, pl::socket, SockList_AddInt(), SockList_AddLen8Data(), SockList_AddString(), SockList_Init(), and SockList_Term().

Referenced by apply_race_and_class(), check_login(), command_possess(), key_change_class(), and roll_again().

Here is the call graph for this function:

Here is the caller graph for this function:

void esrv_remove_spell ( player pl,
object spell 
)

Definition at line 1603 of file request.c.

References obj::count, obj::env, llevError, LOG(), socket_struct::monitor_spells, pl::ob, Send_With_Handling(), pl::socket, SockList_AddInt(), SockList_AddString(), SockList_Init(), and SockList_Term().

Referenced by do_forget_spell().

Here is the call graph for this function:

Here is the caller graph for this function:

void esrv_send_animation ( socket_struct ns,
short  anim_num 
)

Need to send an animation sequence to the client.

We will send appropriate face commands to the client if we haven't sent them the face yet (this can become quite costly in terms of how much we are sending - on the other hand, this should only happen when the player logs in and picks stuff up.

Definition at line 883 of file request.c.

References animations, socket_struct::anims_sent, esrv_send_face(), animations_struct::faces, socket_struct::faces_sent, llevError, LOG(), NS_FACESENT_FACE, animations_struct::num_animations, num_animations, new_face_struct::number, Send_With_Handling(), SockList_AddShort(), SockList_AddString(), SockList_Init(), and SockList_Term().

Referenced by add_object_to_socklist(), and map2_add_ob().

Here is the call graph for this function:

Here is the caller graph for this function:

void esrv_send_pickup ( player pl)

Sends the "pickup" state to pl if client wants it requested.

Parameters
plplayer that just logged in.

Definition at line 1625 of file request.c.

References pl::mode, Send_With_Handling(), pl::socket, SockList_AddInt(), SockList_AddString(), SockList_Init(), SockList_Term(), and socket_struct::want_pickup.

Referenced by check_login(), and display_new_pickup().

Here is the call graph for this function:

Here is the caller graph for this function:

void esrv_update_spells ( player pl)

This looks for any spells the player may have that have changed their stats.

It then sends an updspell packet for each spell that has changed in this way.

Definition at line 1551 of file request.c.

References flags, FOR_INV_FINISH, FOR_INV_PREPARE, get_client_spell_state(), client_spell::last_dam, client_spell::last_grace, client_spell::last_sp, socket_struct::monitor_spells, pl::ob, Send_With_Handling(), pl::socket, SockList_AddChar(), SockList_AddInt(), SockList_AddShort(), SockList_AddString(), SockList_Init(), SockList_Term(), SP_level_dam_adjust(), SP_level_spellpoint_cost(), SPELL, SPELL_GRACE, SPELL_MANA, pl::spell_state, UPD_SP_DAMAGE, UPD_SP_GRACE, and UPD_SP_MANA.

Here is the call graph for this function:

void esrv_update_stats ( player pl)

Sends a statistics update.

We look at the old values, and only send what has changed. Stat mapping values are in newclient.h Since this gets sent a lot, this is actually one of the few binary commands for now.

Definition at line 725 of file request.c.

References liv::ac, AddIfFloat, AddIfInt, AddIfInt64, AddIfShort, AddIfString, pl::applied_stats, obj::arch, atnr_cs_stat, ATNR_PHYSICAL, liv::Cha, archt::clone, liv::Con, obj::count, CS_STAT_AC, CS_STAT_APPLIED_CHA, CS_STAT_APPLIED_CON, CS_STAT_APPLIED_DEX, CS_STAT_APPLIED_INT, CS_STAT_APPLIED_POW, CS_STAT_APPLIED_STR, CS_STAT_APPLIED_WIS, CS_STAT_ARMOUR, CS_STAT_BASE_CHA, CS_STAT_BASE_CON, CS_STAT_BASE_DEX, CS_STAT_BASE_INT, CS_STAT_BASE_POW, CS_STAT_BASE_STR, CS_STAT_BASE_WIS, CS_STAT_CHA, CS_STAT_CON, CS_STAT_DAM, CS_STAT_DEX, CS_STAT_EXP64, CS_STAT_FLAGS, CS_STAT_FOOD, CS_STAT_GOLEM_HP, CS_STAT_GOLEM_MAXHP, CS_STAT_GRACE, CS_STAT_HP, CS_STAT_INT, CS_STAT_LEVEL, CS_STAT_MAXGRACE, CS_STAT_MAXHP, CS_STAT_MAXSP, CS_STAT_POW, CS_STAT_RACE_CHA, CS_STAT_RACE_CON, CS_STAT_RACE_DEX, CS_STAT_RACE_INT, CS_STAT_RACE_POW, CS_STAT_RACE_STR, CS_STAT_RACE_WIS, CS_STAT_RANGE, CS_STAT_SKILLINFO, CS_STAT_SP, CS_STAT_SPEED, CS_STAT_SPELL_ATTUNE, CS_STAT_SPELL_DENY, CS_STAT_SPELL_REPEL, CS_STAT_STR, CS_STAT_TITLE, CS_STAT_WC, CS_STAT_WEAP_SP, CS_STAT_WEIGHT_LIM, CS_STAT_WIS, liv::dam, liv::Dex, liv::exp, socket_struct::extended_stats, pl::fire_on, FLAG_FREED, FLAG_REMOVED, flags, liv::food, get_weight_limit(), pl::golem_count, liv::grace, liv::hp, liv::Int, pl::last_applied_stats, pl::last_flags, pl::last_golem_hp, pl::last_golem_maxhp, pl::last_level, pl::last_orig_stats, pl::last_path_attuned, pl::last_path_denied, pl::last_path_repelled, pl::last_race_stats, pl::last_resist, pl::last_skill_exp, pl::last_skill_ob, pl::last_speed, pl::last_stats, pl::last_weapon_sp, pl::last_weight_limit, SockList::len, obj::level, llevDebug, LOG(), MAX_BUF, liv::maxgrace, liv::maxhp, liv::maxsp, socket_struct::monitor_spells, NROFATTACKS, NUM_SKILLS, pl::ob, pl::orig_stats, obj::path_attuned, obj::path_denied, obj::path_repelled, liv::Pow, QUERY_FLAG, statsinfo::range, range_golem, pl::ranges, rangetostring(), obj::resist, pl::run_on, socket_struct::sc_version, Send_With_Handling(), set_title(), SF_FIREON, SF_RUNON, pl::socket, SockList_AddChar(), SockList_AddInt64(), SockList_AddString(), SockList_Init(), SockList_Term(), liv::sp, obj::speed, socket_struct::stats, obj::stats, liv::Str, statsinfo::title, liv::wc, obj::weapon_speed, and liv::Wis.

Referenced by do_server().

Here is the call graph for this function:

Here is the caller graph for this function:

static int map2_add_ob ( int  ax,
int  ay,
int  layer,
const object ob,
SockList sl,
socket_struct ns,
int *  has_obj,
int  is_head 
)
static

object 'ob' at 'ax,ay' on 'layer' is visible to the client.

This function does the following things: If is_head head is set, this means this is from the heads[] array, so don't try to store it away again - just send it and update our look faces.

1) If a multipart object and we are not at the lower right corner, store this info away for later use. 2) Check to see if this face has been sent to the client. If not, we add data to the socklist, update the last map, and send any other data the client will need (smoothing table, image data, etc) 3) Return 1 if function increased socket. 4) has_obj is increased by one if there are visible objects on this this space, whether or not we sent them. Basically, if has_obj is 0, we can clear info about this space. It could be set to 1 with the function returning zero - this means there are objects on the space we have already sent to the client.

Definition at line 962 of file request.c.

References ANIM_RANDOM, obj::anim_speed, ANIM_SYNC, obj::animation_id, animations, socket_struct::anims_sent, obj::arch, Map::cells, archt::clone, esrv_send_animation(), esrv_send_face(), FABS, obj::face, animations_struct::faces, map_cell_struct::faces, socket_struct::faces_sent, FLAG_CLIENT_ANIM_RANDOM, FLAG_CLIENT_ANIM_SYNC, HEAD, socket_struct::lastmap, llevError, LOG(), obj::map, MAP2_LAYER_START, MAP_LAYERS, MAP_NOSMOOTH, NS_FACESENT_FACE, NS_FACESENT_SMOOTH, NUM_ANIMATIONS, new_face_struct::number, QUERY_FLAG, send_smooth(), obj::smoothlevel, SockList_AddChar(), SockList_AddShort(), obj::speed, archt::tail_x, archt::tail_y, obj::x, and obj::y.

Referenced by check_probe(), check_space_for_heads(), and draw_client_map2().

Here is the call graph for this function:

Here is the caller graph for this function:

static int map2_delete_layer ( int  ax,
int  ay,
int  layer,
SockList sl,
socket_struct ns 
)
static

Definition at line 1107 of file request.c.

References Map::cells, map_cell_struct::faces, socket_struct::lastmap, SockList_AddChar(), and SockList_AddShort().

Referenced by check_space_for_heads(), and draw_client_map2().

Here is the call graph for this function:

Here is the caller graph for this function:

static void map_clearcell ( struct map_cell_struct cell,
int  face,
int  count 
)
static

Clears a map cell.

Definition at line 921 of file request.c.

References map_cell_struct::darkness, and map_cell_struct::faces.

Referenced by check_space_for_heads(), and draw_client_map2().

Here is the caller graph for this function:

void map_newmap_cmd ( socket_struct ns)

Sound related function.

Todo:
remove once clients don't try to use this - server closes connection on invalid client.

Newmap command

Definition at line 615 of file request.c.

References socket_struct::lastmap, socket_struct::map_scroll_x, socket_struct::map_scroll_y, Send_With_Handling(), SockList_AddString(), SockList_Init(), and SockList_Term().

Referenced by cfapi_object_teleport(), dimension_door(), enter_map(), process_players1(), set_up_cmd(), teleport(), and transfer_ob().

Here is the call graph for this function:

Here is the caller graph for this function:

void move_cmd ( char *  buf,
int  len,
player pl 
)

Moves an object (typically, container to inventory).

syntax is: move (to) (tag) (nrof)

Definition at line 636 of file request.c.

References esrv_move_object(), llevDebug, llevError, LOG(), obj::name, and pl::ob.

Here is the call graph for this function:

void new_player_cmd ( uint8_t buf,
int  len,
player pl 
)

This handles the commands issued by the player (ie, north, fire, cast, etc.).

This is called with the 'ncom' method which gives more information back to the client so it can throttle.

Parameters
bufdata received.
lenlength of buf.
plplayer who issued the command. Mustn't be NULL.

Definition at line 447 of file request.c.

References pl::count, draw_ext_info_format(), execute_newserver_command(), FABS, GetInt_String(), GetShort_String(), llevDebug, llevError, LOG(), MAX_BUF, MAX_TIME, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR, NDI_UNIQUE, pl::ob, Send_With_Handling(), pl::socket, SockList_AddInt(), SockList_AddShort(), SockList_AddString(), SockList_Init(), SockList_Term(), obj::speed, obj::speed_left, ST_PLAYING, and pl::state.

Here is the call graph for this function:

void reply_cmd ( char *  buf,
int  len,
player pl 
)
void send_account_players ( socket_struct ns)

Upon successful login/account creation, we send a list of characters associated with the account to the client - in this way, it lets the client present a nice list so that the player can choose one.

Note it is important that ns->account_name is set before calling this. Note 2: Some of the operations here are not especially efficient - O(n^2) or repeating same loop instead of trying to combine them. This is not a worry as MAX_CHARACTERS_PER_ACCOUNT is a fairly low value (less than 20), so even inefficient operations don't take much time. If that value as a lot larger, then some rethink may be needed. For now, having clearer code is better than trying to save a few microseconds of execution time.

Parameters
nssocket structure to send data for.

Definition at line 1861 of file request.c.

References account_char_load(), socket_struct::account_chars, account_get_players_for_account(), socket_struct::account_name, ACL_CLASS, ACL_FACE, ACL_FACE_NUM, ACL_LEVEL, ACL_MAP, ACL_NAME, ACL_PARTY, ACL_RACE, add_char_field(), account_char_struct::character_class, esrv_send_face(), account_char_struct::face, socket_struct::faces_sent, find_face(), account_char_struct::isDead, account_char_struct::level, account_char_struct::map, MAX_CHARACTERS_PER_ACCOUNT, account_char_struct::name, account_char_struct::next, NS_FACESENT_FACE, account_char_struct::party, account_char_struct::race, Send_With_Handling(), SockList_AddChar(), SockList_AddShort(), SockList_AddString(), SockList_Init(), and SockList_Term().

Referenced by account_add_player_cmd(), account_login_cmd(), account_new_cmd(), account_password(), key_confirm_quit(), and receive_play_again().

Here is the call graph for this function:

Here is the caller graph for this function:

void send_plugin_custom_message ( object pl,
char *  buf 
)

GROS: The following one is used to allow a plugin to send a generic cmd to a player.

Of course, the client need to know the command to be able to manage it !

Definition at line 1537 of file request.c.

References obj::contr, Send_With_Handling(), pl::socket, SockList_AddString(), SockList_Init(), and SockList_Term().

Here is the call graph for this function:

void send_query ( socket_struct ns,
uint8_t  flags,
const char *  text 
)

Asks the client to query the user.

This way, the client knows it needs to send something back (vs just printing out a message)

Definition at line 674 of file request.c.

References Send_With_Handling(), SockList_AddPrintf(), SockList_Init(), and SockList_Term().

Referenced by command_passwd(), command_quit(), confirm_password(), get_name(), get_party_password(), get_password(), key_change_class(), key_roll_stat(), play_again(), receive_player_password(), and roll_again().

Here is the call graph for this function:

Here is the caller graph for this function:

static void send_smooth ( socket_struct ns,
uint16_t  face 
)
static

A lot like the old AskSmooth (in fact, now called by AskSmooth).

Basically, it makes no sense to wait for the client to request a a piece of data from us that we know the client wants. So if we know the client wants it, might as well push it to the client.

Definition at line 392 of file request.c.

References esrv_send_face(), socket_struct::faces_sent, find_smooth(), llevError, LOG(), new_face_struct::name, NS_FACESENT_FACE, NS_FACESENT_SMOOTH, new_face_struct::number, Send_With_Handling(), smooth_face, SockList_AddShort(), SockList_AddString(), SockList_Init(), and SockList_Term().

Referenced by ask_smooth_cmd(), and map2_add_ob().

Here is the call graph for this function:

Here is the caller graph for this function:

void send_tick ( player pl)

Definition at line 1797 of file request.c.

References socket_struct::fd, llevError, LOG(), pticks, Send_With_Handling(), pl::socket, SockList_AddInt(), SockList_AddString(), SockList_Init(), and SockList_Term().

Referenced by do_server().

Here is the call graph for this function:

Here is the caller graph for this function:

void set_up_cmd ( char *  buf,
int  len,
socket_struct ns 
)
static int spell_client_use ( const object spell)
static

Give the client-side use information for a spell, to know how to use a spell.

Parameters
spellwhat to check.
Return values
0spell needs no argument.
1spell needs the name of another spell.
2spell can use a freeform string argument.
3spell requires a freeform string argument.

Definition at line 1645 of file request.c.

References obj::other_arch, obj::randomitems, SP_CREATE_FOOD, SP_CREATE_MISSILE, SP_MAKE_MARK, SP_RAISE_DEAD, SP_RUNE, SP_SUMMON_MONSTER, and obj::type.

Referenced by append_spell().

Here is the caller graph for this function:

void version_cmd ( char *  buf,
int  len,
socket_struct ns 
)

Client tells its version.

If there is a mismatch, we close the socket. In real life, all we should care about is the client having something older than the server. If we assume the client will be backwards compatible, having it be a later version should not be a problem.

Definition at line 581 of file request.c.

References socket_struct::cs_version, socket_struct::host, llevDebug, llevError, llevInfo, LOG(), socket_struct::sc_version, strtok_r, VERSION_CS, and VERSION_SC.

Here is the call graph for this function:

Variable Documentation

const short atnr_cs_stat[NROFATTACKS]
static
Initial value:
= {
-1 , -1 ,
-1,
-1,
-1
}
#define CS_STAT_RES_GHOSTHIT
Definition: newclient.h:152
#define CS_STAT_RES_POISON
Definition: newclient.h:153
#define CS_STAT_RES_DRAIN
Definition: newclient.h:151
#define CS_STAT_RES_CONF
Definition: newclient.h:149
#define CS_STAT_RES_DEATH
Definition: newclient.h:159
#define CS_STAT_RES_FIRE
Definition: newclient.h:146
#define CS_STAT_RES_HOLYWORD
Definition: newclient.h:160
#define CS_STAT_TURN_UNDEAD
Definition: newclient.h:156
#define CS_STAT_RES_SLOW
Definition: newclient.h:154
#define CS_STAT_RES_PARA
Definition: newclient.h:155
#define CS_STAT_RES_COLD
Definition: newclient.h:148
#define CS_STAT_RES_ELEC
Definition: newclient.h:147
#define CS_STAT_RES_MAG
Definition: newclient.h:145
#define CS_STAT_RES_DEPLETE
Definition: newclient.h:158
#define CS_STAT_RES_FEAR
Definition: newclient.h:157
#define CS_STAT_RES_PHYS
Definition: newclient.h:144
#define CS_STAT_RES_BLIND
Definition: newclient.h:161
#define CS_STAT_RES_ACID
Definition: newclient.h:150

This table translates the attack numbers as used within the program to the value we use when sending STATS command to the client.

If a value is -1, then we don't send that to the client.

Definition at line 73 of file request.c.

Referenced by esrv_update_stats().

const object* heads[MAX_HEAD_POS][MAX_HEAD_POS][MAP_LAYERS]
static

Using a global really isn't a good approach, but saves the over head of allocating and deallocating such a block of data each time run through, and saves the space of allocating this in the socket object when we only need it for this cycle.

If the serve is ever threaded, this needs to be re-examined.

Definition at line 935 of file request.c.