⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anongame.c

📁 打魔兽战网的都知道他是什么
💻 C
📖 第 1 页 / 共 5 页
字号:
    }    conn_set_anongame_search_starttime(c, now);    switch (option) {	case CLIENT_FINDANONGAME_AT_INVITER_SEARCH:	    a->count = bn_int_get(packet->u.client_findanongame_at_inv.count);	    a->id = bn_int_get(packet->u.client_findanongame_at_inv.id);	    a->tid = bn_int_get(packet->u.client_findanongame_at_inv.tid);	    a->race = bn_int_get(packet->u.client_findanongame_at_inv.race);	    a->map_prefs = bn_int_get(packet->u.client_findanongame_at_inv.map_prefs);	    a->type = bn_byte_get(packet->u.client_findanongame_at_inv.type);	    a->gametype = bn_byte_get(packet->u.client_findanongame_at_inv.gametype);	    teamsize = bn_byte_get(packet->u.client_findanongame_at_inv.teamsize);	    break;	case CLIENT_FINDANONGAME_AT_SEARCH:	    a->count = bn_int_get(packet->u.client_findanongame_at.count);	    a->id = bn_int_get(packet->u.client_findanongame_at.id);	    a->tid = bn_int_get(packet->u.client_findanongame_at.tid);	    a->race = bn_int_get(packet->u.client_findanongame_at.race);	    teamsize = bn_byte_get(packet->u.client_findanongame_at.teamsize);	    break;	case CLIENT_FINDANONGAME_SEARCH:	    a->count = bn_int_get(packet->u.client_findanongame.count);	    a->id = bn_int_get(packet->u.client_findanongame.id);	    a->race = bn_int_get(packet->u.client_findanongame.race);	    a->map_prefs = bn_int_get(packet->u.client_findanongame.map_prefs);	    a->type = bn_byte_get(packet->u.client_findanongame.type);	    a->gametype = bn_byte_get(packet->u.client_findanongame.gametype);	    break;	default:	    eventlog(eventlog_level_error, __FUNCTION__, "invalid search option (%d)", option);	    return -1;    }    if (option != CLIENT_FINDANONGAME_AT_SEARCH)	if ((a->queue = _anongame_gametype_to_queue(a->type, a->gametype)) < 0) {	    eventlog(eventlog_level_error, __FUNCTION__, "invalid queue: %d", a->queue);	    return -1;	}    account_set_w3pgrace(conn_get_account(c), conn_get_clienttag(c), a->race);    /* send search reply to client */    if (!(rpacket = packet_create(packet_class_bnet)))	return -1;    packet_set_size(rpacket, sizeof(t_server_anongame_search_reply));    packet_set_type(rpacket, SERVER_ANONGAME_SEARCH_REPLY);    bn_byte_set(&rpacket->u.server_anongame_search_reply.option, SERVER_FINDANONGAME_SEARCH);    bn_int_set(&rpacket->u.server_anongame_search_reply.count, a->count);    bn_int_set(&rpacket->u.server_anongame_search_reply.reply, 0);    temp = (int) average_anongame_search_time;    packet_append_data(rpacket, &temp, 2);    conn_push_outqueue(c, rpacket);    packet_del_ref(rpacket);    /* end search reply */    switch (option) {	case CLIENT_FINDANONGAME_AT_INVITER_SEARCH:	    for (i = 0; i < teamsize; i++) {	/* assign player conns to tc[] array */		if (!(tc[i] = _connlist_find_connection_by_uid(bn_int_get(packet->u.client_findanongame_at_inv.info[i])))) {		    eventlog(eventlog_level_error, __FUNCTION__, "[%d] got NULL connection", conn_get_socket(tc[i]));		    return -1;		}	    }	    for (i = 0; i < teamsize; i++) {	/* assign info from inviter to other team players */		if (!(ta = conn_get_anongame(tc[i]))) {		    if (!(ta = conn_create_anongame(tc[i]))) {			eventlog(eventlog_level_error, __FUNCTION__, "[%d] conn_create_anongame failed", conn_get_socket(tc[i]));			return -1;		    }		}		for (j = 0; j < teamsize; j++)	/* add each players conn to each anongame struct */		    ta->tc[j] = tc[j];		ta->type = a->type;		ta->gametype = a->gametype;		ta->queue = a->queue;		ta->map_prefs = a->map_prefs;		if (ta->tid != a->tid)		    set = 0;	    }	    if (!set)		/* check if search packet has been recieved from each team member */		return 0;	    break;	case CLIENT_FINDANONGAME_AT_SEARCH:	    for (i = 0; i < teamsize; i++) {	/* assign player conns to tc[] array */		if (!(tc[i] = _connlist_find_connection_by_uid(bn_int_get(packet->u.client_findanongame_at.info[i])))) {		    eventlog(eventlog_level_error, __FUNCTION__, "[%d] got NULL connection", conn_get_socket(tc[i]));		    return -1;		}	    }	    for (i = 0; i < teamsize; i++) {	/* check if search packet has been recieved from each team member */		if (!(ta = conn_get_anongame(tc[i])))		    return 0;		if (ta->tid != a->tid)		    return 0;	    }	    break;	case CLIENT_FINDANONGAME_SEARCH:	    tc[0] = c;	    a->tc[0] = c;	    break;	default:	    eventlog(eventlog_level_error, __FUNCTION__, "invalid search option (%d)", option);	    return -1;    }    if (_anongame_queue(tc[0], a->queue, a->map_prefs) < 0) {	eventlog(eventlog_level_error, __FUNCTION__, "queue failed");	return -1;    }    _anongame_match(c, a->queue);    /* if enough players are queued send found packet */    if (players[a->queue] == _anongame_totalplayers(a->queue))	if (_anongame_search_found(a->queue) < 0)	    return -1;    return 0;}static int _anongame_queue(t_connection * c, int queue, t_uint32 map_prefs){    int level;    t_matchdata *md;    if (!c) {	eventlog(eventlog_level_error, __FUNCTION__, "got NULL connection");    }    if (queue >= ANONGAME_TYPES) {	eventlog(eventlog_level_error, __FUNCTION__, "unknown queue: %d", queue);	return -1;    }    level = _anongame_level_by_queue(c, queue);    if (!matchlists[queue][level])	matchlists[queue][level] = list_create();    md = xmalloc(sizeof(t_matchdata));    md->c = c;    md->map_prefs = map_prefs;    md->versiontag = _conn_get_versiontag(c);    list_append_data(matchlists[queue][level], md);    return 0;}static int _anongame_compare_level(void const *a, void const *b){    t_connection *ca = *(t_connection * const *) a;    t_connection *cb = *(t_connection * const *) b;    int level_a = _anongame_level_by_queue(ca, anongame_get_queue(conn_get_anongame(ca)));    int level_b = _anongame_level_by_queue(cb, anongame_get_queue(conn_get_anongame(cb)));    return (level_a > level_b) ? -1 : ((level_a < level_b) ? 1 : 0);}static int _anongame_order_queue(int queue){    if (_anongame_totalteams(queue) != 0 && !anongame_arranged(queue)) {	/* no need to reorder 1v1, sffa, or AT queues */	int i, j;	t_connection *temp;	int level[ANONGAME_MAX_TEAMS];	int teams = _anongame_totalteams(queue);	/* number of teams */	int ppt = players[queue] / teams;	/* players per team */	for (i = 0; i < ANONGAME_MAX_TEAMS; i++)	    level[i] = 0;	for (i = 0; i < ppt - 1; i++) {	/* loop through the number of players per team */	    for (j = 0; j < teams; j++) {		level[j] = level[j] + _anongame_level_by_queue(player[queue][i * ppt + j], queue);	    }	    if (teams == 2) {		/* 1 >= 2 */		if (level[i * teams] >= level[i * teams + 1]) {		    temp = player[queue][(i + 1) * teams];		    player[queue][(i + 1) * teams] = player[queue][(i + 1) * teams + 1];		    player[queue][(i + 1) * teams + 1] = temp;		}		/* 2 >= 1 */		else if (level[i * teams + 1] >= level[i * teams]) {		    ;		/* nothing to do */		}	    }	    /* end 2 teams */	    else if (teams == 3) {		/* 1 >= 2 >= 3 */		if (level[i * 3] >= level[i * 3 + 1] && level[i * 3 + 1] >= level[i * 3 + 2]) {		    temp = player[queue][(i + 1) * 3];		    player[queue][(i + 1) * 3] = player[queue][(i + 1) * 3 + 2];		    player[queue][(i + 1) * 3 + 2] = temp;		}		/* 1 >= 3 >= 2 */		else if (level[i * 3] >= level[i * 3 + 2] && level[i * 3 + 2] >= level[i * 3 + 1]) {		    temp = player[queue][(i + 1) * 3];		    player[queue][(i + 1) * 3] = player[queue][(i + 1) * 3 + 2];		    player[queue][(i + 1) * 3 + 2] = player[queue][(i + 1) * 3 + 1];		    player[queue][(i + 1) * 3 + 1] = temp;		}		/* 2 >= 1 >= 3 */		else if (level[i * 3 + 1] >= level[i * 3] && level[i * 3] >= level[i * 3 + 2]) {		    temp = player[queue][(i + 1) * 3];		    player[queue][(i + 1) * 3] = player[queue][(i + 1) * 3 + 1];		    player[queue][(i + 1) * 3 + 1] = player[queue][(i + 1) * 3 + 2];		    player[queue][(i + 1) * 3 + 2] = temp;		}		/* 2 >= 3 >= 1 */		else if (level[i * 3 + 1] >= level[i * 3 + 2] && level[i * 3 + 2] >= level[i * 3]) {		    temp = player[queue][(i + 1) * 3 + 1];		    player[queue][(i + 1) * 3 + 1] = player[queue][(i + 1) * 3 + 2];		    player[queue][(i + 1) * 3 + 2] = temp;		}		/* 3 >= 1 >= 2 */		else if (level[i * 3 + 2] >= level[i * 3] && level[i * 3] >= level[i * 3 + 1]) {		    temp = player[queue][(i + 1) * 3];		    player[queue][(i + 1) * 3] = player[queue][(i + 1) * 3 + 1];		    player[queue][(i + 1) * 3 + 1] = temp;		}		/* 3 >= 2 >= 1 */		else if (level[i * 3 + 2] >= level[i * 3 + 1] && level[i * 3 + 1] >= level[i * 3]) {		    ;		/* nothing to do */		}	    }	    /* end 3 teams */	    else if (teams == 4) {		/* 1234 */		if (level[i * 4] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4 + 3]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		    temp = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		}		/* 1243 */		else if (level[i * 4] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4 + 2] && level[i * 4 + 3] >= level[i * 4 + 2]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		}		/* 1324 */		else if (level[i * 4] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4 + 3]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 1342 */		else if (level[i * 4] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4 + 1]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = temp;		}		/* 1423 */		else if (level[i * 4] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4 + 2]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		}		/* 1432 */		else if (level[i * 4] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4 + 1]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = temp;		}		/* 2134 */		else if (level[i * 4 + 1] >= level[i * 4] && level[i * 4] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4 + 3]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 2143 */		else if (level[i * 4 + 1] >= level[i * 4] && level[i * 4] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4 + 2]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		    temp = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 2314 */		else if (level[i * 4 + 1] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4] && level[i * 4] >= level[i * 4 + 3]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = temp;		}		/* 2341 */		else if (level[i * 4 + 1] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4]) {		    temp = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 2413 */		else if (level[i * 4 + 1] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4] && level[i * 4] >= level[i * 4 + 2]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		}		/* 2431 */		else if (level[i * 4 + 1] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4]) {		    temp = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		}		/* 3124 */		else if (level[i * 4 + 2] >= level[i * 4] && level[i * 4] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4 + 3]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 3142 */		else if (level[i * 4 + 2] >= level[i * 4] && level[i * 4] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4 + 1]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = temp;		}		/* 3214 */		else if (level[i * 4 + 2] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4] && level[i * 4] >= level[i * 4 + 3]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 3241 */		else if (level[i * 4 + 2] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4]) {		    temp = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 3412 */		else if (level[i * 4 + 2] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4] && level[i * 4] >= level[i * 4 + 1]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = temp;		    temp = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 3421 */		else if (level[i * 4 + 2] >= level[i * 4 + 3] && level[i * 4 + 3] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4]) {		    temp = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 3];		    player[queue][(i + 1) * 4 + 3] = temp;		}		/* 4123 */		else if (level[i * 4 + 3] >= level[i * 4] && level[i * 4] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4 + 2]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		}		/* 4132 */		else if (level[i * 4 + 3] >= level[i * 4] && level[i * 4] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4 + 1]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = temp;		}		/* 4213 */		else if (level[i * 4 + 3] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4] && level[i * 4] >= level[i * 4 + 2]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		}		/* 4231 */		else if (level[i * 4 + 3] >= level[i * 4 + 1] && level[i * 4 + 1] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4]) {		    temp = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = player[queue][(i + 1) * 4 + 2];		    player[queue][(i + 1) * 4 + 2] = temp;		}		/* 4312 */		else if (level[i * 4 + 3] >= level[i * 4 + 2] && level[i * 4 + 2] >= level[i * 4] && level[i * 4] >= level[i * 4 + 1]) {		    temp = player[queue][(i + 1) * 4];		    player[queue][(i + 1) * 4] = player[queue][(i + 1) * 4 + 1];		    player[queue][(i + 1) * 4 + 1] = temp;		}		/* 4321 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -