📄 anongame.c
字号:
} 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 + -