54 #include <sys/types.h> 55 #include <netinet/in.h> 56 #include <netinet/tcp.h> 98 if (len <= 0 || !buf) {
118 for (; buf[s] && buf[s] !=
' '; s++)
124 while (buf[s] ==
' ')
130 for (; buf[s] && buf[s] !=
' '; s++)
134 while (s < len && buf[s] ==
' ')
139 if (!strcmp(cmd,
"sound2")) {
142 }
else if (!strcmp(cmd,
"spellmon")) {
145 monitor_spells = atoi(param);
146 if (monitor_spells < 0 || monitor_spells > 2) {
152 }
else if (!strcmp(cmd,
"darkness")) {
155 darkness = atoi(param);
156 if (darkness != 0 && darkness != 1) {
162 }
else if (!strcmp(cmd,
"map2cmd")) {
165 map2cmd = atoi(param);
171 }
else if (!strcmp(cmd,
"facecache")) {
174 facecache = atoi(param);
175 if (facecache != 0 && facecache != 1) {
181 }
else if (!strcmp(cmd,
"faceset")) {
187 }
else if (!strcmp(cmd,
"mapsize")) {
190 if (sscanf(param,
"%dx%d%n", &x, &y, &n) != 2 || n != (
int)strlen(param)) {
214 }
else if (!strcmp(cmd,
"tick")) {
218 if (tick != 0 && tick != 1) {
224 }
else if (!strcmp(cmd,
"bot")) {
227 is_bot = atoi(param);
228 if (is_bot != 0 && is_bot != 1) {
234 }
else if (!strcmp(cmd,
"want_pickup")) {
237 want_pickup = atoi(param);
238 if (want_pickup != 0 && want_pickup != 1) {
244 }
else if (!strcmp(cmd,
"num_look_objects")) {
262 }
else if (!strcmp(cmd,
"extended_stats")) {
265 extended_stats = atoi(param);
266 if (extended_stats != 0 && extended_stats != 1) {
272 }
else if (!strcmp(cmd,
"beat")) {
273 int use_beat = atoi(param);
275 if (use_beat != 0 && use_beat != 1) {
283 }
else if (!strcmp(cmd,
"loginmethod")) {
286 loginmethod = atoi(param);
289 if (loginmethod > 2) loginmethod=2;
294 }
else if (!strcmp(cmd,
"notifications")) {
297 notifications = atoi(param);
302 }
else if (!strcmp(cmd,
"newmapcmd")) {
310 }
else if (!strcmp(cmd,
"extendedTextInfos")) {
316 }
else if (!strcmp(cmd,
"itemcmd")) {
322 }
else if (!strcmp(cmd,
"exp64")) {
373 "Warning: Your client is too old to receive map data. Please update to a new client at: " 374 "https://sourceforge.net/projects/crossfire/");
390 const Face *smoothface;
401 "Could not smooth face %d\n" 402 "Check that this face has a smoothing pixmap, or remove its smoothlevel.\n",
428 if (len <= 0 || !buf) {
429 LOG(
llevDebug,
"IP '%s' sent bogus ask_smooth_cmd information\n", ns->
host);
456 LOG(
llevDebug,
"Corrupt ncom command - not long enough - discarding\n");
469 strncpy(command, (
char *)buf+6, len-4);
470 command[len-4] =
'\0';
479 "You can not issue commands - state is not ST_PLAYING (%s)",
486 LOG(
llevError,
"Player has negative time - shouldn't do command.\n");
513 if (len <= 0 || !buf) {
532 LOG(
llevError,
"Got reply message with ST_PLAYING input state\n");
585 char *cs_str =
strtok_r(buf,
" ", &rest);
586 char *sc_str =
strtok_r(NULL,
" ", &rest);
588 if (cs_str == NULL || sc_str == NULL) {
607 LOG(
llevInfo,
"Connection from %s (%s), CS %d, SC %d\n",
642 if (len <= 0 || !buf) {
652 for (i = 0; i < 2; i++) {
654 if (!(buf = strchr(buf,
' '))) {
686 #define AddIfInt64(Old, New, Type) \ 689 SockList_AddChar(&sl, Type); \ 690 SockList_AddInt64(&sl, New); \ 693 #define AddIfInt(Old, New, Type) \ 696 SockList_AddChar(&sl, Type); \ 697 SockList_AddInt(&sl, New); \ 700 #define AddIfShort(Old, New, Type) \ 703 SockList_AddChar(&sl, Type); \ 704 SockList_AddShort(&sl, New); \ 707 #define AddIfFloat(Old, New, Type) \ 710 SockList_AddChar(&sl, Type); \ 711 SockList_AddInt(&sl, (long)(New*FLOAT_MULTI));\ 714 #define AddIfString(Old, New, Type) \ 715 if (Old == NULL || strcmp(Old, New)) { \ 717 Old = strdup_local(New); \ 718 SockList_AddChar(&sl, Type); \ 719 SockList_AddLen8Data(&sl, New, strlen(New));\ 737 if (pl->
ob != NULL) {
761 if (pl->
ob != NULL) {
800 LOG(
llevDebug,
"pruning removed object from last_skill_ob\n");
934 memset(cell->
faces, face,
sizeof(cell->
faces));
937 #define MAX_HEAD_POS MAX(MAX_CLIENT_X, MAX_CLIENT_Y) 974 uint8_t nlayer, smoothlevel = 0;
1004 if (bx < ax || by < ay) {
1005 LOG(
llevError,
"map2_add_ob: bx (%d) or by (%d) is less than ax (%d) or ay (%d)\n", bx, by, ax, ay);
1012 for (l = layer-1; l <= layer+1; l++) {
1015 if (heads[by][bx][l] == head)
1022 if (!heads[by][bx][layer])
1023 heads[by][bx][layer] = head;
1024 else if (layer+1 <
MAP_LAYERS && !heads[by][bx][layer+1])
1025 heads[by][bx][layer+1] = head;
1046 uint8_t len, anim_speed = 0, i;
1075 anim_speed = (int)(1.0/
FABS(ob->
speed));
1123 nlayer = 0x10+layer+(2<<5);
1144 int got_one = 0, poisoned = 0, diseased = 0;
1146 int value, granularity;
1147 const object *
probe;
1164 if (probe == NULL || probe->
level < 15) {
1169 granularity = (probe->
level - 14) / 3;
1170 if (granularity <= 0)
1172 else if (granularity > 30)
1181 else if (value > granularity)
1182 value = granularity;
1186 value = (value * 30) / granularity;
1196 snprintf(name,
sizeof(name),
"hpbar%s%s%s_%d",
1197 poisoned ?
"_poisoned" :
"",
1198 diseased ?
"_diseased" :
"",
1199 (!poisoned && !diseased) ?
"_standard" :
"",
1202 if (dummy != NULL) {
1212 int got_one =
check_probe(ax, ay, ob, sl, ns, has_obj, alive_layer);
1215 if (dummy != NULL) {
1239 int layer, got_one = 0, del_one = 0, oldlen, has_obj = 0;
1246 for (layer = 0; layer <
MAP_LAYERS; layer++) {
1249 head = heads[ay][ax][layer];
1254 got_one +=
map2_add_ob(ax, ay, layer, head, sl, ns, &has_obj, 1);
1267 if (!del_one && !got_one) {
1269 }
else if (del_one && !has_obj) {
1286 int x, y, ax, ay, d, min_x, max_x, min_y, max_y, oldlen, layer;
1308 memset(heads, 0,
sizeof(heads));
1322 for (y = min_y; y < max_y; y++, ay++) {
1324 for (x = min_x; x < max_x; x++, ax++) {
1374 int have_darkness = 0, has_obj = 0, got_one = 0, del_one = 0, g1, alive_layer = -1, old_got;
1404 for (layer = 0; layer <
MAP_LAYERS; layer++) {
1421 if (got_one != old_got || (ob->
head == NULL && ob->
more))
1429 if (g1 == has_obj) {
1431 }
else if (ob->
head == NULL) {
1436 if (layer != alive_layer)
1443 if (!del_one && !got_one && !have_darkness) {
1445 }
else if (del_one && !has_obj) {
1467 if (sl.
len > startlen) {
1481 int min_x, min_y, max_x, max_y;
1484 LOG(
llevError,
"draw_client_map called with non player/non eric-server\n");
1508 for (j = min_y; j < max_y; j++) {
1509 for (i = min_x; i < max_x; i++) {
1553 for (x = 0; x < mx; x++) {
1554 for (y = 0; y < my; y++) {
1555 if (x >= ns->
mapx || y >= ns->
mapy) {
1557 memset(&newmap.
cells[x][y], 0,
sizeof(newmap.
cells[x][y]));
1558 }
else if (x+dx < 0 || x+dx >= ns->
mapx || y+dy < 0 || y+dy >= ns->
mapy) {
1560 memset(&newmap.
cells[x][y], 0,
sizeof(newmap.
cells[x][y]));
1607 if (spell->type ==
SPELL) {
1644 if (!pl || !spell || spell->
env != pl->
ob) {
1685 switch (spell->
type)
1710 int len, i, skill = 0;
1736 if (!strcmp(spell->
skill, skill_names[i])) {
1750 len = strlen(spell->
msg);
1784 LOG(
llevError,
"esrv_add_spells, tried to add a spell to a NULL player\n");
1807 size = 26+strlen(spell->
name)+(spell->
msg ? strlen(spell->
msg) : 0);
1811 size += 2 + (value ? strlen(value) : 0);
1821 LOG(
llevError,
"Asked to send a non-spell object as a spell\n");
1845 if (setsockopt(pl->
socket.
fd, IPPROTO_TCP, TCP_NODELAY, &tmp,
sizeof(tmp)))
1846 LOG(
llevError,
"send_tick: Unable to turn on TCP_NODELAY\n");
1850 if (setsockopt(pl->
socket.
fd, IPPROTO_TCP, TCP_NODELAY, &tmp,
sizeof(tmp)))
1851 LOG(
llevError,
"send_tick: Unable to turn off TCP_NODELAY\n");
1950 if (!chars[i])
break;
1952 if (!strcmp(chars[i], acn->
name)) {
1961 if (!chars[i])
break;
1982 if (acn->
face[0] != 0 ) {
2008 if (!chars[i])
break;
2049 nlen = (
unsigned char)buf[0];
2050 if (nlen >=
MAX_BUF || nlen > *len-2) {
2053 memcpy(name, buf+1, nlen);
2056 plen = (
unsigned char)buf[nlen+1];
2057 if (plen >=
MAX_BUF || plen > *len-2-nlen) {
2060 memcpy(password, buf+2+nlen, plen);
2082 if (len <= 0 || !buf) {
2083 LOG(
llevDebug,
"IP '%s' sent bogus add_player_cmd information\n", ns->
host);
2105 SockList_AddString(&sl,
"failure accountlogin No such account name exists on this server");
2129 if (tns && tns != ns)
2153 LOG(
llevInfo,
"Failed account login for '%s' from %s\n", name, ns->
host);
2209 if (len <= 0 || !buf) {
2210 LOG(
llevDebug,
"IP '%s' sent bogus add_player_cmd information\n", ns->
host);
2248 if (strlen(password)<2) {
2256 SockList_AddString(&sl,
"failure accountnew That account already exists on this server");
2265 "failure accountnew That account name contains invalid characters.");
2273 "failure accountnew That account name is too long");
2282 "failure accountnew That password contains invalid characters.");
2290 "failure accountnew That password is too long");
2320 int status, force, nlen;
2324 if (len <= 0 || !buf) {
2325 LOG(
llevDebug,
"IP '%s' sent bogus add_player_cmd information\n", ns->
host);
2377 SockList_AddString(&sl,
"failure accountaddplayer 0 That character is already connected to this account.");
2383 SockList_AddString(&sl,
"failure accountaddplayer 1 That character is already connected to a different account.");
2395 SockList_AddString(&sl,
"failure accountaddplayer 0 That character is already connected to a different account which is currently logged in.");
2417 }
else if (status == 2) {
2418 SockList_AddString(&sl,
"failure accountaddplayer 0 You have reached the maximum number of characters allowed per account.");
2454 if (len <= 0 || !buf) {
2455 LOG(
llevDebug,
"IP '%s' sent bogus account_play_cmd information\n", ns->
host);
2485 if (!chars[i] || !strcmp(chars[i], buf))
break;
2488 if (i == MAX_CHARACTERS_PER_ACCOUNT || !chars[i]) {
2490 "failure accountplay Character %s is not associated with account %s",
2533 #define MAX_CHOICES 100 2543 int status, nlen, choice_num=0, i;
2546 archetype *map=NULL, *race_a=NULL, *class_a=NULL;
2549 if (len <= 0 || !buf) {
2550 LOG(
llevDebug,
"IP '%s' sent bogus create_player_cmd information\n", ns->
host);
2581 if (strlen(password)<2) {
2604 if (strlen(password)>17)
2613 SockList_AddString(&sl,
"failure createplayer The name contains illegal characters");
2639 if (!strcmp(pl->
ob->
name, name)) {
2675 int i, j, stat_total=0;
2676 char *key, *value, *race=NULL, *
class=NULL;
2681 memset(&new_stats, 0,
sizeof(
living));
2683 while (nlen < len) {
2692 if ((i == 0) || (nlen + i > len))
break;
2700 key = buf + nlen + 1;
2701 value = strchr(key,
' ');
2707 else if (!
strcasecmp(key,
"class"))
class = value;
2712 "failure createplayer Invalid or map");
2726 "Number of choices receive exceed max value: %d>%d\n",
2729 choices[choice_num] = value;
2737 int val = atoi(value);
2743 if (j >= NUM_STATS) {
2747 LOG(
llevError,
"Got unknown key/value from client: %s %s\n", key, value);
2765 "failure createplayer Stat value is out of range - %d must be between %d and %d",
2774 "failure createplayer Total allocated statistics is higher than allowed (%d>%d)",
2790 if (!race_a || race_a->clone.type !=
PLAYER || !class_a || class_a->clone.type !=
CLASS) {
2792 "failure createplayer Invalid or unknown race or class");
2803 "failure createplayer Unable to apply race or class - statistic is out of bounds");
2861 LOG(
llevError,
"Can not find object of type MAP subtype MAP_TYPE_DEFAULT.\n");
2862 LOG(
llevError,
"Are the archetype files up to date? Can not continue.\n");
2868 if (pl->
ob->
map == NULL) {
2888 for (i=0; i < choice_num; i++) {
2889 char *choiceval, *cp;
2894 choiceval = strchr(choices[i],
' ');
2896 LOG(
llevError,
"Choice does not specify value: %s\n", choices[i]);
2906 LOG(
llevError,
"Choice not found in archetype: %s\n", choices[i]);
2909 cp = strstr(value, choiceval);
2911 LOG(
llevError,
"Choice value not found in archetype: %s %s\n",
2912 choices[i], choiceval);
2922 if ((cp[strlen(choiceval)] !=
' ') && (cp[strlen(choiceval)] != 0) &&
2923 (cp != value) && (*(cp-1) !=
' ')) {
2925 LOG(
llevError,
"Choice value matches substring but not entire word: %s substring %s\n",
2931 LOG(
llevError,
"Choice value can not find archetype %s\n", choiceval);
2943 "%s has entered the game.", pl->
ob->
name);
2961 if (len <= 0 || !buf) {
2962 LOG(
llevDebug,
"IP '%s' sent bogus account_password_cmd information\n", ns->
host);
2992 if (strlen(change)<2) {
3002 "failure accountpw That password contains invalid characters.");
3010 "failure accountpw That password is too long");
3021 error =
"failure accountpw Illegal characters present";
3022 }
else if (status == 2) {
3023 error =
"failure accountpw Invalid account";
3025 error =
"failure accountpw Incorrect current password";
void map_newmap_cmd(socket_struct *ns)
void draw_ext_info_format(int flags, int pri, const object *pl, uint8_t type, uint8_t subtype, const char *format,...)
object * object_find_by_type_and_name(const object *who, int type, const char *name)
void set_attr_value(living *stats, int attr, int8_t value)
void SockList_AddPrintf(SockList *sl, const char *format,...)
#define CS_STAT_RES_GHOSTHIT
#define CS_STAT_APPLIED_CON
#define ST_GET_PARTY_PASSWORD
const char * skill_names[MAX_SKILLS]
void SockList_Reset(SockList *sl)
void new_player_cmd(uint8_t *buf, int len, player *pl)
void enter_exit(object *op, object *exit_ob)
void esrv_add_spells(player *pl, object *spell)
int account_login(const char *account_name, const char *account_password)
const Face * get_face_by_id(uint16_t id)
int account_remove_player(const char *account_name, const char *player_name)
#define CS_STAT_RES_POISON
static int map2_delete_layer(int ax, int ay, int layer, SockList *sl, socket_struct *ns)
void SockList_Init(SockList *sl)
void receive_player_password(object *op)
uint8_t starting_stat_min
#define CS_STAT_RES_DRAIN
void SockList_ResetRead(SockList *sl)
int GetInt_String(const unsigned char *data)
int16_t last_resist[NROFATTACKS]
player * add_player(socket_struct *ns, int flags)
void send_account_players(socket_struct *ns)
int account_change_password(const char *account_name, const char *current_password, const char *new_password)
const char * account_get_account_for_char(const char *charname)
int account_new(const char *account_name, const char *account_password)
void send_tick(player *pl)
int save_player(object *op, int flag)
void account_play_cmd(char *buf, int len, socket_struct *ns)
void print_ext_msg(socket_struct *ns, int color, uint8_t type, uint8_t subtype, const char *message)
mapstruct * get_map_from_coord(mapstruct *m, int16_t *x, int16_t *y)
const char * object_get_value(const object *op, const char *const key)
struct treasureliststruct * randomitems
void key_roll_stat(object *op, char key)
void SockList_AddShort(SockList *sl, uint16_t data)
#define ST_CHANGE_PASSWORD_CONFIRM
static int decode_name_password(const char *buf, int *len, char *name, char *password)
#define NS_FACESENT_SMOOTH
#define ST_CONFIRM_PASSWORD
int16_t SP_level_spellpoint_cost(object *caster, object *spell, int flags)
object * ranges[range_size]
void account_add_player_cmd(char *buf, int len, socket_struct *ns)
int is_valid_faceset(int fsn)
int SP_level_dam_adjust(const object *caster, const object *spob)
const char * account_exists(const char *account_name)
#define AddIfInt64(Old, New, Type)
uint8_t starting_stat_max
void SockList_AddInt(SockList *sl, uint32_t data)
#define ST_CHANGE_PASSWORD_NEW
#define CS_STAT_RES_DEATH
int verify_player(const char *name, char *password)
int8_t get_attr_value(const living *stats, int attr)
method_ret ob_apply(object *op, object *applier, int aflags)
void account_char_free(Account_Char *chars)
void esrv_remove_spell(player *pl, object *spell)
#define AddIfString(Old, New, Type)
uint32_t get_weight_limit(int stat)
int apply_race_and_class(object *op, archetype *race, archetype *opclass, living *stats)
#define SP_CREATE_MISSILE
struct archt * other_arch
char savebed_map[MAX_BUF]
#define CS_STAT_WEIGHT_LIM
#define MAP_LAYER_LIVING2
void esrv_send_animation(socket_struct *ns, const Animations *anim)
void version_cmd(char *buf, int len, socket_struct *ns)
client_spell * get_client_spell_state(player *pl, object *spell)
struct account_char_struct * next
void send_query(socket_struct *ns, uint8_t flags, const char *text)
int probe(object *op, object *caster, object *spell_ob, int dir, int level)
static int annotate_ob(int ax, int ay, const object *ob, SockList *sl, socket_struct *ns, int *has_obj, int *alive_layer)
#define MAX_NUM_LOOK_OBJECTS
int get_skill_client_code(const char *skill_name)
#define FLAG_CLIENT_ANIM_RANDOM
#define strtok_r(x, y, z)
Account_Char * account_chars
#define ADD_PLAYER_NO_STATS_ROLL
void move_cmd(char *buf, int len, player *pl)
void SockList_AddData(SockList *sl, const void *data, size_t len)
int account_is_logged_in(const char *name)
#define CS_STAT_RES_HOLYWORD
#define AddIfInt(Old, New, Type)
object * object_insert_in_ob(object *op, object *where)
void key_change_class(object *op, char key)
#define MSG_TYPE_COMMAND_ERROR
void draw_client_map(object *pl)
static const short atnr_cs_stat[NROFATTACKS]
#define FLAG_UNAGGRESSIVE
void receive_party_password(object *op)
void key_confirm_quit(object *op, char key)
#define MSG_TYPE_ADMIN_PLAYER
short GetShort_String(const unsigned char *data)
void SockList_Term(SockList *sl)
void player_set_state(player *pl, uint8_t state)
#define CS_STAT_APPLIED_INT
socket_struct * account_get_logged_in_init_socket(const char *name)
static int check_probe(int ax, int ay, const object *ob, SockList *sl, socket_struct *ns, int *has_obj, int *alive_layer)
#define FLAG_CLIENT_ANIM_SYNC
static int spell_client_use(const object *spell)
void update_position(mapstruct *m, int x, int y)
static void append_spell(player *pl, SockList *sl, object *spell)
living last_applied_stats
player * account_get_logged_in_player(const char *name)
Account_Char * account_char_load(const char *account_name)
#define CS_STAT_TURN_UNDEAD
object * object_present_in_ob(uint8_t type, const object *op)
void SockList_AddString(SockList *sl, const char *data)
#define AddIfFloat(Old, New, Type)
player * get_player(player *p)
void create_player_cmd(char *buf, int len, socket_struct *ns)
void execute_newserver_command(object *pl, char *command)
size_t SockList_Avail(const SockList *sl)
int32_t last_weight_limit
archetype * try_find_archetype(const char *name)
int8_t blocked_los[MAP_CLIENT_X][MAP_CLIENT_Y]
#define CS_STAT_APPLIED_POW
#define QUERY_FLAG(xyz, p)
#define CS_STAT_SPELL_REPEL
#define MSG_TYPE_ADMIN_VERSION
static void draw_client_map2(object *pl)
struct map_cell_struct cells[MAX_CLIENT_X][MAX_CLIENT_Y]
#define CS_STAT_APPLIED_DEX
const Animations * animation
void ask_smooth_cmd(char *buf, int len, socket_struct *ns)
#define MIN_NUM_LOOK_OBJECTS
Account_Char * account_char_remove(Account_Char *chars, const char *pl_name)
static void send_smooth(socket_struct *ns, const Face *face)
const char * character_class
#define AddIfShort(Old, New, Type)
void add_me_cmd(char *buf, int len, socket_struct *ns)
int64_t last_skill_exp[MAX_SKILLS]
static const flag_definition flags[]
uint8_t account_block_create
client_spell * spell_state
void SockList_AddChar(SockList *sl, unsigned char c)
void receive_player_name(object *op)
#define CS_STAT_APPLIED_CHA
int16_t resist[NROFATTACKS]
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)
#define GET_MAP_FACE_OBJ(M, X, Y, L)
void esrv_draw_look(object *pl)
int account_check_string(const char *str)
int account_link(const char *account_name, const char *player_name)
#define MAP2_TYPE_DARKNESS
#define MAP_LAYER_LIVING1
void account_password(char *buf, int len, socket_struct *ns)
void set_up_cmd(char *buf, int len, socket_struct *ns)
void esrv_send_face(socket_struct *ns, const Face *face, int nocache)
#define FREE_AND_COPY(sv, nv)
static int account_block_create(const socket_struct *ns)
#define CS_STAT_APPLIED_STR
#define NUM_ANIMATIONS(ob)
player * find_player_socket(const socket_struct *ns)
archetype * get_archetype_by_type_subtype(int type, int subtype)
void esrv_update_spells(player *pl)
static void check_space_for_heads(int ax, int ay, SockList *sl, socket_struct *ns)
uint8_t starting_stat_points
void send_plugin_custom_message(object *pl, char *buf)
void account_char_save(const char *account, Account_Char *chars)
uint8_t anims_sent[MAXANIMNUM]
void esrv_send_pickup(player *pl)
#define CS_STAT_RES_DEPLETE
void check_login(object *op, int check_pass)
void esrv_new_player(player *pl, uint32_t weight)
void SockList_AddLen8Data(SockList *sl, const void *data, size_t len)
#define ADD_PLAYER_NO_MAP
static void map_clearcell(struct map_cell_struct *cell, int face, int count)
#define CS_STAT_APPLIED_WIS
#define ST_CHANGE_PASSWORD_OLD
#define MAX_CHARACTERS_PER_ACCOUNT
#define SP_SUMMON_MONSTER
void update_los(object *op)
void receive_play_again(object *op, char key)
sstring add_string(const char *str)
EXTERN player * first_player
int strcasecmp(const char *s1, const char *s2)
#define CS_STAT_SPELL_DENY
void esrv_update_stats(player *pl)
int get_map_flags(mapstruct *oldmap, mapstruct **newmap, int16_t x, int16_t y, int16_t *nx, int16_t *ny)
static void add_char_field(SockList *sl, int type, const char *data)
uint32_t last_path_repelled
void LOG(LogLevel logLevel, const char *format,...)
#define CS_STAT_RES_BLIND
object * last_skill_ob[MAX_SKILLS]
#define CS_STAT_GOLEM_MAXHP
void set_title(const object *pl, char *buf, size_t len)
char ** account_get_players_for_account(const char *account_name)
uint32_t last_path_attuned
void rangetostring(const object *pl, char *obuf, size_t len)
void SockList_AddInt64(SockList *sl, uint64_t data)
const Face * find_face(const char *name, const Face *error)
#define CS_STAT_SPELL_ATTUNE
void reply_cmd(char *buf, int len, player *pl)
void account_login_cmd(char *buf, int len, socket_struct *ns)
const char *const short_stat_name[NUM_STATS]
char const * newhash(char const *password)
int find_smooth(const Face *face, const Face **smoothed)
object * arch_to_object(archetype *at)
#define CS_STAT_SKILLINFO
int check_race_and_class(living *stats, archetype *race, archetype *opclass)
static const object * heads[MAX_HEAD_POS][MAX_HEAD_POS][MAP_LAYERS]
#define MAP2_COORD_ENCODE(x, y, flags)
uint16_t faces[MAP_LAYERS]
void esrv_map_scroll(socket_struct *ns, int dx, int dy)
void account_new_cmd(char *buf, int len, socket_struct *ns)
#define FOR_INV_PREPARE(op_, it_)
void object_remove(object *op)
uint32_t last_path_denied
static bool CAN_PROBE(const object *ob)
void Send_With_Handling(socket_struct *ns, SockList *sl)
void esrv_move_object(object *pl, tag_t to, tag_t tag, long nrof)
char * account_trusted_host