Участник
Пользователь
- Сообщения
- 42
- Реакции
- 32
Всем привет!
Я еще совсем зеленый в скриптинге, пробую написать примитивный балансер.
Суть: в начале каждого раунда проверяются обе команды, надо взять лучшего по фрагам из выигрывающей команды и худшего из проигрывающей, и поменять их местами. Пробовал заюзать SortCustom2D, но так и не понял как ею правильно воспользоваться. Добавил комменты в коде. Прошу помощи у знающих!
В будущем планирую добавить всякие проверки, например, чтобы не каждый раунд балансило, а если будет разница в счёте команд, например - 5, итп... Пока на это не обращайте внимания)
Я еще совсем зеленый в скриптинге, пробую написать примитивный балансер.
Суть: в начале каждого раунда проверяются обе команды, надо взять лучшего по фрагам из выигрывающей команды и худшего из проигрывающей, и поменять их местами. Пробовал заюзать SortCustom2D, но так и не понял как ею правильно воспользоваться. Добавил комменты в коде. Прошу помощи у знающих!
В будущем планирую добавить всякие проверки, например, чтобы не каждый раунд балансило, а если будет разница в счёте команд, например - 5, итп... Пока на это не обращайте внимания)
Код:
#include <amxmodx>
#include <cstrike>
// PREPARE DATA
enum _:Teams {
TeamTT = 1,
TeamCT
}
const MAXPLAYERS = 32;
new g_iPlayerKills[MAXPLAYERS + 1];
new g_eTeamScore[Teams + 1];
new g_iMaxPlayers;
// PLUGIN INIT
public plugin_init() {
register_plugin("test", "1.0", "test");
register_event("DeathMsg", "EventDeath", "a");
register_event("TeamScore", "EventScore", "a");
register_event("HLTV", "EventNewRound", "a", "1=0", "2=0");
g_iMaxPlayers = get_maxplayers();
}
// PUBLIC FUNCTIONS
public EventDeath() {
new iKiller = read_data(1);
g_iPlayerKills[iKiller]++;
}
public EventScore() {
new szTeam[1];
read_data(1, szTeam, 1);
if(szTeam[0] == 'C') g_eTeamScore[TeamCT] = read_data(2);
else g_eTeamScore[TeamTT] = read_data(2);
}
public EventNewRound() {
new iBestPlayer, iWorstPlayer;
GetActualPlayers(iBestPlayer, iWorstPlayer);
// Тут нужно свапнуть - ЛУЧШЕГО игрока с ВЫИГРЫВАЮЩЕЙ команды на ХУДШЕГО игрока с ПРОИГРЫВАЮЩЕЙ команды
// Например, выигрывают Терры, - лучший игрок это Тер, перевести его за КТ, а худшего с команды КТ за Терров
// Ну тут просто свап команды игрока, а все проверки в функции ---> GetActualPlayers()
server_print( "Best Player ID=%d", iBestPlayer);
server_print( "Worst Player ID=%d", iWorstPlayer);
}
GetActualPlayers(&iBestPlayer, &iWorstPlayer) {
new iPlayersKills[Teams + 1][MAXPLAYERS];
for(new id = 1; id <= g_iMaxPlayers; id++) {
if(!is_user_connected(id)) continue;
switch(cs_get_user_team(id)) {
case CS_TEAM_CT: {
iPlayersKills[TeamCT][id] = g_iPlayerKills[id];
}
case CS_TEAM_T: {
iPlayersKills[TeamTT][id] = g_iPlayerKills[id];
}
default: continue;
}
}
// Надо проверить какая команда сейчас выигрывает
// Взять лучшего игрока из выигрывающей команды
// Взять худшего игрока из проигрывающей команды
// Записать этих двух в переменные
// Но тут я запутался...
if(g_eTeamScore[TeamCT] > g_eTeamScore[TeamTT]) {
SortCustom2D(_:iPlayersKills, sizeof(iPlayersKills) , "SortCompare");
iBestPlayer = _:iPlayersKills[TeamCT][0];
iWorstPlayer = _:iPlayersKills[TeamTT][0];
} else {
SortCustom2D(_:iPlayersKills, sizeof(iPlayersKills) , "SortCompare");
iBestPlayer = _:iPlayersKills[TeamTT][0];
iWorstPlayer = _:iPlayersKills[TeamCT][0];
}
}
public SortCompare(Float:elem1[], Float:elem2[]) {
if(elem1[1] > elem2[1]) {
return -1;
}
else if(elem1[1] < elem2[1]) {
return 1;
}
return 0;
}