Crossfire Server, Trunk
request.c File Reference
#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, sl, Type)
 
#define AddIfInt(Old, New, sl, Type)
 
#define AddIfInt64(Old, New, sl, Type)
 
#define AddIfShort(Old, New, sl, Type)
 
#define AddIfString(Old, New, sl, Type)
 
#define FIF(F, C)
 
#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)
 
static int account_block_create (const socket_struct *ns)
 
void account_login_cmd (char *buf, int len, socket_struct *ns)
 
void account_new_cmd (char *buf, int len, socket_struct *ns)
 
void account_password (char *buf, int len, socket_struct *ns)
 
void account_play_cmd (char *buf, int len, socket_struct *ns)
 
static void add_char_field (SockList *sl, int type, const char *data)
 
void add_me_cmd (char *buf, int len, socket_struct *ns)
 
static int annotate_ob (int ax, int ay, const object *ob, SockList *sl, socket_struct *ns, int *has_obj, int *alive_layer)
 
static void append_spell (player *pl, SockList *sl, object *spell)
 
void ask_smooth_cmd (char *buf, int len, socket_struct *ns)
 
static int check_probe (int ax, int ay, const object *ob, SockList *sl, socket_struct *ns, int *has_obj, int *alive_layer)
 
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)
 
static int decode_name_password (const char *buf, int *len, char *name, char *password)
 
void draw_client_map (object *pl)
 
static void draw_client_map2 (object *pl)
 
void esrv_add_spells (player *pl, object *spell)
 
void esrv_map_scroll (socket_struct *ns, int dx, int dy)
 
void esrv_new_player (player *pl, uint32_t weight)
 
void esrv_remove_spell (player *pl, object *spell)
 
void esrv_send_animation (socket_struct *ns, const Animations *anim)
 
void esrv_send_pickup (player *pl)
 
void esrv_update_spells (player *pl)
 
void esrv_update_stats (player *pl)
 
static uint8_t is_perfect (const player *pl)
 
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 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)
 
void map_newmap_cmd (socket_struct *ns)
 
void move_cmd (char *buf, int len, player *pl)
 
void new_player_cmd (uint8_t *buf, int len, player *pl)
 
void reply_cmd (char *buf, int len, player *pl)
 
void send_account_players (socket_struct *ns)
 
static void send_extra_stats (SockList *sl, player *pl)
 
void send_plugin_custom_message (object *pl, char *buf)
 
void send_query (socket_struct *ns, uint8_t flags, const char *text)
 
static void send_smooth (socket_struct *ns, const Face *face)
 
void send_tick (player *pl)
 
void set_up_cmd (char *buf, int len, socket_struct *ns)
 
static int spell_client_use (const object *spell)
 
void version_cmd (char *buf, int len, socket_struct *ns)
 

Variables

static const short atnr_cs_stat [NROFATTACKS]
 
static const objectheads [MAX_HEAD_POS][MAX_HEAD_POS][MAP_LAYERS]
 

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

◆ AddIfFloat

#define AddIfFloat (   Old,
  New,
  sl,
  Type 
)
Value:
if (Old != New) { \
Old = New; \
SockList_AddChar(sl, Type); \
SockList_AddInt(sl, (long)(New*FLOAT_MULTI));\
}

Definition at line 709 of file request.c.

◆ AddIfInt

#define AddIfInt (   Old,
  New,
  sl,
  Type 
)
Value:
if (Old != New) { \
Old = New; \
SockList_AddChar(sl, Type); \
SockList_AddInt(sl, New); \
}

Definition at line 695 of file request.c.

◆ AddIfInt64

#define AddIfInt64 (   Old,
  New,
  sl,
  Type 
)
Value:
if (Old != New) { \
Old = New; \
SockList_AddChar(sl, Type); \
SockList_AddInt64(sl, New); \
}

Definition at line 688 of file request.c.

◆ AddIfShort

#define AddIfShort (   Old,
  New,
  sl,
  Type 
)
Value:
if (Old != New) { \
Old = New; \
SockList_AddChar(sl, Type); \
SockList_AddShort(sl, New); \
}

Definition at line 702 of file request.c.

◆ AddIfString

#define AddIfString (   Old,
  New,
  sl,
  Type 
)
Value:
if (Old == NULL || strcmp(Old, New)) { \
free(Old); \
Old = strdup_local(New); \
SockList_AddChar(sl, Type); \
SockList_AddLen8Data(sl, New, strlen(New)); \
}

Definition at line 716 of file request.c.

◆ FIF

#define FIF (   F,
  C 
)
Value:
if (QUERY_FLAG(pl->ob, F)) { \
uflags |= C; \
}

