ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/client.h
(Generate patch)

Comparing deliantra/server/include/client.h (file contents):
Revision 1.3 by root, Fri Dec 15 20:08:45 2006 UTC vs.
Revision 1.15 by root, Thu Dec 21 23:37:05 2006 UTC

1
2/* 1/*
3 CrossFire, A Multiplayer game for the X Window System 2 CrossFire, A Multiplayer game for the X Window System
4 3
5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 20
22 The author can be reached via e-mail to crossfire@schmorp.de 21 The author can be reached via e-mail to crossfire@schmorp.de
23*/ 22*/
24 23
25/*
26 newserver.h defines various structures and values that are use for the
27 new client server communication method. Values defined here are only
28 used on the server side code. For shared client/server values, see
29 newclient.h
30*/
31
32#ifndef CLIENT_H 24#ifndef CLIENT_H
33#define CLIENT_H 25#define CLIENT_H
34 26
35/* Reduce this from 50 to 5 - as it is now, there will never be more 27#include <deque>
36 * than 3 anyways. 28#include <bitset>
37 */ 29#include <tr1/unordered_set>
38 30
39#define NUM_LOOK_OBJECTS 50 31// (possibly) max. number of objects "per page" in the ground container
32#define FLOORBOX_PAGESIZE 50
40 33
41struct MapCell 34struct MapCell
42{ 35{
43 UUID player; // this is, unfortunately, very wasteful of memory space, but pretty bandwidth-efficient 36 UUID player; // this is, unfortunately, very wasteful of memory space, but pretty bandwidth-efficient
44 int count; /* This is really darkness in the map1 command */ 37 int count; /* This is really darkness in the map1 command */
75 * current state. we set up our on buffers for sending/receiving, so we can 68 * current state. we set up our on buffers for sending/receiving, so we can
76 * handle some higher level functions. fd is the actual file descriptor we 69 * handle some higher level functions. fd is the actual file descriptor we
77 * are using. 70 * are using.
78 */ 71 */
79 72
80enum Sock_Status { Ns_Add, Ns_Dead };
81
82/* Only one map mode can actually be used, so lets make it a switch 73/* Only one map mode can actually be used, so lets make it a switch
83 * instead of having a bunch of different fields that needed to 74 * instead of having a bunch of different fields that needed to
84 * get toggled. 75 * get toggled.
85 */ 76 */
86enum MapMode { Map0Cmd = 0, Map1Cmd = 1, Map1aCmd = 2 }; 77enum MapMode { Map0Cmd = 0, Map1Cmd = 1, Map1aCmd = 2 };
87 78
88/* The following is the setup for a ring buffer for storing outbut 79/* The following is the setup for a ring buffer for storing output
89 * data that the OS can't handle right away. 80 * data that the OS can't handle right away.
90 */ 81 */
91 82
92struct Buffer 83struct Buffer
93{ 84{
94 char data[SOCKETBUFSIZE]; 85 char data[SOCKETBUFSIZE];
95 int start; 86 int start;
96 int len; 87 int len;
97}; 88};
98 89
90// states the socket can be in
91enum {
92 ST_DEAD, // socket is dead
93 ST_SETUP, // initial handshake / setup / login
94 ST_PLAYING, // logged in an playing
95 ST_CUSTOM, // waiting for custom reply
96
97 ST_PLAY_AGAIN,
98 ST_ROLL_STAT,
99 ST_CHANGE_CLASS,
100 ST_CONFIRM_QUIT,
101 ST_CONFIGURE,
102 ST_GET_NAME,
103 ST_GET_PASSWORD,
104 ST_CONFIRM_PASSWORD,
105 ST_GET_PARTY_PASSWORD,
106};
107
108// a handler for a specific type of packet
109enum {
110 PF_PLAYER = 0x01, // must have valid player / will by synchronised
111 PF_PLAYING = 0x02, // must be in playing state
112};
113
114struct packet_type
115{
116 const char *name;
117 void *cb;
118 int flags;
119};
120
121struct command
122{
123 tstamp stamp;
124 const packet_type *handler;
125 char *data;
126 int datalen;
127
128 ~command ()
129 {
130 sfree<char> (data, datalen + 1);
131 }
132};
133
134struct refitem
135{
136 object_ptr op;
137};
138
139// this represents a container on the client side.
140// right now, there are only ever two of them:
141// the inventory and the floor/open container
142//TODO: unused as of yet
143struct client_container : vector< refitem, slice_allocator<refitem> >
144{
145 client *ns;
146 enum { CC_NONE, CC_INVENTORY, CC_MAPSPACE, CC_CONTAINER } type;
147
148 bool item_changed; // one of the items in here possibly changed
149
150 // for mapspace and container
151 int x, y;
152 maptile *map;
153
154 // for container
155 object *env;
156
157 client_container (client *ns)
158 : ns (ns), type (CC_NONE) { }
159
160 tag_t tag () const;
161
162 inline iterator merge_item (iterator i, object *op);
163
164 void clear ();
165 void update ();
166
167 void set_mapspace (maptile *map, int x, int y);
168 void set_container (object *env);
169};
170
99/* how many times we are allowed to give the wrong password before being kicked. */ 171/* how many times we are allowed to give the wrong password before being kicked. */
100#define MAX_PASSWORD_FAILURES 5 172#define MAX_PASSWORD_FAILURES 5
101 173
102ACC_CLASS (client) // should become player when newsocket is a baseclass of player 174ACC_CLASS (client) // should become player when newsocket is a baseclass of player
103struct client : zero_initialised, attachable_base 175struct client : zero_initialised, attachable<client>
104{ 176{
105 enum Sock_Status status;
106 int ACC (RW, fd); 177 int ACC (RW, fd);
107 unsigned int inbuf_len; // number of bytes valid in inbuf 178 unsigned int inbuf_len; // number of bytes valid in inbuf
108 struct Map lastmap;
109 size_t faces_sent_len; /* This is the number of elements allocated in faces_sent[] */
110 uint8 *faces_sent; /* This is a bitmap on sent face status */ 179 uint8 *faces_sent; // This is a bitmap on sent face status
111 uint8 anims_sent[MAXANIMNUM]; 180 statsinfo stats;
112 struct statsinfo stats; 181
182 client_container cc_inv, cc_other;
183 Buffer outputbuffer;
113 184
114 char *ACC (RW, host); /* Which host it is connected from (ip address) */ 185 char *ACC (RW, host); /* Which host it is connected from (ip address) */
186 uint8 ACC (RW, state); /* Input state of the player (name, password, etc */
115 uint8 ACC (RW, password_fails); /* how many times the player has failed to give the right password */ 187 uint8 ACC (RW, password_fails); /* how many times the player has failed to give the right password */
116 Buffer outputbuffer; /* For undeliverable data */
117 188
118 bool ACC (RW, facecache); /* If true, client is caching images */ 189 bool ACC (RW, facecache); /* If true, client is caching images */
119 bool ACC (RW, sent_scroll); 190 bool ACC (RW, sent_scroll);
120 bool ACC (RW, sound); /* does the client want sound */ 191 bool ACC (RW, sound); /* does the client want sound */
121 bool ACC (RW, exp64); /* Client wants 64 bit exp data, as well as skill data */ 192 bool ACC (RW, exp64); /* Client wants 64 bit exp data, as well as skill data */
122 bool ACC (RW, newmapcmd); /* Send newmap command when entering new map SMACFIGGEN */ 193 bool ACC (RW, newmapcmd); /* Send newmap command when entering new map SMACFIGGEN */
123 bool ACC (RW, plugincmd); /* CF+ extend the protocol through a plug-in */ 194 bool ACC (RW, plugincmd); /* CF+ extend the protocol through a plug-in */
124 bool ACC (RW, mapinfocmd); /* CF+ return map info and send map change info */ 195 bool ACC (RW, mapinfocmd); /* CF+ return map info and send map change info */
125 bool ACC (RW, extcmd); /* CF+ call into extensions/plugins */ 196 bool ACC (RW, extcmd); /* CF+ call into extensions/plugins */
126 bool ACC (RW, extmap); /* CF+ extend map comamnd with extra data */ 197 bool ACC (RW, extmap); /* CF+ extend map comamnd with extra data */
127 bool ACC (RW, buggy_mapscroll); /* CF+ client crashes on large mapscrolls */ 198 bool ACC (RW, buggy_mapscroll); /* CF+ client crashes on large mapscrolls */
128 bool ACC (RW, darkness); /* True if client wants darkness information */ 199 bool ACC (RW, darkness); /* True if client wants darkness information */
129 bool ACC (RW, image2); /* Client wants image2/face2 commands */ 200 bool ACC (RW, image2); /* Client wants image2/face2 commands */
130 bool ACC (RW, update_look); /* If true, we need to send the look window */ 201 bool ACC (RW, update_look); /* If true, we need to send the look window */
131 bool ACC (RW, has_readable_type); /* If true client accept additional text information */ 202 bool ACC (RW, has_readable_type); /* If true client accept additional text information */
132 /* used to arrange text in books, scrolls, or scripted dialogs */ 203 /* used to arrange text in books, scrolls, or scripted dialogs */
133 bool ACC (RW, monitor_spells); /* Client wishes to be informed when their spell list changes */ 204 bool ACC (RW, monitor_spells); /* Client wishes to be informed when their spell list changes */
134 bool ACC (RW, ext_mapinfos); /* If true client accept additionnal info on maps */ 205 bool ACC (RW, ext_mapinfos); /* If true client accepts additional info on maps */
135 /* Below are flags for extedend infos to pass to client 206 /* Below are flags for extedend infos to pass to client
136 * with S->C mapextended command */ 207 * with S->C mapextended command */
137 bool ACC (RW, EMI_smooth); /* Send smooth in extendmapinfos */ 208 bool ACC (RW, EMI_smooth); /* Send smooth in extendmapinfos */
138 209
139 uint32 ACC (RW, supported_readables); /* each bit is a readable supported by client */ 210 uint32 ACC (RW, supported_readables); /* each bit is a readable supported by client */
140 uint32 ACC (RW, cs_version), ACC (RW, sc_version); /* versions of the client */ 211 uint32 ACC (RW, cs_version), ACC (RW, sc_version); /* versions of the client */
141 enum MapMode mapmode; /* Type of map commands the client wants. */ 212 enum MapMode mapmode; /* Type of map commands the client wants. */
142 uint16 ACC (RW, look_position); /* start of drawing of look window */ 213 uint16 ACC (RW, look_position); /* start of drawing of look window */
144 uint8 ACC (RW, itemcmd); /* What version of the 'item' protocol command to use */ 215 uint8 ACC (RW, itemcmd); /* What version of the 'item' protocol command to use */
145 uint8 ACC (RW, faceset); /* Set the client is using, default 0 */ 216 uint8 ACC (RW, faceset); /* Set the client is using, default 0 */
146 217
147 maptile *ACC (RW, current_map); // CF+ last/current player map 218 maptile *ACC (RW, current_map); // CF+ last/current player map
148 int ACC (RW, current_x), ACC (RW, current_y); // CF+ last/current map position 219 int ACC (RW, current_x), ACC (RW, current_y); // CF+ last/current map position
149 char ACC (RW, version)[64]; // CF+ client name/version 220 char ACC (RW, version)[64]; // CF+ client name/version
150 221
151 /* If we get an incomplete packet, this is used to hold the data. */
152 uint8 inbuf[MAXSOCKBUF];
153 player *ACC (RO, pl);//TODO should not be here, preferably 222 player *ACC (RO, pl);//TODO should not be here, preferably
154 223
155 int ACC (RW, rtt), ACC (RW, rttvar); /* round-trip time and -variance, if known */ 224 int ACC (RW, rtt), ACC (RW, rttvar); /* round-trip time and -variance, if known */
156
157 iow socket_ev; void socket_cb (iow &w, int got);
158 225
159 client (int fd, const char *from_ip); 226 client (int fd, const char *from_ip);
160 ~client (); 227 ~client ();
228 void destroy ();
229 bool destroyed () const { return state == ST_DEAD; }
161 230
231 iw cmd_ev; void cmd_cb (iw &w);
232 iow socket_ev; void socket_cb (iow &w, int got);
233
234 std::deque< command, slice_allocator<command> > cmd_queue;
235
236 // large structures at the end please
237 struct Map lastmap;
238 std::bitset<MAXANIMNUM> anims_sent;
239 // if we get an incomplete packet, this is used to hold the data.
240 // we add 2 byte for the header, one for the trailing 0 byte
241 uint8 inbuf[MAXSOCKBUF + 2 + 1];
242
243 bool may_execute (const packet_type *pkt) const;
244 void execute (const packet_type *pkt, char *data, int datalen);
245
246 void queue_command (packet_type *handler, char *data, int datalen);
247 bool handle_command ();
248 // resets movement state
249 void reset_state ();
250
251 bool handle_packet ();
162 int read_packet (); // returns length of packet or 0 252 int next_packet (); // returns length of packet or 0
163 void skip_packet (int len); // we have processed the packet, skip it 253 void skip_packet (int len); // we have processed the packet, skip it
164 254
165 void flush (); 255 void flush ();
166 void write_outputbuffer (); 256 void write_outputbuffer ();
167 void send (void *buf_, int len); 257 void send (void *buf_, int len);
168 258
169 void send_packet (const char *buf); 259 void send_packet (const char *buf);
170 void send_packet (const char *buf, int len); 260 void send_packet (const char *buf, int len);
261 void send_packet_printf (const char *format, ...);
171 void send_packet (packet &sl); 262 void send_packet (packet &sl);
263
264 // called when something under the player changes
265 void floorbox_update () { update_look = 1; }
266 // called when the player has been moved
267 void floorbox_reset () { look_position = 0; floorbox_update (); }
268
269 static client *create (int fd, const char *peername);
172}; 270};
173 271
174#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\ 272#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\
175 ( ((__type)>0) &&\ 273 ( ((__type)>0) &&\
176 ((__sockPtr)->has_readable_type) && \ 274 ((__sockPtr)->has_readable_type) && \

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines