ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/client.h
Revision: 1.31
Committed: Sat Mar 10 19:48:16 2007 UTC (17 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.30: +2 -1 lines
Log Message:
- improve image_sums
- DOWNGRADE server protocol version to 1026.
  * this disables requestinfo image_sums and image_info in gcfclient,
    allowing us to use up to 10000 faces dynamically
    (right now, we already sue up to 7500 faces, but the 10000 face limit
    is, of coruse, hardcoded into gcfclient))

--
A student, in hopes of understanding the Lambda-nature, came to
Greenblatt.  As they spoke a Multics system hacker walked by.  "Is it
true", asked the student, "that PL-1 has many of the same data types as
Lisp".  Almost before the student had finshed his question, Greenblatt
shouted, "FOO!", and hit the student with a stick.

File Contents

# Content
1 /*
2 * CrossFire, A Multiplayer game for the X Window System
3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6 * Copyright (C) 1992 Frank Tore Johansen
7 *
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
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
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
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 *
22 * The author can be reached via e-mail to crossfire@schmorp.de
23 */
24
25 #ifndef CLIENT_H
26 #define CLIENT_H
27
28 #include <deque>
29 #include <bitset>
30 #include <tr1/unordered_set>
31
32 // (possibly) max. number of objects "per page" in the ground container
33 #define FLOORBOX_PAGESIZE 50
34
35 struct MapCell
36 {
37 UUID player; // this is, unfortunately, very wasteful of memory space, but pretty bandwidth-efficient
38 int count; /* This is really darkness in the map1 command */
39 uint16 faces[MAP_LAYERS];
40 uint16 smooth[MAP_LAYERS];
41 unsigned char stat_hp; // health of something in this space, or 0
42 unsigned char flags;
43 };
44
45 /* This basically defines the largest size an
46 * archetype may be - it is used for allocation of
47 * some structures, as well as determining how far
48 * we should look for the heads of big images.
49 */
50 #define MAX_HEAD_OFFSET 8
51
52 #define MAX_CLIENT_X (MAP_CLIENT_X + MAX_HEAD_OFFSET)
53 #define MAX_CLIENT_Y (MAP_CLIENT_Y + MAX_HEAD_OFFSET)
54
55 struct Map
56 {
57 struct MapCell cells[MAX_CLIENT_X][MAX_CLIENT_Y];
58 };
59
60 /* True max is 16383 given current map compaction method */
61 # define MAXANIMNUM 2000
62
63 struct statsinfo
64 {
65 char *range, *title;
66 };
67
68 /* This contains basic information on the socket structure. status is its
69 * current state. we set up our on buffers for sending/receiving, so we can
70 * handle some higher level functions. fd is the actual file descriptor we
71 * are using.
72 */
73
74 /* Only one map mode can actually be used, so lets make it a switch
75 * instead of having a bunch of different fields that needed to
76 * get toggled.
77 */
78 enum MapMode { Map0Cmd = 0, Map1Cmd = 1, Map1aCmd = 2 };
79
80 /* The following is the setup for a ring buffer for storing output
81 * data that the OS can't handle right away.
82 */
83 struct Buffer
84 {
85 char data[SOCKETBUFSIZE];
86 int start;
87 int len;
88 };
89
90 // states the socket can be in
91 enum {
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
102 enum {
103 PF_PLAYER = 0x01, // must have valid player / will by synchronised
104 PF_PLAYING = 0x02, // must be in playing state
105 PF_COMMAND0 = 0x04, // command starts at offset 0
106 PF_COMMAND6 = 0x08, // command starts at offset 6
107 };
108
109 struct packet_type
110 {
111 const char *name;
112 void *cb;
113 int flags;
114 };
115
116 struct command
117 {
118 tstamp stamp;
119 const packet_type *handler;
120 char *data;
121 int datalen;
122
123 ~command ()
124 {
125 sfree<char> (data, datalen + 1);
126 }
127 };
128
129 struct refitem
130 {
131 object_ptr op;
132 };
133
134 // this represents a container on the client side.
135 // right now, there are only ever two of them:
136 // the inventory and the floor/open container
137 //TODO: unused as of yet
138 struct client_container : vector< refitem, slice_allocator<refitem> >
139 {
140 client *ns;
141 enum { CC_NONE, CC_INVENTORY, CC_MAPSPACE, CC_CONTAINER } type;
142
143 bool item_changed; // one of the items in here possibly changed
144
145 // for mapspace and container
146 int x, y;
147 maptile *map;
148
149 // for container
150 object *env;
151
152 client_container (client *ns)
153 : ns (ns), type (CC_NONE) { }
154
155 tag_t tag () const;
156
157 inline iterator merge_item (iterator i, object *op);
158
159 void clear ();
160 void update ();
161
162 void set_mapspace (maptile *map, int x, int y);
163 void set_container (object *env);
164 };
165
166 /* how many times we are allowed to give the wrong password before being kicked. */
167 #define MAX_PASSWORD_FAILURES 5
168
169 INTERFACE_CLASS (client) // should become player when newsocket is a baseclass of player
170 struct client : zero_initialised, attachable
171 {
172 int ACC (RW, fd);
173 unsigned int inbuf_len; // number of bytes valid in inbuf
174 uint8 *faces_sent; // This is a bitmap on sent face status
175 statsinfo stats;
176 int ACC (RO, active);
177
178 Buffer outputbuffer;
179
180 char *ACC (RW, host); /* Which host it is connected from (ip address) */
181 uint8 ACC (RW, state); /* Input state of the player (name, password, etc */
182
183 sint8 ACC (RW, last_level); /* Last level we sent to client */
184 uint16 ACC (RW, last_flags); /* fire/run on flags for last tick */
185 float ACC (RW, last_weapon_sp); /* if diff than weapon_sp, update client */
186 sint32 ACC (RW, last_weight); /* Last weight as sent to client; -1 means do not send weight */
187 sint32 ACC (RW, last_weight_limit); /* Last weight limit transmitted to client */
188 uint32 ACC (RW, last_path_attuned); /* Last spell attunment sent to client */
189 uint32 ACC (RW, last_path_repelled); /* Last spell repelled sent to client */
190 uint32 ACC (RW, last_path_denied); /* Last spell denied sent to client */
191 living ACC (RO, last_stats); /* Last stats as sent to client */
192 float ACC (RW, last_speed); /* Last speed as sent to client */
193 sint16 ACC (RW, last_resist[NROFATTACKS]);/* last resist values sent to client */
194 sint64 ACC (RW, last_skill_exp[NUM_SKILLS]);/* shadow register. if != exp. obj update client */
195
196 bool ACC (RW, afk); /* player is afk */
197 bool ACC (RW, facecache); /* If true, client is caching images */
198 bool ACC (RW, sent_scroll);
199 bool ACC (RW, sound); /* does the client want sound */
200 bool ACC (RW, newmapcmd); /* Send newmap command when entering new map SMACFIGGEN */
201 bool ACC (RW, plugincmd); /* CF+ extend the protocol through a plug-in */
202 bool ACC (RW, mapinfocmd); /* CF+ return map info and send map change info */
203 bool ACC (RW, extcmd); /* CF+ call into extensions/plugins */
204 bool ACC (RW, extmap); /* CF+ extend map comamnd with extra data */
205 bool ACC (RW, buggy_mapscroll); /* CF+ client crashes on large mapscrolls */
206 bool ACC (RW, darkness); /* True if client wants darkness information */
207 bool ACC (RW, image2); /* Client wants image2/face2 commands */
208 bool ACC (RW, update_look); /* If true, we need to send the look window */
209 bool ACC (RW, has_readable_type); /* If true client accept additional text information */
210 /* used to arrange text in books, scrolls, or scripted dialogs */
211 bool ACC (RW, monitor_spells); /* Client wishes to be informed when their spell list changes */
212 bool ACC (RW, ext_mapinfos); /* If true client accepts additional info on maps */
213 /* Below are flags for extedend infos to pass to client
214 * with S->C mapextended command */
215 bool ACC (RW, EMI_smooth); /* Send smooth in extendmapinfos */
216
217 uint32 ACC (RW, supported_readables); /* each bit is a readable supported by client */
218 uint32 ACC (RW, cs_version), ACC (RW, sc_version); /* versions of the client */
219 enum MapMode mapmode; /* Type of map commands the client wants. */
220 uint16 ACC (RW, look_position); /* start of drawing of look window */
221 uint8 ACC (RW, mapx), ACC (RW, mapy); /* How large a map the client wants */
222 uint8 ACC (RW, itemcmd); /* What version of the 'item' protocol command to use */
223 uint8 ACC (RW, faceset); /* Set the client is using, default 0 */
224
225 maptile *ACC (RW, current_map); // CF+ last/current player map
226 region *ACC (RW, current_region); // CF+ last/current player region
227 int ACC (RW, current_x), ACC (RW, current_y); // CF+ last/current map position
228 char ACC (RW, version)[64]; // CF+ client name/version
229
230 player_ptr ACC (RO, pl);
231
232 int ACC (RW, rtt), ACC (RW, rttvar); /* round-trip time and -variance, if known */
233
234 void do_destroy ();
235 void gather_callbacks (AV *&callbacks, event_type event) const;
236
237 iow socket_ev; void socket_cb (iow &w, int got);
238 iw cmd_ev; void cmd_cb (iw &w);
239 client_container cc_inv, cc_other;
240
241 std::deque< command, slice_allocator<command> > cmd_queue;
242
243 // large structures at the end please
244 struct Map lastmap;
245 std::bitset<MAXANIMNUM> anims_sent;
246 // if we get an incomplete packet, this is used to hold the data.
247 // we add 2 byte for the header, one for the trailing 0 byte
248 uint8 inbuf[MAXSOCKBUF + 2 + 1];
249
250 bool may_execute (const packet_type *pkt) const;
251 void execute (const packet_type *pkt, char *data, int datalen);
252
253 void queue_command (packet_type *handler, char *data, int datalen);
254 MTH bool handle_command ();
255 // resets movement state
256 MTH void reset_state ();
257 // resets variable data used to send stat diffs
258 MTH void reset_stats ();
259
260 MTH bool handle_packet ();
261 int next_packet (); // returns length of packet or 0
262 void skip_packet (int len); // we have processed the packet, skip it
263
264 MTH void flush ();
265 MTH void write_outputbuffer ();
266 void send (void *buf_, int len);
267
268 void send_packet (const char *buf);
269 void send_packet (const char *buf, int len);
270 void send_packet_printf (const char *format, ...);
271 void send_packet (packet &sl);
272
273 // called when something under the player changes
274 MTH void floorbox_update () { update_look = 1; }
275 // called when the player has been moved
276 MTH void floorbox_reset () { look_position = 0; floorbox_update (); }
277
278 MTH static client *create (int fd, const char *peername);
279
280 protected:
281 client (int fd, const char *from_ip);
282 ~client ();
283 };
284
285 #define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\
286 ( ((__type)>0) &&\
287 ((__sockPtr)->has_readable_type) && \
288 ((__sockPtr)->supported_readables & (1<<(__type))) )
289
290 /* Bitmask for the faces_sent[] array - what
291 * portion of the face have we sent?
292 */
293 #define NS_FACESENT_FACE 0x1
294 #define NS_FACESENT_SMOOTH 0x2
295
296 /* Constants in the form EMI_ is for extended map infos.
297 * Even if the client select the additionnal infos it wants
298 * on the map, there may exist cases where this whole info
299 * is not given in one buch but in separate bunches. This
300 * is done performance reasons (imagine some info related to
301 * a visible object and another info related to a 4 square
302 * width and height area). At the begin of an extended info packet
303 * is a bit field. A bit is activated for each extended info
304 * present in the data
305 */
306
307 /* Meanings:
308 * EMI_NOREDRAW Take extended infos into account but don't redraw,
309 * some additionnal datas will follow in a new packet
310 * EMI_SMOOTH Datas about smoothing
311 */
312 #define EMI_NOREDRAW 0x01
313 #define EMI_SMOOTH 0x02
314
315 /* this last one says the bitfield continue un next byte
316 * There may be several on contiguous bytes. So there is 7
317 * actual bits used per byte, and the number of bytes
318 * is not fixed in protocol
319 */
320 #define EMI_HASMOREBITS 0x80
321
322 #define FACE_TYPES 1
323 #define PNG_FACE_INDEX 0
324
325 #define VERSION_CS 1023 /* version >= 1023 understand setup cmd */
326 #define VERSION_SC 1026
327 //#define VERSION_SC 1027 // requestinfo image_info and image_sums, makes extending faces on the fly impossible
328 #define VERSION_INFO "Crossfire+ Server"
329
330 typedef object_vector<client, &client::active> sockvec;
331
332 extern sockvec clients;
333
334 #define for_all_clients(var) \
335 for (int _i = 0; _i < clients.size (); ++_i) \
336 declvar (client *, var, clients [_i])
337
338 extern int nrofpixmaps; //TODO: hrmpf, should go
339
340 #endif
341