Esempio n. 1
0
void Server::read_client_move(Client *client) {
	NetBuffer *msg = client->m_netconnection->m_receiveMessage;
	usercmd_t *move = &client->m_cmd;

	int		i;
	vec3_t	angle;
	int		bits;

	// read ping time
	client->m_ping_times[client->m_num_pings%NUM_PING_TIMES]
		= m_time - msg->read_float();
	client->m_num_pings++;

	// read current angles	
	for (i = 0; i<3; i++)
		angle[i] = msg->read_angle();

	VectorCopy(angle, client->m_edict->v.v_angle);

	// read movement
	move->forwardmove = msg->read_short();
	move->sidemove = msg->read_short();
	move->upmove = msg->read_short();

	// read buttons
	bits = msg->read_byte();
	client->m_edict->v.button0 = (bits & 1);
	client->m_edict->v.button2 = (bits & 2) >> 1;

	i = msg->read_byte();
	if (i)
		client->m_edict->v.impulse = i;
}
Esempio n. 2
0
bool Server::read_client_message(Client *client) {
	NetBuffer *msg = client->m_netconnection->m_receiveMessage;
	char *s;
	int ret;

	do {
		if (msg->pos() == 0 || msg->read_pos() == msg->pos()) {
			break;
		}
		int r = msg->read_byte();
		if (r == -1) {
			return false;
		}
		int len = msg->read_short();
		/*int skip = */msg->read_byte();

		int end = msg->read_pos() + len;

		do {
			if (len == 0 || !client->is_active()) {
				return false;
			}
			int cmd = msg->read_byte();

			//check end of message
			if (cmd == -1) {
				break;
			}
			switch (cmd)
			{
			case -1:
				//goto nextmsg;		// end of message

			default:
				printf("SV_ReadClientMessage: unknown command char\n");
				return false;

			case clc_nop:
				printf("clc_nop\n");
				break;

			case clc_stringcmd:
				s = msg->read_string();
				ret = 0;
				if (strncasecmp(s, "status", 6) == 0)
					ret = 1;
				else if (strncasecmp(s, "god", 3) == 0)
					ret = 1;
				else if (strncasecmp(s, "notarget", 8) == 0)
					ret = 1;
				else if (strncasecmp(s, "fly", 3) == 0)
					ret = 1;
				else if (strncasecmp(s, "name", 4) == 0)
					ret = 1;
				else if (strncasecmp(s, "noclip", 6) == 0)
					ret = 1;
				else if (strncasecmp(s, "create", 6) == 0)
					ret = 1;
				else if (strncasecmp(s, "say", 3) == 0)
					ret = 1;
				else if (strncasecmp(s, "say_team", 8) == 0)
					ret = 1;
				else if (strncasecmp(s, "tell", 4) == 0)
					ret = 1;
				else if (strncasecmp(s, "color", 5) == 0)
					ret = 1;
				else if (strncasecmp(s, "kill", 4) == 0)
					ret = 1;
				else if (strncasecmp(s, "pause", 5) == 0)
					ret = 1;
				else if (strncasecmp(s, "spawn", 5) == 0) {
					ret = 1;
				}
				else if (strncasecmp(s, "begin", 5) == 0) {
					ret = 1;
					client->m_spawned = true;
					break;
				}
				else if (strncasecmp(s, "prespawn", 8) == 0) {
					ret = 1;
				}
				else if (strncasecmp(s, "kick", 4) == 0)
					ret = 1;
				else if (strncasecmp(s, "ping", 4) == 0)
					ret = 1;
				else if (strncasecmp(s, "give", 4) == 0)
					ret = 1;

				if (ret == 2)
					Cbuf_InsertText(s);
				else if (ret == 1) {
					m_cmds.call(s, client);
					Cmd_ExecuteString(s, src_client);
				}
				else
					printf("%s tried to %s\n", client->m_name, s);
				break;

			case clc_disconnect:
				printf("SV_ReadClientMessage: client disconnected\n");
				return false;

			case clc_move:
				read_client_move(client);
				break;
			}

		} while (msg->read_pos() < end);
		//read alignment bytes
		while (msg->read_pos() & 0x3) {
			msg->read_byte();
		}
		//break;
	} while (1);


	client->m_netconnection->clear();

	return true;
}