File: newserver.h

package info (click to toggle)
crossfire 1.75.0-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,168 kB
  • sloc: ansic: 83,169; sh: 4,659; perl: 1,736; lex: 1,443; makefile: 1,199; python: 43
file content (153 lines) | stat: -rw-r--r-- 6,142 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
 * @file
 * Defines various structures and values that are used for the
 * new client server communication method.  Values defined here are only
 * used on the server side code.  For shared client/server values, see
 * @ref newclient.h
*/

#ifndef NEWSERVER_H
#define NEWSERVER_H

/**
 * The lower bound for the number of objects to send for the 'look' window
 * (container or ground view).
 */
#define MIN_NUM_LOOK_OBJECTS 3 /* 3=prev group, one object, next group */

/**
 * Default value for the number of objects to send for the 'look' window
 * (container or ground view).
 */
#define DEFAULT_NUM_LOOK_OBJECTS 50

/**
 * The upper bound for the number of objects to send for the 'look' window
 * (container or ground view).
 */
#define MAX_NUM_LOOK_OBJECTS 100

/** One map cell, as sent to the client. */
struct map_cell_struct {
    uint16_t faces[MAP_LAYERS];   /**< Face numbers. */
    int darkness;               /**< Cell's darkness. */
};

/**
 * This basically defines the largest size an
 * archetype may be - it is used for allocation of
 * some structures, as well as determining how far
 * we should look for the heads of big images.
 */
#define MAX_HEAD_OFFSET 8

#define MAX_CLIENT_X (MAP_CLIENT_X+MAX_HEAD_OFFSET)
#define MAX_CLIENT_Y (MAP_CLIENT_Y+MAX_HEAD_OFFSET)

/** One map for a player. */
struct Map {
    struct map_cell_struct cells[MAX_CLIENT_X][MAX_CLIENT_Y];
};

/** True max is 16383 given current map compaction method. */
#define MAXANIMNUM  2000

/** Contains the last range/title information sent to client. */
struct statsinfo {
    char *range, *title;
};


/**
 * What state a socket is in.
 */
enum Sock_Status {
    Ns_Avail,
    Ns_Add,
    Ns_Dead
};

/**
 * Contains parameters for socket() and bind() for listening sockets.
 * This struct contains most fields of "struct addrinfo", but
 * older systems do not know struct addrinfo yet.
 */
struct listen_info {
    int family;
    int socktype;
    int protocol;
    socklen_t addrlen;
    struct sockaddr *addr;
};

/** How many times we are allowed to give the wrong password before being kicked. */
#define MAX_PASSWORD_FAILURES 5

/**
 * Socket structure, represents a client-server connection.
 */
typedef struct socket_struct {
    enum Sock_Status status;
    int         fd;
    struct listen_info  *listen;
    struct Map  lastmap;
    int8_t       map_scroll_x, map_scroll_y;
    size_t      faces_sent_len;         /**< This is the number of elements allocated in faces_sent[]. */
    uint8_t       *faces_sent;            /**< This is a bitmap on sent face status. */
    uint8_t       anims_sent[MAXANIMNUM]; /**< What animations we sent. */
    struct statsinfo stats;
    SockList    inbuf;                  /**< If we get an incomplete packet, this is used to hold the data. */
    char        *host;                  /**< Which host it is connected from (ip address). */
    uint8_t       password_fails;         /**< How many times the player has failed to give the right password. */
    uint32_t      facecache:1;            /**< If true, client is caching images. */
    uint32_t      darkness:1;             /**< True if client wants darkness information. */
    uint32_t      update_look:1;          /**< If true, we need to send the look window. */
    uint32_t      update_inventory:1;     /**< If true, we need to send the inventory list. */
    uint32_t      tick:1;                 /**< Client wishes to get tick commands. */
    uint32_t      is_bot:1;               /**< Client shouldn't be reported to metaserver. */
    uint32_t      want_pickup:1;          /**< Client wants pickup information when logging in. */
    uint32_t      extended_stats:1;       /**< Client wants base and maximum statistics information. */
    uint32_t      monitor_spells;         /**< Client wishes to be informed when their spell list changes. */
    uint32_t      sound;                  /**< Client sound mode. */
    bool          heartbeat;              /**< Client will send hearbeats. */
    uint32_t      cs_version, sc_version; /**< Versions of the client. */
    uint16_t      look_position;          /**< Start of drawing of look window. */
    uint16_t      container_position;     /**< Start of container contents to send to client. */
    uint8_t       mapx, mapy;             /**< How large a map the client wants. */
    uint8_t       faceset;                /**< Set the client is using, default 0. */

    /* Below are flags for extedend infos to pass to client
     * with S->C mapextended command (note: this comment seems incorrect?) */
    int8_t       sounds_this_tick;       /**< Number of sounds sent this tick. */
    uint8_t       num_look_objects;       /**< The maximum number of objects to show on the ground view;
                                             this number includes the prev/next group fake items.
                                             Can be set through "num_look_objects" setup option;
                                             defaults to DEFAULT_NUM_LOOK_OBJECTS. */
    char    *account_name;              /**< Name of the account logged in on this socket */
    Account_Char    *account_chars;     /**< Detailed information on characters on this account */
    uint8_t login_method;   /**< Login method this client is using */
    uint16_t notifications; /**< Notifications this client wants to get. */
    uint32_t last_tick;     /**< Number of ticks since last communication. */
} socket_struct;

/**
 * Bitmask for the faces_sent[] array - what
 * portion of the face have we sent?
 */
#define NS_FACESENT_FACE        0x1
#define NS_FACESENT_SMOOTH      0x2

/** Holds some system-related information. */
typedef struct Socket_Info {
    struct timeval timeout;     /**< Timeout for select. */
    int     max_filedescriptor; /**< max filedescriptor on the system. */
    int     allocated_sockets;  /**< Number of allocated items in ::init_sockets. */
} Socket_Info;

extern Socket_Info socket_info;

#define VERSION_CS 1023    /**< Version >= 1023 understand setup cmd */
#define VERSION_SC 1029
#define VERSION_INFO "Crossfire Server"

#endif /* NEWSERVER_H */