◆ MAX_CHOICES

#define MAX_CHOICES   100

Definition at line 2554 of file request.c.

◆ MAX_HEAD_POS

#define MAX_HEAD_POS   MAX(MAX_CLIENT_X, MAX_CLIENT_Y)

Definition at line 1011 of file request.c.

Function Documentation

◆ account_add_player_cmd()

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 2326 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(), buf, decode_name_password(), dragon_attune::force, socket_struct::host, llevDebug, LOG(), MAX_BUF, give::name, send_account_players(), Send_With_Handling(), SockList_AddString(), SockList_Init(), SockList_Term(), takeitem::status, and verify_player().

+ Here is the call graph for this function:

◆ account_block_create()

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 2176 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:

◆ account_login_cmd()

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 2113 of file request.c.

References account_exists(), account_login(), socket_struct::account_name, buf, decode_name_password(), socket_struct::host, llevDebug, llevInfo, LOG(), MAX_BUF, give::name, send_account_players(), Send_With_Handling(), SockList_AddString(), SockList_Init(), SockList_Term(), takeitem::status, and strdup_local.

+ Here is the call graph for this function:

◆ account_new_cmd()

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 2212 of file request.c.

References account_block_create(), account_check_string(), account_exists(), socket_struct::account_name, account_new(), accounts_save(), buf, decode_name_password(), socket_struct::host, llevDebug, llevInfo, LOG(), MAX_BUF, Settings::min_name, give::name, send_account_players(), Send_With_Handling(), settings, SockList_AddString(), SockList_Init(), SockList_Term(), takeitem::status, and strdup_local.

+ Here is the call graph for this function:

◆ account_password()

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 2981 of file request.c.

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

Referenced by account_login(), and account_new().

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

◆ account_play_cmd()

◆ add_char_field()

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 1947 of file request.c.

References navar-midane_time::data, SockList_AddChar(), SockList_AddString(), and is_valid_types_gen::type.

Referenced by send_account_players().

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

◆ add_me_cmd()

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 349 of file request.c.

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

+ Here is the call graph for this function:

◆ annotate_ob()

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

Definition at line 1285 of file request.c.

References check_probe(), archt::clone, FLAG_ALIVE, FLAG_FRIENDLY, FLAG_UNAGGRESSIVE, map2_add_ob(), MAP_LAYER_FLY2, guildjoin::ob, object_find_by_arch_name(), PLAYER, QUERY_FLAG, 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:

◆ append_spell()

◆ ask_smooth_cmd()

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 437 of file request.c.

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

+ Here is the call graph for this function:

◆ check_probe()

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 1217 of file request.c.

References Settings::always_show_hp, CAN_PROBE(), archt::clone, DISEASE, FLAG_PROBE, FORCE, map2_add_ob(), MAP_LAYER_FLY2, give::name, guildjoin::ob, object_find_by_type_and_name(), object_present_in_ob(), POISONING, probe(), QUERY_FLAG, settings, try_find_archetype(), and autojail::value.

Referenced by annotate_ob().

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

◆ check_space_for_heads()

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

Definition at line 1314 of file request.c.

References Map::cells, positioning_system::coord, heads, 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:

◆ create_player_cmd()

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

We have received a createplayer command.

Parameters
bufreceived command.
lenlength of buf.
nssocket to communicate with the client.

too long, buffer overflow

Definition at line 2561 of file request.c.

References account_check_string(), add_player(), ADD_PLAYER_NEW, ADD_PLAYER_NO_MAP, ADD_PLAYER_NO_STATS_ROLL, apply_race_and_class(), archininventory::arch, arch_to_object(), pl::bed_x, pl::bed_y, buf, check_race_and_class(), CLASS, obj::contr, decode_name_password(), draw_ext_info_format(), enter_exit(), first_player, FLAG_AUTO_APPLY, FLAG_REMOVED, FREE_AND_COPY, get_archetype_by_type_subtype(), get_attr_value(), socket_struct::host, castle_read::key, llevDebug, llevError, llevInfo, LOG(), socket_struct::login_method, disinfect::map, MAP, obj::map, MAP_TYPE_CHOICE, MAP_TYPE_DEFAULT, MAX_BUF, MAX_CHOICES, Settings::min_name, MSG_TYPE_ADMIN, MSG_TYPE_ADMIN_PLAYER, give::name, obj::name, pl::name_changed, obj::name_pl, NDI_ALL, NDI_DK_ORANGE, NDI_UNIQUE, newhash(), pl::next, Ns_Add, Ns_Avail, NUM_STATS, pl::ob, ob_apply(), object_get_value(), object_insert_in_ob(), object_remove(), give::op, pl::password, mapdef::path, altar_valkyrie::pl, PLAYER, player_set_state(), playername_ok(), QUERY_FLAG, safe_strncpy, pl::savebed_map, Send_With_Handling(), set_attr_value(), settings, short_stat_name, pl::socket, SockList_AddPrintf(), SockList_AddString(), SockList_Init(), SockList_Term(), ST_PLAYING, Settings::starting_stat_max, Settings::starting_stat_min, Settings::starting_stat_points, takeitem::status, socket_struct::status, strcasecmp(), try_find_archetype(), autojail::value, verify_player(), obj::x, and obj::y.

