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.11 by root, Tue Dec 19 05:41:21 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 */
38 29
39#define NUM_LOOK_OBJECTS 50 30// (possibly) max. number of objects "per page" in the ground container
31#define FLOORBOX_PAGESIZE 50
40 32
41struct MapCell 33struct MapCell
42{ 34{
43 UUID player; // this is, unfortunately, very wasteful of memory space, but pretty bandwidth-efficient 35 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 */ 36 int count; /* This is really darkness in the map1 command */
94 char data[SOCKETBUFSIZE]; 86 char data[SOCKETBUFSIZE];
95 int start; 87 int start;
96 int len; 88 int len;
97}; 89};
98 90
91// a handler for a specific type of packet
92enum {
93 PF_PLAYER = 0x01, // must have valid player / will by synchronised
94 PF_PLAYING = 0x02, // must be in playing state
95};
96
97struct packet_type
98{
99 const char *name;
100 void *cb;
101 int flags;
102};
103
104struct command
105{
106 tstamp stamp;
107 const packet_type *handler;
108 char *data;
109 int datalen;
110
111 ~command ()
112 {
113 sfree<char> (data, datalen + 1);
114 }
115};
116
99/* how many times we are allowed to give the wrong password before being kicked. */ 117/* how many times we are allowed to give the wrong password before being kicked. */
100#define MAX_PASSWORD_FAILURES 5 118#define MAX_PASSWORD_FAILURES 5
101 119
102ACC_CLASS (client) // should become player when newsocket is a baseclass of player 120ACC_CLASS (client) // should become player when newsocket is a baseclass of player
103struct client : zero_initialised, attachable_base 121struct client : zero_initialised, attachable_base
104{ 122{
105 enum Sock_Status status; 123 enum Sock_Status status;
106 int ACC (RW, fd); 124 int ACC (RW, fd);
107 unsigned int inbuf_len; // number of bytes valid in inbuf 125 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 */ 126 uint8 *faces_sent; // This is a bitmap on sent face status
111 uint8 anims_sent[MAXANIMNUM]; 127 struct statsinfo stats;
112 struct statsinfo stats;
113 128
114 char *ACC (RW, host); /* Which host it is connected from (ip address) */ 129 char *ACC (RW, host); /* Which host it is connected from (ip address) */
115 uint8 ACC (RW, password_fails); /* how many times the player has failed to give the right password */ 130 uint8 ACC (RW, password_fails); /* how many times the player has failed to give the right password */
116 Buffer outputbuffer; /* For undeliverable data */ 131 Buffer outputbuffer;
117 132
118 bool ACC (RW, facecache); /* If true, client is caching images */ 133 bool ACC (RW, facecache); /* If true, client is caching images */
119 bool ACC (RW, sent_scroll); 134 bool ACC (RW, sent_scroll);
120 bool ACC (RW, sound); /* does the client want sound */ 135 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 */ 136 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 */ 137 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 */ 138 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 */ 139 bool ACC (RW, mapinfocmd); /* CF+ return map info and send map change info */
125 bool ACC (RW, extcmd); /* CF+ call into extensions/plugins */ 140 bool ACC (RW, extcmd); /* CF+ call into extensions/plugins */
126 bool ACC (RW, extmap); /* CF+ extend map comamnd with extra data */ 141 bool ACC (RW, extmap); /* CF+ extend map comamnd with extra data */
127 bool ACC (RW, buggy_mapscroll); /* CF+ client crashes on large mapscrolls */ 142 bool ACC (RW, buggy_mapscroll); /* CF+ client crashes on large mapscrolls */
128 bool ACC (RW, darkness); /* True if client wants darkness information */ 143 bool ACC (RW, darkness); /* True if client wants darkness information */
129 bool ACC (RW, image2); /* Client wants image2/face2 commands */ 144 bool ACC (RW, image2); /* Client wants image2/face2 commands */
130 bool ACC (RW, update_look); /* If true, we need to send the look window */ 145 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 */ 146 bool ACC (RW, has_readable_type); /* If true client accept additional text information */
132 /* used to arrange text in books, scrolls, or scripted dialogs */ 147 /* 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 */ 148 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 */ 149 bool ACC (RW, ext_mapinfos); /* If true client accepts additional info on maps */
135 /* Below are flags for extedend infos to pass to client 150 /* Below are flags for extedend infos to pass to client
136 * with S->C mapextended command */ 151 * with S->C mapextended command */
137 bool ACC (RW, EMI_smooth); /* Send smooth in extendmapinfos */ 152 bool ACC (RW, EMI_smooth); /* Send smooth in extendmapinfos */
138 153
139 uint32 ACC (RW, supported_readables); /* each bit is a readable supported by client */ 154 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 */ 155 uint32 ACC (RW, cs_version), ACC (RW, sc_version); /* versions of the client */
141 enum MapMode mapmode; /* Type of map commands the client wants. */ 156 enum MapMode mapmode; /* Type of map commands the client wants. */
142 uint16 ACC (RW, look_position); /* start of drawing of look window */ 157 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 */ 159 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 */ 160 uint8 ACC (RW, faceset); /* Set the client is using, default 0 */
146 161
147 maptile *ACC (RW, current_map); // CF+ last/current player map 162 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 163 int ACC (RW, current_x), ACC (RW, current_y); // CF+ last/current map position
149 char ACC (RW, version)[64]; // CF+ client name/version 164 char ACC (RW, version)[64]; // CF+ client name/version
150 165
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 166 player *ACC (RO, pl);//TODO should not be here, preferably
154 167
155 int ACC (RW, rtt), ACC (RW, rttvar); /* round-trip time and -variance, if known */ 168 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 169
159 client (int fd, const char *from_ip); 170 client (int fd, const char *from_ip);
160 ~client (); 171 ~client ();
172 void destroy ();
161 173
174 iw cmd_ev; void cmd_cb (iw &w);
175 iow socket_ev; void socket_cb (iow &w, int got);
176
177 std::deque< command, slice_allocator<command> > cmd_queue;
178
179 // resets movement state
180 bool may_execute (const packet_type *pkt) const;
181 void execute (const packet_type *pkt, char *data, int datalen);
182
183 void queue_command (packet_type *handler, char *data, int datalen);
184 bool handle_command ();
185 void reset_state ();
186
187 bool handle_packet ();
162 int read_packet (); // returns length of packet or 0 188 int next_packet (); // returns length of packet or 0
163 void skip_packet (int len); // we have processed the packet, skip it 189 void skip_packet (int len); // we have processed the packet, skip it
164 190
165 void flush (); 191 void flush ();
166 void write_outputbuffer (); 192 void write_outputbuffer ();
167 void send (void *buf_, int len); 193 void send (void *buf_, int len);
168 194
169 void send_packet (const char *buf); 195 void send_packet (const char *buf);
170 void send_packet (const char *buf, int len); 196 void send_packet (const char *buf, int len);
197 void send_packet_printf (const char *format, ...);
171 void send_packet (packet &sl); 198 void send_packet (packet &sl);
199
200 // called when something under the player changes
201 void floorbox_update () { update_look = 1; }
202 // called when the player has been moved
203 void floorbox_reset () { look_position = 0; floorbox_update (); }
204
205 // large structures at the end please
206 struct Map lastmap;
207 std::bitset<MAXANIMNUM> anims_sent;
208 // if we get an incomplete packet, this is used to hold the data.
209 // we add 2 byte for the header, one for the trailing 0 byte
210 uint8 inbuf[MAXSOCKBUF + 2 + 1];
172}; 211};
173 212
174#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\ 213#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\
175 ( ((__type)>0) &&\ 214 ( ((__type)>0) &&\
176 ((__sockPtr)->has_readable_type) && \ 215 ((__sockPtr)->has_readable_type) && \

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines