Changeset 124 for abuse/trunk/src/net/gserver.cpp
- Timestamp:
- Mar 18, 2008, 9:36:56 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
abuse/trunk/src/net/gserver.cpp
r120 r124 40 40 game_server::game_server() 41 41 { 42 43 44 42 player_list = NULL; 43 waiting_server_input = 1; 44 reload_state = 0; 45 45 } 46 46 47 47 int game_server::total_players() 48 48 { 49 50 51 52 53 54 55 49 player_client *fl = player_list; 50 int total = 1; 51 for( ; fl; fl = fl->next) 52 { 53 total++; 54 } 55 return total; 56 56 } 57 57 … … 70 70 sprintf(msg,symbol_str("min_wait"),main_net_cfg->min_players-total_players()); 71 71 stat=wm->new_window(100,50,-1,-1,new info_field(0, 0, ID_NULL,msg, 72 72 new button(0, wm->font()->height()*2, ID_CANCEL,symbol_str("cancel_button"),NULL) )); 73 73 wm->flush_screen(); 74 74 last_count=total_players(); … … 77 77 if (wm->event_waiting()) 78 78 { 79 do { wm->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && wm->event_waiting()); 79 do { wm->get_event(ev); } while (ev.type==EV_MOUSE_MOVE && wm->event_waiting()); 80 80 wm->flush_screen(); 81 81 if (ev.type==EV_MESSAGE && ev.message.id==ID_CANCEL) 82 82 abort=1; 83 83 } 84 84 85 85 service_net_request(); 86 86 } … … 88 88 { 89 89 wm->close_window(stat); 90 wm->flush_screen(); 91 } 92 } 93 90 wm->flush_screen(); 91 } 92 } 93 94 94 game_server::player_client::~player_client() 95 95 { … … 118 118 if (c->delete_me()) 119 119 { 120 121 122 123 124 125 126 127 128 129 130 131 132 133 } else 134 { 135 136 120 base->packet.write_uint8(SCMD_DELETE_CLIENT); 121 base->packet.write_uint8(c->client_id); 122 if (c->wait_reload()) 123 { 124 c->set_wait_reload(0); 125 check_reload_wait(); 126 } 127 128 if (last) last->next=c->next; 129 else player_list=c->next; 130 player_client *d=c; 131 c=c->next; 132 delete d; 133 } else 134 { 135 last=c; 136 c=c->next; 137 137 } 138 138 } … … 140 140 141 141 if (got_all) // see if we have input from everyone, if so send it out 142 { 142 { 143 143 base->packet.calc_checksum(); 144 144 … … 147 147 if (c->has_joined()) 148 148 { 149 c->set_wait_input(1); 150 149 c->set_wait_input(1); 150 game_sock->write(base->packet.data,base->packet.packet_size()+base->packet.packet_prefix_size(),c->data_address); 151 151 152 152 } … … 156 156 game_sock->read_unselectable(); // don't listen to this socket until we are prepared to read next tick's game data 157 157 waiting_server_input=1; 158 } 158 } 159 159 } 160 160 … … 181 181 { 182 182 player_client *d=player_list; 183 for (;d;d=d->next) 184 if (d->wait_reload()) return ; // we are still waiting for someone to reload the game 183 for (;d;d=d->next) 184 if (d->wait_reload()) return ; // we are still waiting for someone to reload the game 185 185 base->wait_reload=0; 186 186 } … … 198 198 199 199 fprintf(stderr,"request for resend tick %d (game cur=%d, pack=%d, last=%d)\n", 200 200 tick,base->current_tick,base->packet.tick_received(),base->last_packet.tick_received()); 201 201 202 202 if (tick==base->last_packet.tick_received()) 203 203 { 204 net_packet *pack=&base->last_packet; 205 game_sock->write(pack->data,pack->packet_size()+pack->packet_prefix_size(),c->data_address); 204 net_packet *pack=&base->last_packet; 205 game_sock->write(pack->data,pack->packet_size()+pack->packet_prefix_size(),c->data_address); 206 206 } 207 207 return 1; … … 211 211 if (reload_state) // already in reload state, notify client ok to start reloading 212 212 { 213 if (c->comm->write(&cmd,1)!=1) 214 213 if (c->comm->write(&cmd,1)!=1) 214 c->set_delete_me(1); 215 215 } else c->set_need_reload_start_ok(1); 216 216 return 1; … … 252 252 if (bytes_received==use->packet_size()+use->packet_prefix_size()) 253 253 { 254 255 256 257 258 259 260 261 262 263 if (base->current_tick==use->tick_received())264 265 266 267 268 // fprintf(stderr,"(got packet %d)\n",use->tick_received());269 // { time_marker now,start; while (now.diff_time(&start)<5.0) now.get_time(); }270 271 272 273 274 275 276 277 278 fprintf(stderr,"(sending old %d)\n",use->tick_received());279 280 281 net_packet *pack=&base->last_packet; 282 game_sock->write(pack->data,pack->packet_size()+pack->packet_prefix_size(),found->data_address); 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 254 uint16_t rec_crc=use->get_checksum(); 255 if (rec_crc==use->calc_checksum()) 256 { 257 player_client *f=player_list,*found=NULL; 258 for (;!found &&f;f=f->next) 259 if (f->has_joined() && from->equal(f->data_address)) 260 found=f; 261 if (found) 262 { 263 if (base->current_tick==use->tick_received()) 264 { 265 if (prot->debug_level(net_protocol::DB_MINOR_EVENT)) 266 fprintf(stderr,"(got data from %d)",found->client_id); 267 268 // fprintf(stderr,"(got packet %d)\n",use->tick_received()); 269 // { time_marker now,start; while (now.diff_time(&start)<5.0) now.get_time(); } 270 271 if (base->input_state!=INPUT_RELOAD) 272 add_client_input((char *)use->packet_data(),use->packet_size(),found); 273 274 } 275 else if (use->tick_received()==base->last_packet.tick_received()) 276 { 277 if (prot->debug_level(net_protocol::DB_IMPORTANT_EVENT)) 278 fprintf(stderr,"(sending old %d)\n",use->tick_received()); 279 280 // if they are sending stale data we need to send them the last packet so they can catchup 281 net_packet *pack=&base->last_packet; 282 game_sock->write(pack->data,pack->packet_size()+pack->packet_prefix_size(),found->data_address); 283 284 } else if (prot->debug_level(net_protocol::DB_MAJOR_EVENT)) 285 fprintf(stderr,"received stale packet (got %d, expected %d)\n",use->tick_received(),base->current_tick); 286 287 } else 288 { 289 if (prot->debug_level(net_protocol::DB_MAJOR_EVENT)) 290 { 291 fprintf(stderr,"received data from unknown client\n"); 292 printf("from address "); from->print(); 293 printf(" first addr "); player_list->data_address->print(); printf("\n"); 294 } 295 } 296 297 } else fprintf(stderr,"received packet with bad checksum\n"); 298 298 } else fprintf(stderr,"received incomplete packet\n"); 299 299 } else if (!from) … … 309 309 /************************** Any client with commands? **************************/ 310 310 player_client *c; 311 for (c=player_list;c;c=c->next) 311 for (c=player_list;c;c=c->next) 312 312 if (c->comm->error() || (c->comm->ready_to_read() && !process_client_command(c))) 313 313 { … … 316 316 } 317 317 else ret=1; 318 318 319 319 return 1; 320 320 } … … 330 330 331 331 int game_server::end_reload(int disconnect) // notify evryone you've reloaded the level (at server request) 332 { 332 { 333 333 player_client *c=player_list; 334 334 prot->select(0); 335 335 336 for (;c;c=c->next) 337 if (!c->delete_me() && c->wait_reload()) 336 for (;c;c=c->next) 337 if (!c->delete_me() && c->wait_reload()) 338 338 { 339 339 if (disconnect) … … 342 342 } 343 343 344 for (c=player_list;c;c=c->next) 344 for (c=player_list;c;c=c->next) 345 345 c->set_has_joined(1); 346 346 reload_state=0; 347 347 348 348 return 1; 349 349 } … … 355 355 prot->select(0); 356 356 357 for (;c;c=c->next) 357 for (;c;c=c->next) 358 358 { 359 359 if (!c->delete_me() && c->need_reload_start_ok()) // if the client is already waiting for reload state to start, send ok … … 374 374 if (!client_id) return 1; 375 375 for (;c;c=c->next) if (c->client_id==client_id) return 1; 376 return 0; 376 return 0; 377 377 } 378 378 379 379 int game_server::add_client(int type, net_socket *sock, net_address *from) 380 380 { 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 381 if( type == CLIENT_ABUSE ) 382 { 383 if( total_players() >= main_net_cfg->max_players ) 384 { 385 uint8_t too_many = 2; 386 sock->write( &too_many, 1 ); 387 return 0; 388 } 389 390 uint8_t reg = 1; // Of course the game is registered 391 if( sock->write( ®, 1 ) != 1 ) 392 return 0; 393 394 uint16_t our_port = lstl( main_net_cfg->port + 1 ), cport; 395 char name[256]; 396 uint8_t len; 397 int16_t nkills=lstl(main_net_cfg->kills); 398 399 if( sock->read(&len,1)!=1 || 400 sock->read(name,len)!=len || 401 sock->read(&cport,2)!=2 || 402 sock->write(&our_port,2)!=2 || 403 sock->write(&nkills,2)!=2) 404 { 405 return 0; 406 } 407 408 cport=lstl(cport); 409 410 int f = -1, i; 411 for( i = 0; f == -1 && i < MAX_JOINERS; i++ ) 412 { 413 if( !isa_client(i) ) 414 { 415 f = i; 416 join_struct *j=base->join_list; 417 for( ; j; j = j->next ) 418 { 419 if( j->client_id == i ) 420 f = -1; 421 } 422 } 423 } 424 425 if( f == -1 ) 426 return 0; 427 428 from->set_port( cport ); 429 430 uint16_t client_id = lstl( f ); 431 if( sock->write( &client_id, 2 ) != 2 ) 432 { 433 return 0; 434 } 435 client_id=f; 436 437 join_array[client_id].next = base->join_list; 438 base->join_list = &join_array[client_id]; 439 join_array[client_id].client_id = client_id; 440 strcpy( join_array[client_id].name, name ); 441 player_list = new player_client( f, sock, from, player_list ); 442 443 return 1; 444 } 445 else 446 { 447 return 0; 448 } 449 449 } 450 450 … … 455 455 if (c->wait_input()) 456 456 c->set_delete_me(1); 457 check_collection_complete(); 457 check_collection_complete(); 458 458 return 1; 459 459 } … … 475 475 game_server::~game_server() 476 476 { 477 478 } 479 477 quit(); 478 } 479
Note: See TracChangeset
for help on using the changeset viewer.