+ Here is the call graph for this function:

◆ decode_name_password()

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 2077 of file request.c.

References buf, MAX_BUF, and give::name.

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:

◆ draw_client_map()

void draw_client_map ( object pl)

Draws client map.

Definition at line 1552 of file request.c.

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

Referenced by send_updates().

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

◆ draw_client_map2()

◆ esrv_add_spells()

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 1854 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, sstring, obj::type, and autojail::value.

Referenced by apply_race_and_class(), check_login(), and do_learn_spell().

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

◆ esrv_map_scroll()

◆ esrv_new_player()

void esrv_new_player ( player pl,
uint32_t  weight 
)

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

Definition at line 942 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, Face::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:

◆ esrv_remove_spell()

void esrv_remove_spell ( player pl,
object spell 
)

Definition at line 1717 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:

◆ esrv_send_animation()

void esrv_send_animation ( socket_struct ns,
const Animations anim 
)

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.

Parameters
nswhere to send the animation.
animanimation to send.

Definition at line 972 of file request.c.

References animate::anim, socket_struct::anims_sent, esrv_send_face(), socket_struct::faces_sent, llevError, LOG(), NS_FACESENT_FACE, 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:

◆ esrv_send_pickup()

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 1740 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(), display_new_pickup(), and kill_player_not_permadeath().

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

◆ esrv_update_spells()

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 1665 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:

◆ esrv_update_stats()

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 800 of file request.c.

References liv::ac, AddIfFloat, AddIfInt, AddIfInt64, AddIfShort, AddIfString, pl::applied_stats, obj::arch, atnr_cs_stat, ATNR_PHYSICAL, buf, 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_skill_client_code(), 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, MAX_SKILLS, liv::maxgrace, liv::maxhp, liv::maxsp, socket_struct::monitor_spells, obj::name, NROFATTACKS, 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_extra_stats(), 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 send_updates().

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

◆ is_perfect()

static uint8_t is_perfect ( const player pl)
static

Check whether the player is perfect relatively to improvement potions.

Parameters
plwho to check.
Returns
1 if perfect, 0 else.

Definition at line 729 of file request.c.

References obj::level, pl::levgrace, pl::levhp, pl::levsp, MIN, and pl::ob.

Referenced by send_extra_stats().

+ Here is the caller graph for this function:

◆ map2_add_ob()

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 1047 of file request.c.

References ANIM_RANDOM, ANIM_SYNC, socket_struct::anims_sent, obj::arch, Map::cells, esrv_send_animation(), esrv_send_face(), FABS, map_cell_struct::faces, socket_struct::faces_sent, FLAG_CLIENT_ANIM_RANDOM, FLAG_CLIENT_ANIM_SYNC, HEAD, heads, make_face_from_files::int, banquet::l, socket_struct::lastmap, llevError, LOG(), MAP2_LAYER_START, MAP_LAYERS, MAP_NOSMOOTH, NS_FACESENT_FACE, NS_FACESENT_SMOOTH, NUM_ANIMATIONS, Face::number, guildjoin::ob, QUERY_FLAG, send_smooth(), SockList_AddChar(), SockList_AddShort(), archt::tail_x, and archt::tail_y.

Referenced by annotate_ob(), 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:

◆ map2_delete_layer()

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

Definition at line 1192 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:

◆ map_clearcell()

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

Clears a map cell

Definition at line 1006 of file request.c.

References disinfect::count, 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:

◆ map_newmap_cmd()

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 620 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 dimension_door(), do_follow(), enter_map(), object_teleport(), set_up_cmd(), teleport(), and transfer_ob().

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

◆ move_cmd()

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 641 of file request.c.

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

+ Here is the call graph for this function:

◆ new_player_cmd()

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 461 of file request.c.

References buf, devourers::command, command_execute(), pl::count, draw_ext_info_format(), FABS, GetInt_String(), GetShort_String(), make_face_from_files::int, 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:

◆ reply_cmd()

◆ send_account_players()

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 1981 of file request.c.

References account_char_free(), account_char_load(), socket_struct::account_chars, account_get_additional_chars(), 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, account_chars_struct::chars, esrv_send_face(), account_char_struct::face, socket_struct::faces_sent, free_charlinks(), account_char_struct::isDead, account_char_struct::level, account_char_struct::map, account_char_struct::name, account_char_struct::next, linked_char::next, NS_FACESENT_FACE, Face::number, account_char_struct::party, account_char_struct::race, Send_With_Handling(), SockList_AddChar(), SockList_AddShort(), SockList_AddString(), SockList_Init(), SockList_Term(), and try_find_face().

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:

◆ send_extra_stats()

static void send_extra_stats ( SockList sl,
player pl 
)
static

◆ send_plugin_custom_message()

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 1651 of file request.c.

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

+ Here is the call graph for this function:

◆ send_query()

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 679 of file request.c.

References flags, Send_With_Handling(), SockList_AddPrintf(), SockList_Init(), SockList_Term(), and guild_entry::text.

Referenced by command_delete(), command_passwd(), 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:

◆ send_smooth()

static void send_smooth ( socket_struct ns,
const Face 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.

Parameters
nswhere to send smooth information.
faceface to send smooth face of.

Definition at line 393 of file request.c.

References esrv_send_face(), socket_struct::faces_sent, find_smooth(), llevError, llevInfo, LOG(), Face::name, NS_FACESENT_FACE, NS_FACESENT_SMOOTH, Face::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:

◆ send_tick()

void send_tick ( player pl)

Definition at line 1913 of file request.c.

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

Referenced by update_players().

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

◆ set_up_cmd()

◆ spell_client_use()

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 1760 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:

◆ version_cmd()

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 584 of file request.c.

References buf, socket_struct::cs_version, socket_struct::host, llevDebug, llevError, llevInfo, LOG(), ring_occidental_mages::rest, socket_struct::sc_version, VERSION_CS, VERSION_SC, and nlohmann::detail::void().

+ Here is the call graph for this function:

Variable Documentation

◆ atnr_cs_stat

const short atnr_cs_stat[NROFATTACKS]
static
Initial value:

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 75 of file request.c.

Referenced by esrv_update_stats().

◆ heads

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 1020 of file request.c.

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

CS_STAT_RES_DEPLETE
#define CS_STAT_RES_DEPLETE
Definition: newclient.h:162
CS_STAT_RES_FEAR
#define CS_STAT_RES_FEAR
Definition: newclient.h:161
strdup_local
#define strdup_local
Definition: compat.h:29
CS_STAT_RES_FIRE
#define CS_STAT_RES_FIRE
Definition: newclient.h:150
QUERY_FLAG
#define QUERY_FLAG(xyz, p)
Definition: define.h:226
pl
Definition: player.h:105
CS_STAT_RES_MAG
#define CS_STAT_RES_MAG
Definition: newclient.h:149
pl::ob
object * ob
Definition: player.h:176
CS_STAT_RES_HOLYWORD
#define CS_STAT_RES_HOLYWORD
Definition: newclient.h:164
CS_STAT_RES_CONF
#define CS_STAT_RES_CONF
Definition: newclient.h:153
CS_STAT_TURN_UNDEAD
#define CS_STAT_TURN_UNDEAD
Definition: newclient.h:160
C
#define C(w, e)
CS_STAT_RES_SLOW
#define CS_STAT_RES_SLOW
Definition: newclient.h:158
CS_STAT_RES_PHYS
#define CS_STAT_RES_PHYS
Definition: newclient.h:148
CS_STAT_RES_GHOSTHIT
#define CS_STAT_RES_GHOSTHIT
Definition: newclient.h:156
CS_STAT_RES_BLIND
#define CS_STAT_RES_BLIND
Definition: newclient.h:165
CS_STAT_RES_POISON
#define CS_STAT_RES_POISON
Definition: newclient.h:157
CS_STAT_RES_COLD
#define CS_STAT_RES_COLD
Definition: newclient.h:152
CS_STAT_RES_DEATH
#define CS_STAT_RES_DEATH
Definition: newclient.h:163
CS_STAT_RES_DRAIN
#define CS_STAT_RES_DRAIN
Definition: newclient.h:155
FLOAT_MULTI
#define FLOAT_MULTI
Definition: newclient.h:79
CS_STAT_RES_PARA
#define CS_STAT_RES_PARA
Definition: newclient.h:159
CS_STAT_RES_ACID
#define CS_STAT_RES_ACID
Definition: newclient.h:154
CS_STAT_RES_ELEC
#define CS_STAT_RES_ELEC
Definition: newclient.h:151