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.2 by root, Fri Dec 15 20:07:02 2006 UTC vs.
Revision 1.24 by root, Sun Jan 7 02:39:14 2007 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
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
7 7
8 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
17 17
18 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 21
22 The author can be reached via e-mail to crossfire.de 22 The author can be reached via e-mail to crossfire@schmorp.de
23*/
24
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*/ 23*/
31 24
32#ifndef CLIENT_H 25#ifndef CLIENT_H
33#define CLIENT_H 26#define CLIENT_H
34 27
35/* Reduce this from 50 to 5 - as it is now, there will never be more 28#include <deque>
36 * than 3 anyways. 29#include <bitset>
37 */ 30#include <tr1/unordered_set>
38 31
39#define NUM_LOOK_OBJECTS 50 32// (possibly) max. number of objects "per page" in the ground container
33#define FLOORBOX_PAGESIZE 50
40 34
41struct MapCell 35struct MapCell
42{ 36{
43 UUID player; // this is, unfortunately, very wasteful of memory space, but pretty bandwidth-efficient 37 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 */ 38 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 69 * 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 70 * handle some higher level functions. fd is the actual file descriptor we
77 * are using. 71 * are using.
78 */ 72 */
79 73
80enum Sock_Status { Ns_Add, Ns_Dead };
81
82/* Only one map mode can actually be used, so lets make it a switch 74/* 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 75 * instead of having a bunch of different fields that needed to
84 * get toggled. 76 * get toggled.
85 */ 77 */
86enum MapMode { Map0Cmd = 0, Map1Cmd = 1, Map1aCmd = 2 }; 78enum MapMode { Map0Cmd = 0, Map1Cmd = 1, Map1aCmd = 2 };
87 79
88/* The following is the setup for a ring buffer for storing outbut 80/* The following is the setup for a ring buffer for storing output
89 * data that the OS can't handle right away. 81 * data that the OS can't handle right away.
90 */ 82 */
91
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_CHANGE_CLASS,
98 ST_GET_PARTY_PASSWORD,
99};
100
101// a handler for a specific type of packet
102enum {
103 PF_PLAYER = 0x01, // must have valid player / will by synchronised
104 PF_PLAYING = 0x02, // must be in playing state
105};
106
107struct packet_type
108{
109 const char *name;
110 void *cb;
111 int flags;
112};
113
114struct command
115{
116 tstamp stamp;
117 const packet_type *handler;
118 char *data;
119 int datalen;
120
121 ~command ()
122 {
123 sfree<char> (data, datalen + 1);
124 }
125};
126
127struct refitem
128{
129 object_ptr op;
130};
131
132// this represents a container on the client side.
133// right now, there are only ever two of them:
134// the inventory and the floor/open container
135//TODO: unused as of yet
136struct client_container : vector< refitem, slice_allocator<refitem> >
137{
138 client *ns;
139 enum { CC_NONE, CC_INVENTORY, CC_MAPSPACE, CC_CONTAINER } type;
140
141 bool item_changed; // one of the items in here possibly changed
142
143 // for mapspace and container
144 int x, y;
145 maptile *map;
146
147 // for container
148 object *env;
149
150 client_container (client *ns)
151 : ns (ns), type (CC_NONE) { }
152
153 tag_t tag () const;
154
155 inline iterator merge_item (iterator i, object *op);
156
157 void clear ();
158 void update ();
159
160 void set_mapspace (maptile *map, int x, int y);
161 void set_container (object *env);
162};
163
99/* how many times we are allowed to give the wrong password before being kicked. */ 164/* how many times we are allowed to give the wrong password before being kicked. */
100#define MAX_PASSWORD_FAILURES 5 165#define MAX_PASSWORD_FAILURES 5
101 166
102ACC_CLASS (client) // should become player when newsocket is a baseclass of player 167INTERFACE_CLASS (client) // should become player when newsocket is a baseclass of player
103struct client : zero_initialised, attachable_base 168struct client : zero_initialised, attachable
104{ 169{
105 enum Sock_Status status;
106 int ACC (RW, fd); 170 int ACC (RW, fd);
107 unsigned int inbuf_len; // number of bytes valid in inbuf 171 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 */ 172 uint8 *faces_sent; // This is a bitmap on sent face status
111 uint8 anims_sent[MAXANIMNUM];
112 struct statsinfo stats; 173 statsinfo stats;
174 int ACC (RO, active);
175
176 client_container cc_inv, cc_other;
177 Buffer outputbuffer;
113 178
114 char *ACC (RW, host); /* Which host it is connected from (ip address) */ 179 char *ACC (RW, host); /* Which host it is connected from (ip address) */
180 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 */ 181 uint8 ACC (RW, password_fails); /* how many times the player has failed to give the right password */
116 Buffer outputbuffer; /* For undeliverable data */
117 182
183 bool ACC (RW, afk); /* player is afk */
118 bool ACC (RW, facecache); /* If true, client is caching images */ 184 bool ACC (RW, facecache); /* If true, client is caching images */
119 bool ACC (RW, sent_scroll); 185 bool ACC (RW, sent_scroll);
120 bool ACC (RW, sound); /* does the client want sound */ 186 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 */
122 bool ACC (RW, newmapcmd); /* Send newmap command when entering new map SMACFIGGEN */ 187 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 */ 188 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 */ 189 bool ACC (RW, mapinfocmd); /* CF+ return map info and send map change info */
125 bool ACC (RW, extcmd); /* CF+ call into extensions/plugins */ 190 bool ACC (RW, extcmd); /* CF+ call into extensions/plugins */
126 bool ACC (RW, extmap); /* CF+ extend map comamnd with extra data */ 191 bool ACC (RW, extmap); /* CF+ extend map comamnd with extra data */
127 bool ACC (RW, buggy_mapscroll); /* CF+ client crashes on large mapscrolls */ 192 bool ACC (RW, buggy_mapscroll); /* CF+ client crashes on large mapscrolls */
128 bool ACC (RW, darkness); /* True if client wants darkness information */ 193 bool ACC (RW, darkness); /* True if client wants darkness information */
129 bool ACC (RW, image2); /* Client wants image2/face2 commands */ 194 bool ACC (RW, image2); /* Client wants image2/face2 commands */
130 bool ACC (RW, update_look); /* If true, we need to send the look window */ 195 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 */ 196 bool ACC (RW, has_readable_type); /* If true client accept additional text information */
132 /* used to arrange text in books, scrolls, or scripted dialogs */ 197 /* 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 */ 198 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 */ 199 bool ACC (RW, ext_mapinfos); /* If true client accepts additional info on maps */
135 /* Below are flags for extedend infos to pass to client 200 /* Below are flags for extedend infos to pass to client
136 * with S->C mapextended command */ 201 * with S->C mapextended command */
137 bool ACC (RW, EMI_smooth); /* Send smooth in extendmapinfos */ 202 bool ACC (RW, EMI_smooth); /* Send smooth in extendmapinfos */
138 203
139 uint32 ACC (RW, supported_readables); /* each bit is a readable supported by client */ 204 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 */ 205 uint32 ACC (RW, cs_version), ACC (RW, sc_version); /* versions of the client */
141 enum MapMode mapmode; /* Type of map commands the client wants. */ 206 enum MapMode mapmode; /* Type of map commands the client wants. */
142 uint16 ACC (RW, look_position); /* start of drawing of look window */ 207 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 */ 209 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 */ 210 uint8 ACC (RW, faceset); /* Set the client is using, default 0 */
146 211
147 maptile *ACC (RW, current_map); // CF+ last/current player map 212 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 213 int ACC (RW, current_x), ACC (RW, current_y); // CF+ last/current map position
149 char ACC (RW, version)[64]; // CF+ client name/version 214 char ACC (RW, version)[64]; // CF+ client name/version
150 215
151 /* If we get an incomplete packet, this is used to hold the data. */ 216 player_ptr ACC (RO, pl);
152 uint8 inbuf[MAXSOCKBUF];
153 player *ACC (RO, pl);//TODO should not be here, preferably
154 217
155 int ACC (RW, rtt), ACC (RW, rttvar); /* round-trip time and -variance, if known */ 218 int ACC (RW, rtt), ACC (RW, rttvar); /* round-trip time and -variance, if known */
156 219
220 void do_destroy ();
221 void gather_callbacks (AV *&callbacks, event_type event) const;
222
223 iw cmd_ev; void cmd_cb (iw &w);
157 iow socket_ev; void socket_cb (iow &w, int got); 224 iow socket_ev; void socket_cb (iow &w, int got);
158 225
226 std::deque< command, slice_allocator<command> > cmd_queue;
227
228 // large structures at the end please
229 struct Map lastmap;
230 std::bitset<MAXANIMNUM> anims_sent;
231 // if we get an incomplete packet, this is used to hold the data.
232 // we add 2 byte for the header, one for the trailing 0 byte
233 uint8 inbuf[MAXSOCKBUF + 2 + 1];
234
235 bool may_execute (const packet_type *pkt) const;
236 void execute (const packet_type *pkt, char *data, int datalen);
237
238 void queue_command (packet_type *handler, char *data, int datalen);
239 MTH bool handle_command ();
240 // resets movement state
241 MTH void reset_state ();
242
243 MTH bool handle_packet ();
244 int next_packet (); // returns length of packet or 0
245 void skip_packet (int len); // we have processed the packet, skip it
246
247 MTH void flush ();
248 MTH void write_outputbuffer ();
249 void send (void *buf_, int len);
250
251 void send_packet (const char *buf);
252 void send_packet (const char *buf, int len);
253 void send_packet_printf (const char *format, ...);
254 void send_packet (packet &sl);
255
256 // called when something under the player changes
257 MTH void floorbox_update () { update_look = 1; }
258 // called when the player has been moved
259 MTH void floorbox_reset () { look_position = 0; floorbox_update (); }
260
261 MTH static client *create (int fd, const char *peername);
262
263protected:
159 client (int fd, const char *from_ip); 264 client (int fd, const char *from_ip);
160 ~client (); 265 ~client ();
161
162 int read_packet (); // returns length of packet or 0
163 void skip_packet (int len); // we have processed the packet, skip it
164
165 void flush ();
166 void write_outputbuffer ();
167 void send (void *buf_, int len);
168
169 void send_packet (const char *buf);
170 void send_packet (const char *buf, int len);
171 void send_packet (packet &sl);
172}; 266};
173 267
174#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\ 268#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\
175 ( ((__type)>0) &&\ 269 ( ((__type)>0) &&\
176 ((__sockPtr)->has_readable_type) && \ 270 ((__sockPtr)->has_readable_type) && \
213 307
214#define VERSION_CS 1023 /* version >= 1023 understand setup cmd */ 308#define VERSION_CS 1023 /* version >= 1023 understand setup cmd */
215#define VERSION_SC 1027 309#define VERSION_SC 1027
216#define VERSION_INFO "Crossfire+ Server" 310#define VERSION_INFO "Crossfire+ Server"
217 311
218typedef unordered_vector<client *> sockvec; 312typedef object_vector<client, &client::active> sockvec;
219 313
220extern sockvec clients; 314extern sockvec clients;
315
316#define for_all_clients(var) \
317 for (int _i = 0; _i < clients.size (); ++_i) \
318 declvar (client *, var, clients [_i])
319
221extern int nrofpixmaps; //TODO: hrmpf, should go 320extern int nrofpixmaps; //TODO: hrmpf, should go
222 321
223#endif 322#endif
224 323

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines