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.7 by root, Sat Dec 16 21:40:26 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
30// (possibly) max. number of objects "per page" in the ground container
39#define NUM_LOOK_OBJECTS 50 31#define NUM_LOOK_OBJECTS 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
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
94 PF_IMMEDIATE = 0x02, // TODO: hack, can be executed immediately
95 PF_PLAYING = 0x04, // 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 (data, datalen);
115 }
116};
117
99/* how many times we are allowed to give the wrong password before being kicked. */ 118/* how many times we are allowed to give the wrong password before being kicked. */
100#define MAX_PASSWORD_FAILURES 5 119#define MAX_PASSWORD_FAILURES 5
101 120
102ACC_CLASS (client) // should become player when newsocket is a baseclass of player 121ACC_CLASS (client) // should become player when newsocket is a baseclass of player
103struct client : zero_initialised, attachable_base 122struct client : zero_initialised, attachable_base
104{ 123{
105 enum Sock_Status status; 124 enum Sock_Status status;
106 int ACC (RW, fd); 125 int ACC (RW, fd);
107 unsigned int inbuf_len; // number of bytes valid in inbuf 126 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 */ 127 uint8 *faces_sent; // This is a bitmap on sent face status
111 uint8 anims_sent[MAXANIMNUM];
112 struct statsinfo stats; 128 struct statsinfo stats;
113 129
114 char *ACC (RW, host); /* Which host it is connected from (ip address) */ 130 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 */ 131 uint8 ACC (RW, password_fails); /* how many times the player has failed to give the right password */
116 Buffer outputbuffer; /* For undeliverable data */ 132 Buffer outputbuffer;
117 133
118 bool ACC (RW, facecache); /* If true, client is caching images */ 134 bool ACC (RW, facecache); /* If true, client is caching images */
119 bool ACC (RW, sent_scroll); 135 bool ACC (RW, sent_scroll);
120 bool ACC (RW, sound); /* does the client want sound */ 136 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 */ 137 bool ACC (RW, exp64); /* Client wants 64 bit exp data, as well as skill data */
146 162
147 maptile *ACC (RW, current_map); // CF+ last/current player map 163 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 164 int ACC (RW, current_x), ACC (RW, current_y); // CF+ last/current map position
149 char ACC (RW, version)[64]; // CF+ client name/version 165 char ACC (RW, version)[64]; // CF+ client name/version
150 166
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 167 player *ACC (RO, pl);//TODO should not be here, preferably
154 168
155 int ACC (RW, rtt), ACC (RW, rttvar); /* round-trip time and -variance, if known */ 169 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 170
159 client (int fd, const char *from_ip); 171 client (int fd, const char *from_ip);
160 ~client (); 172 ~client ();
173 void destroy ();
161 174
175 iw cmd_ev; void cmd_cb (iw &w);
176 iow socket_ev; void socket_cb (iow &w, int got);
177
178 std::deque< command, slice_allocator<command> > cmd_queue;
179
180 // resets movement state
181 bool may_execute (const packet_type *pkt) const;
182 void execute (const packet_type *pkt, char *data, int datalen);
183
184 void queue_command (packet_type *handler, char *data, int datalen);
185 bool handle_command ();
186 void reset_state ();
187
188 bool handle_packet ();
162 int read_packet (); // returns length of packet or 0 189 int next_packet (); // returns length of packet or 0
163 void skip_packet (int len); // we have processed the packet, skip it 190 void skip_packet (int len); // we have processed the packet, skip it
164 191
165 void flush (); 192 void flush ();
166 void write_outputbuffer (); 193 void write_outputbuffer ();
167 void send (void *buf_, int len); 194 void send (void *buf_, int len);
168 195
169 void send_packet (const char *buf); 196 void send_packet (const char *buf);
170 void send_packet (const char *buf, int len); 197 void send_packet (const char *buf, int len);
198 void send_packet_printf (const char *format, ...);
171 void send_packet (packet &sl); 199 void send_packet (packet &sl);
200
201 // large structures at the end please
202 struct Map lastmap;
203 std::bitset<MAXANIMNUM> anims_sent;
204 // if we get an incomplete packet, this is used to hold the data.
205 // we add 2 byte for the header, one for the trailing 0 byte
206 uint8 inbuf[MAXSOCKBUF + 2 + 1];
207
172}; 208};
173 209
174#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\ 210#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\
175 ( ((__type)>0) &&\ 211 ( ((__type)>0) &&\
176 ((__sockPtr)->has_readable_type) && \ 212 ((__sockPtr)->has_readable_type) && \

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines