int server::client_do_packet(packet &pk) { int rp=pk.get_read_position(); int er=0; while (!pk.eop() && !er) { uint8_t cmd; if (pk.read(&cmd,1)!=1) er=1; else { view *f=NULL; int fail=0; if (cmd!=SCMD_ADD_VIEW && cmd!=SCMD_SYNC) { uint16_t player; if (pk.read((uint8_t *)&player,2)!=2) er=1; player=lstl(player); for (f=player_list; f && f->player_number!=player; f=f->next); if (!f) fail=1; } if (!fail) { if (!process_command(f,cmd,pk)) er=1; } else er=1; } } pk.set_read_position(rp); return !er; }
int server::process_command(view *f, uint8_t command, packet &pk) { switch (command) { case SCMD_QUIT : // delete player { dprintf("Player %d has quit\n",f->player_number); return 0; } break; case SCMD_VIEW_RESIZE : // change view area { uint32_t view_size[8]; if (pk.read((uint8_t *)view_size,8*4)!=8*4) return 0; else { f->resize_view(lltl(view_size[0]),lltl(view_size[1]),lltl(view_size[2]),lltl(view_size[3])); f->pan_x=lltl(view_size[4]); f->pan_y=lltl(view_size[5]); f->shift_down=lltl(view_size[6]); f->shift_right=lltl(view_size[7]); f->suggest.send_view=0; if (is_server) // if we are a server, tell everybody about this. { uint8_t cmd=SCMD_VIEW_RESIZE; next_out.write((uint8_t *)&cmd,1); uint16_t pn=lstl(f->player_number); next_out.write((uint8_t *)&pn,2); next_out.write((uint8_t *)view_size,8*4); } } } break; case SCMD_WEAPON_CHANGE : // change weapon { uint32_t new_weap; if (pk.read((uint8_t *)&new_weap,4)!=4) return 0; else { f->current_weapon=lltl(new_weap); f->suggest.send_weapon_change=0; if (is_server) // if we are a server, tell everybody about this. { uint8_t cmd=SCMD_WEAPON_CHANGE; next_out.write((uint8_t *)&cmd,1); uint16_t pn=lstl(f->player_number); next_out.write((uint8_t *)&pn,2); next_out.write((uint8_t *)&new_weap,4); } } } break; case SCMD_SET_INPUT : // set the input from this player { signed char inp[5]; if (pk.read((uint8_t *)inp,5)!=5) return 0; else f->set_input(inp[0],inp[1],inp[2],inp[3],inp[4]); } break; case SCMD_ADD_VIEW : { view *v=add_view(pk); if (v) { for (view *f=player_list; f && f->next; f=f->next); if (f) f->next=v; else player_list=f; } } break; case SCMD_SYNC : { uint32_t x; if (pk.read((uint8_t *)&x,4)!=4) return 0; else { uint32_t s=make_sync_uint32(); if (lltl(x)!=s) printf("Out of sync, %x!=%x\n",lltl(x),s); return 1; } } break; default : return 0; } return 1; }