コード例 #1
0
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;
}
コード例 #2
0
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;
}