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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines