Такими темпами ваш плагин станет подобием NotJustin/SkillAutoBalanceЯ учел ваше предложение, обещаю как только будет больше свободного времени, выпущу патч и включу не только ЛР
Хм, прикольно. Ближе к Новому Году займусь этим, добавлю все возможные (невозможные) модули и сделаю полноценное ядро. Сейчас, могу только прикидывать планы и накидывать костыли ;)Такими темпами ваш плагин станет подобием NotJustin/SkillAutoBalance
Пользуясь случаем попрошу добавить автобаланс по-уровню SMRPG peace-maker/smrpg
Выкатываю обновление. Фиксанул пару багов, добавил квары, смотрим ниже:
[CVARS]:
1. Обновлен квар sm_ab_ratio, теперь он может принимать уникальное значение 0 - данное значение нужно, для следующих 3-х кваров.
2. Добавлен квар sm_ab_precise "0" - отвечает за балансирование игроков до определенного отношения, то есть...
"IMautoBalance" "1"
Хорошая идея и я ее учел, в следующем обновление, которое выйдет ближе к выходным на следующей неделе уже будет в делеА "администратор" - это любой игрок имеющий любой флаг админа или только root?
В конфиге есть ограничения на рестарт раунда, игры и т.д. и было бы удобно добавить root флаг в исключение этим запретам
И даже доступ в меню удобно ограничивать по флагу :)
Еще бы добавить кулдаун для игрока. А то бывает одного и того же игрока перекидывает по командамХорошая идея и я ее учел, в следующем обновление, которое выйдет ближе к выходным на следующей неделе уже будет в делеРазобью админ возможности на флаги доступа, т.к. изначально в логику было заложено, чтобы любой администратор имел возможность к балансированию и прочим фишкам с этим.
Все зависит от выставленных вами параметров в конфиг файле. Насчет КД, установите sm_ab_level = 2, данное значение решит ваши проблемы. Насчет админов гляну, пометил. Можете прикрепить свой файл cfg?Еще бы добавить кулдаун для игрока. А то бывает одного и того же игрока перекидывает по командам
+баг: игрок умирает, его переносит и отменяет смерть. Были даже игроки, у которых -1 смерть
еще при выборе команды пробелом иногда не пускает в команду и пишет "Баланс не позволяет сменить команду"
еще кстати иногда перекидывает админов, хотя в конфиге прописано sm_ab_swap_filter_admin 3
Все зависит от выставленных вами параметров в конфиг файле. Насчет КД, установите sm_ab_level = 2, данное значение решит ваши проблемы. Насчет админов гляну, пометил. Можете прикрепить свой файл cfg?
public int RoundToMath(float number)
{
float fraction = FloatFraction(number);
if(fraction >= 0.5)
{
return RoundToCeil(number);
}
else
{
return RoundToFloor(number);
}
}
static const float FLOATS[] = {0.1, 0.5, 0.7, 0.0, -0.1, -0.5, -0.7};
public void OnPluginStart()
{
PrintToServer("\n<compare>")
for(int i = 0; i < sizeof(FLOATS); i++)
PrintToServer("%i) %.2f: near = %i, math = %i", i+1, FLOATS[i], RoundToNearest(FLOATS[i]), RoundToMath(FLOATS[i]));
PrintToServer("</compare>\n")
}
public int RoundToMath(float number)
{
if(FloatFraction(number) >= 0.5)
return RoundToCeil(number);
else return RoundToFloor(number);
}
<compare>
1) 0.10: near = 0, math = 0
2) 0.50: near = 0, math = 1
3) 0.69: near = 1, math = 1
4) 0.00: near = 0, math = 0
5) -0.10: near = 0, math = 0
6) -0.50: near = 0, math = 0
7) -0.69: near = -1, math = -1
</compare>
GetClientName(i, name, sizeof(name));
FormatEx(name, sizeof(name), "%s [x]", name);
FormatEx(name, sizeof(name), "%N [%s]", i, IsPlayerBannedTeam(i, 0) ? "x" : " ");
This is the same as Format(), except none of the input buffers can overlap the same memory as the output buffer. Since this security check is removed, it is slightly faster.
void SetMenuTitle(Handle menu, const char[] fmt, any... ...)
забыл поменятьИ ещё: ты забыл в исходнике версию поменять.
Или залил весию 1.0.0 вместо 1.1.2
Спасибо за такой тщательный разбор, очень приятно, кто-то из опытных ребят все -таки смогли посмотреть код и найти определенный ошибки и как минимум сэкономить мне кучу времени, так как его и так сейчас не особо много...лолже практически эквивалентно RoundToNearest()C-подобный:public int RoundToMath(float number) { float fraction = FloatFraction(number); if(fraction >= 0.5) { return RoundToCeil(number); } else { return RoundToFloor(number); } }
Выводит вот это:C-подобный:static const float FLOATS[] = {0.1, 0.5, 0.7, 0.0, -0.1, -0.5, -0.7}; public void OnPluginStart() { PrintToServer("\n<compare>") for(int i = 0; i < sizeof(FLOATS); i++) PrintToServer("%i) %.2f: near = %i, math = %i", i+1, FLOATS[i], RoundToNearest(FLOATS[i]), RoundToMath(FLOATS[i])); PrintToServer("</compare>\n") } public int RoundToMath(float number) { if(FloatFraction(number) >= 0.5) return RoundToCeil(number); else return RoundToFloor(number); }
C-подобный:<compare> 1) 0.10: near = 0, math = 0 2) 0.50: near = 0, math = 1 3) 0.69: near = 1, math = 1 4) 0.00: near = 0, math = 0 5) -0.10: near = 0, math = 0 6) -0.50: near = 0, math = 0 7) -0.69: near = -1, math = -1 </compare>
Сообщения автоматически склеены:
хм, если не использовать функцию GetCmdArgInt(), то плагин можно компилить хоть на SM1.8
Сообщения автоматически склеены:
Я тут глянул код, немного почистил и код стал на 975 строк (и на 14кБ) меньше. Но там ещё работы - непочатый край
Ну и сделал код совместимым с SM более старым, чем указано в требованиях.
Кстати, у тебя в каллбэке события смены команды (Event_PlayerTeam) ошибка: int oldteam = GetClientOfUserId(GetEventInt(event, "oldteam")); вместо int oldteam = GetEventInt(event, "oldteam");
Там же у тебя сначала идёт проверка на команду игрока , а только после этого проверяется валидность индекса и в игре ли этот игрок.
Интересно, как много ошибок в логе это создаёт?
Нипонил. Как это понимать?! О_оПравильнее же былоC-подобный:GetClientName(i, name, sizeof(name)); FormatEx(name, sizeof(name), "%s [x]", name);
Кроме того использовать при форматировании с помощью FormatEx() строковую переменную одновременно как целевую и как параметр для форматирования нельзя, насколько мне известно.C-подобный:FormatEx(name, sizeof(name), "%N [%s]", i, IsPlayerBannedTeam(i, 0) ? "x" : " ");
Ещё к чему использовать %T в форматировании, если уже сделал перед этим SetGlobalTransTarget(client);? Используй %t в этом случае.C-подобный:This is the same as Format(), except none of the input buffers can overlap the same memory as the output buffer. Since this security check is removed, it is slightly faster.
И ещё я тебе открою страшную тайну (к сожалению, тебя придётся убить после этого, чтобы ты больше никому не рассказал): SetMenuTitle() поддерживает форматирование, в отличии от AddMenuItem(), поэтому не требуется предварительно использовать Format().C-подобный:void SetMenuTitle(Handle menu, const char[] fmt, any... ...)
Сообщения автоматически склеены:
И ещё: ты забыл в исходнике версию поменять.
Или залил весию 1.0.0 вместо 1.1.2
Очень странно, учитывая что в архиве нет, ничего кроме исходника, либ и самого плагина. Могу предположить, что он ругается на компилятор, но это мое предположение... Попробуйте скачать по отдельности файлы с Яндекс.Диск или Гита. Возьму на заметку, что не стоит оставлять компиляторы в архивах.
Думаю просто не стоит доверять всяким дерьмовым антивирусам. На Virustotal'е ни одного детекта.Очень странно, учитывая что в архиве нет, ничего кроме исходника, либ и самого плагина. Могу предположить, что он ругается на компилятор, но это мое предположение... Попробуйте скачать по отдельности файлы с Яндекс.Диск или Гита. Возьму на заметку, что не стоит оставлять компиляторы в архивах.
а следующая неделя после какой именно?)Хорошая идея и я ее учел, в следующем обновление, которое выйдет ближе к выходным на следующей неделе уже будет в делеРазобью админ возможности на флаги доступа, т.к. изначально в логику было заложено, чтобы любой администратор имел возможность к балансированию и прочим фишкам с этим.