示例#1
0
void GAMECLIENT::send_switch_team(int team)
{
	NETMSG_CL_SETTEAM msg;
	msg.team = team;
	msg.pack(MSGFLAG_VITAL);
	client_send_msg();	
}
示例#2
0
文件: sounds.cpp 项目: Amor/Clientmod
void SOUNDS::play_and_record(int chn, int setid, float vol, vec2 pos)
{
	NETMSG_SV_SOUNDGLOBAL msg;
	msg.soundid = setid;
	msg.pack(MSGFLAG_NOSEND|MSGFLAG_RECORD);
	client_send_msg();
	
	play(chn, setid, vol, pos);
}
示例#3
0
文件: chat.cpp 项目: Amor/Clientmod
void CHAT::say(int team, const char *line)
{
	// send chat message
	NETMSG_CL_SAY msg;
	msg.team = team;
	msg.message = line;
	msg.pack(MSGFLAG_VITAL);
	client_send_msg();
}
示例#4
0
void GAMECLIENT::send_info(bool start)
{
	if(start)
	{
		NETMSG_CL_STARTINFO msg;
		msg.name = config.player_name;
		msg.skin = config.player_skin;
		msg.use_custom_color = config.player_use_custom_color;
		msg.color_body = config.player_color_body;
		msg.color_feet = config.player_color_feet;
		msg.pack(MSGFLAG_VITAL);
	}
	else
	{
		NETMSG_CL_CHANGEINFO msg;
		msg.name = config.player_name;
		msg.skin = config.player_skin;
		msg.use_custom_color = config.player_use_custom_color;
		msg.color_body = config.player_color_body;
		msg.color_feet = config.player_color_feet;
		msg.pack(MSGFLAG_VITAL);
	}
	client_send_msg();
}
int parse_shell()
{
  char shell_input[MAX_LENGTH];
  char message[MAX_LENGTH];
  static bool is_client_connected = false;
  int ret = 0;
  static int server_sock;

  /*
   * Get the input
   */
  fgets(shell_input, MAX_LENGTH, stdin);
  if(strlen(shell_input) <= 1)
    return 0;
  shell_input[strlen(shell_input)-1] = '\0';
  strcpy(message, shell_input);

  /*
   * Tokenize the strings
   */
  char *arg;
  int argc = 0;
  char argv[4][256];
  char *temp;
  char *command = strtok_r(shell_input, " ", &temp);
  //TODO reorder all commands!!
  // ----------------Commands common for server/client ------------
  if(!strcmp("AUTHOR", command))
  {
    print_success(1, command);
    LOG("I, g8, have read and understood the course academic integrity policy.\n");
  }
  else if(!strcmp("EXIT", command))
  {
    return 1;
  }
  // -------------------Common commands ---------------------------
  else if(!is_server)
  {
    char arg_copy[MAX_LENGTH];
    if(temp!=NULL)
    {
      strcpy(arg_copy, temp);
      for(arg = strtok_r(NULL, " ", &temp); arg && argc<4; arg = strtok_r(NULL, " ", &temp))
      {
        strcpy(argv[argc], arg);
        argc++;
      }
    }
    if(!strcmp("LOGIN", command))
    {
      if(!is_server && !(is_client_connected || argc!=2) && 
          validate_ip(argv[0]) && validate_port(argv[1]))
      {
        int newfd = client_connect(argv[0], argv[1]);
        if(newfd<=1)
        {
          print_success(0, command);
        }
        else
        {
          //TODO client connects to unknown port?
          is_client_connected = true;
          add_fd(newfd);
          client_identify(newfd);
          server_sock = newfd;
          print_success(1, command);
        }
      }
      else
        print_success(0, command);
    }
    else if(is_client_connected)
    {
      if(!strcmp("PORT", command))
      {
        print_success(1, command);
        LOG("PORT:%d\n", get_listening_port());
      }
      else if(!strcmp("IP", command))
      {
        print_success(1, command);
        get_ip();
      }
      else if(!strcmp("SEND", command))
      {
        if(!is_client_connected)
          print_success(0,command);
        else
          print_success(client_send_msg(server_sock, arg_copy), command);
      }
      else if(!strcmp("SENDFILE", command))
      {
        if(argc == 2 && validate_ip(argv[0]))
        {
          print_success(1, command);
          client_send_file(argv[0], argv[1]);
        }
        else
          print_success(0, command);
      }
      else if(!strcmp("LOGOUT", command))
      {
        if(is_client_connected)
        {
          //close(server_sock);
          //clear_fd(server_sock);
          client_send(server_sock, command);
          is_client_connected  = false;
          //server_sock = -1;
          print_success(1, command);
        }
        else
          print_success(0, command);
      }
      else if(!strcmp("LIST", command))
      {
        print_success(1, command);
        print_client_list();
      }
      else if(!strcmp("REFRESH", command))
      {
        client_send(server_sock, command);
        print_success(1, command);
      }
      else if(!strcmp("BROADCAST", command))
      {
        if(argc)
        {
          client_send(server_sock, message);
          print_success(1, command);
        }
        else print_success(0, command);
      }
      else if(!strcmp("BLOCK", command))
      {
        if(argc == 1 && verify_ip(argv[0])
            && !is_client_blocked(argv[0]))
        {
          //TODO CHECK IP in list!! done!
          print_success(1, command);
          add_to_block_list(argv[0]);
          client_send(server_sock, message);
        }
        else
        {
          print_success(0, command);
        }
      }
      else if(!strcmp("UNBLOCK", command))
      {
        if(argc == 1 && verify_ip(argv[0])
            && is_client_blocked(argv[0]))
        {
          print_success(1, command);
          remove_from_block_list(argv[0]);
          client_send(server_sock, message);
        }
        else
          print_success(0, command);
      }
      else
        print_success(0, command);
    }
    else
      print_success(0, command);
  }
  else
  {
    if(!strcmp("STATISTICS", command))
    {
      print_success(1, command);
      print_stats();
    }
    else if(!strcmp("BLOCKED", command))
    {
      if(temp == NULL)
        print_success(0, command);
      else
      {
        char *ip = strtok_r(NULL, " ", &temp);
        if(validate_ip(ip) && find_client_by_ip(ip) !=NULL)
        {
          print_success(1, command);
          print_blocked_clients(ip);
        }
        else
          print_success(0, command);
      }
    }
    else if(!strcmp("LIST", command))
    {
      print_success(1, command);
      print_connected_client_list();
    }
    else if(!strcmp("PORT", command))
    {
      print_success(1, command);
      LOG("PORT:%d\n", get_listening_port());
    }
    else if(!strcmp("IP", command))
    {
      print_success(1, command);
      get_ip();
    }
    else
      print_success(0, command);
  }

  LOG("[%s:END]\n", command);
  return 0;
}
示例#6
0
void GAMECLIENT::on_snapshot()
{
	new_tick = true;
	
	// clear out the invalid pointers
	mem_zero(&gameclient.snap, sizeof(gameclient.snap));
	snap.local_cid = -1;

	// secure snapshot
	{
		int num = snap_num_items(SNAP_CURRENT);
		for(int index = 0; index < num; index++)
		{
			SNAP_ITEM item;
			void *data = snap_get_item(SNAP_CURRENT, index, &item);
			if(netobj_validate(item.type, data, item.datasize) != 0)
			{
				if(config.debug)
					dbg_msg("game", "invalidated index=%d type=%d (%s) size=%d id=%d", index, item.type, netobj_get_name(item.type), item.datasize, item.id);
				snap_invalidate_item(SNAP_CURRENT, index);
			}
		}
	}
		
	process_events();

	if(config.dbg_stress)
	{
		if((client_tick()%100) == 0)
		{
			char message[64];
			int msglen = rand()%(sizeof(message)-1);
			for(int i = 0; i < msglen; i++)
				message[i] = 'a'+(rand()%('z'-'a'));
			message[msglen] = 0;
				
			NETMSG_CL_SAY msg;
			msg.team = rand()&1;
			msg.message = message;
			msg.pack(MSGFLAG_VITAL);
			client_send_msg();
		}
	}

	// go trough all the items in the snapshot and gather the info we want
	{
		snap.team_size[0] = snap.team_size[1] = 0;
		
		// TeeComp.
		for(int i=0; i<MAX_CLIENTS; i++)
			stats[i].active = false;

		int num = snap_num_items(SNAP_CURRENT);
		for(int i = 0; i < num; i++)
		{
			SNAP_ITEM item;
			const void *data = snap_get_item(SNAP_CURRENT, i, &item);

			if(item.type == NETOBJTYPE_CLIENT_INFO)
			{
				const NETOBJ_CLIENT_INFO *info = (const NETOBJ_CLIENT_INFO *)data;
				int cid = item.id;
				ints_to_str(&info->name0, 6, clients[cid].name);
				ints_to_str(&info->skin0, 6, clients[cid].skin_name);
				
				clients[cid].use_custom_color = info->use_custom_color;
				clients[cid].color_body = info->color_body;
				clients[cid].color_feet = info->color_feet;
				
				// prepare the info
				if(clients[cid].skin_name[0] == 'x' || clients[cid].skin_name[1] == '_')
					str_copy(clients[cid].skin_name, "default", 64);
					
				clients[cid].skin_info.color_body = skins->get_color(clients[cid].color_body);
				clients[cid].skin_info.color_feet = skins->get_color(clients[cid].color_feet);
				clients[cid].skin_info.size = 64;
				
				// find new skin
				clients[cid].skin_id = gameclient.skins->find(clients[cid].skin_name);
				if(clients[cid].skin_id < 0)
				{
					clients[cid].skin_id = gameclient.skins->find("default");
					if(clients[cid].skin_id < 0)
						clients[cid].skin_id = 0;
				}
				
				if(clients[cid].use_custom_color)
					clients[cid].skin_info.texture = gameclient.skins->get(clients[cid].skin_id)->color_texture;
				else
				{
					clients[cid].skin_info.texture = gameclient.skins->get(clients[cid].skin_id)->org_texture;
					clients[cid].skin_info.color_body = vec4(1,1,1,1);
					clients[cid].skin_info.color_feet = vec4(1,1,1,1);
				}

				clients[cid].update_render_info(cid);
				gameclient.snap.num_players++;
			}
			else if(item.type == NETOBJTYPE_PLAYER_INFO)
			{
				const NETOBJ_PLAYER_INFO *info = (const NETOBJ_PLAYER_INFO *)data;
				
				clients[info->cid].team = info->team;
				snap.player_infos[info->cid] = info;
				
				if(info->local)
				{
					snap.local_cid = item.id;
					snap.local_info = info;
					
					if (info->team == -1)
						snap.spectate = true;
				}
				
				// calculate team-balance
				if(info->team != -1)
				{
					snap.team_size[info->team]++;
					stats[info->cid].active = true;
				}
				
			}
			else if(item.type == NETOBJTYPE_CHARACTER)
			{
				const void *old = snap_find_item(SNAP_PREV, NETOBJTYPE_CHARACTER, item.id);
				if(old)
				{
					snap.characters[item.id].active = true;
					snap.characters[item.id].prev = *((const NETOBJ_CHARACTER *)old);
					snap.characters[item.id].cur = *((const NETOBJ_CHARACTER *)data);

					if(snap.characters[item.id].prev.tick)
						evolve(&snap.characters[item.id].prev, client_prevtick());
					if(snap.characters[item.id].cur.tick)
						evolve(&snap.characters[item.id].cur, client_tick());
				}
			}
			else if(item.type == NETOBJTYPE_GAME)
			{
				snap.gameobj = (NETOBJ_GAME *)data;
				if(snap.gameobj->game_over != last_game_over)
				{
					if(!last_game_over)
						on_game_over();
					else
						on_game_restart();
					last_game_over = snap.gameobj->game_over;
				}
				if((snap.gameobj->warmup > 0) != last_warmup)
				{
					if(last_warmup)
						on_warmup_end();
					last_warmup = snap.gameobj->warmup > 0;
				}
			}
			else if(item.type == NETOBJTYPE_FLAG)
			{
				int fid = item.id%2;
				snap.flags[fid] = (const NETOBJ_FLAG *)data;
				if(snap.flags[fid]->carried_by != last_flag_carrier[fid])
				{
					if(snap.flags[fid]->carried_by >= 0)
						on_flag_grab(fid);
					last_flag_carrier[fid] = snap.flags[fid]->carried_by;
				}
			}
		}

		// TeeComp
		for(int i=0; i<MAX_CLIENTS; i++)
		{
			if(stats[i].active && !stats[i].was_active)
			{
				stats[i].reset(); // Client connected, reset stats.
				stats[i].active = true;
				stats[i].join_date = client_tick();
			}
			stats[i].was_active = stats[i].active;
		}
	}
	
	// setup local pointers
	if(snap.local_cid >= 0)
	{
		SNAPSTATE::CHARACTERINFO *c = &snap.characters[snap.local_cid];
		if(c->active)
		{
			snap.local_character = &c->cur;
			snap.local_prev_character = &c->prev;
			local_character_pos = vec2(snap.local_character->x, snap.local_character->y);
		}
	}
	else
		snap.spectate = true;
	
	TUNING_PARAMS standard_tuning;
	SERVER_INFO current_server_info;
	client_serverinfo(&current_server_info);
	if(current_server_info.gametype[0] != '0')
	{
		if(strcmp(current_server_info.gametype, "DM") != 0 && strcmp(current_server_info.gametype, "TDM") != 0 && strcmp(current_server_info.gametype, "CTF") != 0)
			servermode = SERVERMODE_MOD;
		else if(memcmp(&standard_tuning, &tuning, sizeof(TUNING_PARAMS)) == 0)
			servermode = SERVERMODE_PURE;
		else
			servermode = SERVERMODE_PUREMOD;
	}
	

	// update render info
	for(int i = 0; i < MAX_CLIENTS; i++)
		clients[i].update_render_info(i);
}
示例#7
0
void GAMECLIENT::send_kill(int client_id)
{
	NETMSG_CL_KILL msg;
	msg.pack(MSGFLAG_VITAL);
	client_send_msg();
}