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.9 by root, Tue Dec 19 04:58:04 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 */
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 / 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];
112 struct statsinfo stats; 127 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 */
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 // large structures at the end please
201 struct Map lastmap;
202 std::bitset<MAXANIMNUM> anims_sent;
203 // if we get an incomplete packet, this is used to hold the data.
204 // we add 2 byte for the header, one for the trailing 0 byte
205 uint8 inbuf[MAXSOCKBUF + 2 + 1];
206
172}; 207};
173 208
174#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\ 209#define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\
175 ( ((__type)>0) &&\ 210 ( ((__type)>0) &&\
176 ((__sockPtr)->has_readable_type) && \ 211 ((__sockPtr)->has_readable_type) && \

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines