А ты упёрся в лимиты, прежде чем оптимизировать?упор на оптимизацию я сделал
const DMG_GRENADE = (1<<24);
const OFFSET_CURRENT_ITEM = 41;
const OFFSET_MONEY = 115;
const OFFSET_KILLHEAD = 75;
new bool: g_bIsFurrien[33], bool: g_bIsBlockSpeed[33];
g_sName[33][32]
можно удалить полностью. В AMXX 1.9.0 есть "%n" для вывода ника.const Float: FURRIEN_SPEED = 680.0; // Скорость фурий
const Float: FURRIEN_GRAVITY = 0.405; // Гравитация фурий
new const MODEL_ALLIANCE[] = "alliance"; // ИМЯ: models/player/ИМЯ/ИМЯ.mdl (модель альянса)
new const SOUND_WIN_FURRIEN[] = "furrien_mode/furrien_win"; // Звук победы фуррий
new const SOUND_WIN_ALLIANCE[] = "furrien_mode/alliance_win"; // Звук победы фуррий
const VIP_FLAG = ADMIN_LEVEL_H; // Флаг випа
new const FOG_MODE = 1; // Режим тумана (0 - отключить, 1 - включить)
new const PATH_DATABASE[] = "addons/amxmodx/data/lvl.dat";
new const LVL_KILLS[] = {0, 55, 310, 985, 1705, 3600, 5965, 8760, 10870, 12999}; // Кол-во убийств для переходов на следующие уровни
const POINT_KILL = 1; // Сколько килл-поинтов давать за простое убийство
const POINT_KILL_HEAD = 2; // Сколько килл-поинтов давать за убийство в голову
const POINT_KILL_KNIFE = 3; // Сколько килл-поинтов давать за убийство ножом
const POINT_KILL_GRENADE = 4; // Сколько килл-поинтов давать за убийство гранатой
const Float: DIST_FROST_NORMAL = 200.0; // Дистанция для обычной заморозки (юниты от эпицентра)
const Float: DIST_FROST_LONG = 100.0; // Дистанция для длительной заморозки (юниты от эпицентра)
const Float: TIME_FROST_NORMAL = 3.0; // Время обычной заморозки
const Float: TIME_FROST_LONG = 6.0; // Время длительной заморозки
const Float: SPEED_FROST_NORMAL = 50.0; // Скорость для игрока при обычной заморозке
const Float: SPEED_FROST_LONG = -1.0; // Скорость для игрока при длительной заморозке
const Float: DAMAGE_FROST_NORMAL = 3.0; // Урон игроку при обычной заморозке
const Float: DAMAGE_FROST_LONG = 7.0; // Урон игроку при длительной заморозке
format(sPath, charsmax(sPath), "models/player/%s/%s.mdl", MODEL_ALLIANCE, MODEL_ALLIANCE);
format(sPath, charsmax(sPath), "%s.wav", SOUND_WIN_FURRIEN);
format(sPath, charsmax(sPath), "%s.wav", SOUND_WIN_ALLIANCE);
g_iMaxPlayers = get_maxplayers();
MaxClients
.set_task
можно поменять на set_task_ex
для меньшего хардкода.public Task_CheckPlayerValid(iTask)
{
new id = iTask - TASK_CREATE_FOG;
if(!is_user_connected(id))
return;
fog_create(id);
remove_task(iTask);
}
public Task_CheckPlayerValid(id)
{
id -= TASK_CREATE_FOG;
if(!is_user_connected(id))
return;
fog_create(id);
remove_task(id+TASK_CREATE_FOG);
}
for(new id = 1; id < g_iMaxPlayers; id++)
ошибка с "<". Должно быть "<=".format(g_sTeam[id], 15, "Фурии");
format(g_sAddInfo[id], 63, "Класс: %s", g_sFurrienClassName[g_iFurrienClassNum[id]]);
charsmax()
в помощь. Ну и format -> formatex.if(!is_user_connected(iAttacker))
return;
if(g_bIsFurrien[iAttacker])
return;
if(iVictim == iAttacker)
return;
if(!is_user_connected(iAttacker) || g_bIsFurrien[iAttacker] || iVictim == iAttacker)
return;
if(g_bIsFurrien[id])
return HAM_SUPERCEDE;
if(g_bIsBlockSpeed[id])
return HAM_SUPERCEDE;
client_cmd(0, "spk %s", SOUND_WIN_FURRIEN);
message_begin(MSG_ONE, g_iMsgFog, _, id);
message_begin(MSG_ONE, g_iMsgFog, .player = id);
get_user_team(id)
я думаю лучше было бы поменять на get_ent_data(id, "CBasePlayer", "m_iTeam)
charsmax некорректно работает с двумерным массивом.15)
Ещё хардкод. И так много где.C++:format(g_sTeam[id], 15, "Фурии"); format(g_sAddInfo[id], 63, "Класс: %s", g_sFurrienClassName[g_iFurrienClassNum[id]]);
charsmax()
в помощь. Ну и format -> formatex.
AMXX 1.9.0 это переименованный AMXX 1.8.3.заменой функций AMXX 183 на 190
charsmax некорректно работает с двумерным массивом.
formatex(g_sTeam[id], charsmax(g_iTeam[]), "Фурии");
formatex(g_sAddInfo[id], charsmax(g_iTeam[]), "Класс: %s", g_sFurrienClassName[g_iFurrienClassNum[id]]);
ReAPI никак не относится к тому что я описал. Если ещё добавить к этому ReAPI то ещё много чего можно поменять.я про функции reapi имел ввиду.
63 вернёт в этом случае. Чтобы вернуло 32 надо использоватьcharsmax вернет 32, а не 63.
charsmax(g_sValue)
Потому что будет 3 проверки независимо от состояния первых двух. Строчек не надо жалеть.Зачем 3 условия? Когда можно так:
C++:if(!is_user_connected(iAttacker) || g_bIsFurrien[iAttacker] || iVictim == iAttacker) return;
Если первое условие не сработает остальные проверяться не будут, хоть в одну строку, хоть в 3Потому что будет 3 проверки независимо от состояния первых двух. Строчек не надо жалеть.
voed, т.е по вашему если игрок is_user_connected(iAttacker), то не будет проверять, g_bIsFurrien[iAttacker] ли он.. вам ведь это не важно..
Написано же, если условие не сработает (Взорвать если нажато 1 или нажато 2, какой смысл проверять 2 если 1 нажато?).Если первое условие не сработает остальные проверяться не будут, хоть в одну строку, хоть в 3
zhorzh78, последующие условия будут проверяться только при условии выполнения предыдущих. Только не стоит забывать, что это логический оператор "ИЛИ", с оператором "И" уже другая картина.Хоть я и приверженец такой "теории", всё же я в этом не уверен. Если посудить с логической точки зрения, то условие, заключенное в скобках должно проверяться полностью, все условия по отдельности возвращают 1 или 0, суммируются, в итоге эта логическая сумма и будет проверяться: 13 Мар 2019
if(условие1 || условие2 || условие3) // Вкупе даст 1 или 0
Грубо говоря, преобразуется до:
if(1) {}
От представления true = 1, false = 1 я отошёл, так как тип переменной всё равно абстрактный по факту.
if(!is_user_connected(iAttacker) || g_bIsFurrien[iAttacker] || iVictim == iAttacker)
return;
!is_user_connected(iAttacker)
то делается return;
и дальше не идут проверки. Если не сработало, то проверяется следующее условие, если сработало то делается return;
и дальше не идёт проверка ну и так до последнего условия.