Damage-Roulette

Damage-Roulette 1.3.1

Нет прав для скачивания
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
wellasgood добавил(а) новый ресурс:

Damage-Roulette - Разыгрывание (в виде рулетки) увеличенного дамага, при старте нового раунда среди игроков.

Плагин - "Damage-Roulette" // Rus: "Урон-Рулетка"

Суть плагина в том, что каждый раунд выполняется розыгрыш (в виде рулетки) на увеличенный урон одному игроку из всех играющих. Все красиво оформлено (так же звуковое оформление), присутствует гибкая настройка всего функционала. Плагин больше подходит для Public и Knife модов, но можно пробовать и на других тоже. Удачи!
Узнать больше об этом ресурсе...
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Замечания по коду:

1)

В plugin_init() следующий код вызывается до регистрации плагина, а должен после, так как иначе в списке плагинов не будет отображаться правильная информация о плагине.

Код:
    // Отключаем не нужные карты (на картах, начинающихся на эти префиксы, не будет работать плагин (если не нужно, то '//' строки))
    new mapname[MAX_PLAYERS];
    get_mapname(mapname, charsmax(mapname));
    new maps[][] = { "$", "awp", "fy" };
    for(new i; i < sizeof maps; i++){
        if(containi(mapname, maps[i]) != -1){
            pause("ad");
            return;
        }
    }
Относительно этого кода. Во-первых, почему у массива mapname длина MAX_PLAYERS? MAX_PLAYERS - дефайн который означает максимальное количество возможных игроков в игре. Для длины карты есть свой дефайн: MAX_MAPNAME_LENGTH

Тут также ещё лучше заменить awp и fy на awp_ и fy_ соответственно.





2)

Далее, регистрация кваров. Так как поддержка AMXX 1.9.0 и выше, то стоит уже забыть про register_cvar и использовать create_cvar + bind_pcvar_* нативы.

Пример:

Код:
-DMG_PLAYERS = register_cvar("dmg_players", "2");
+DMG_PLAYERS = create_cvar("dmg_players", "2", FCVAR_NONE, "Minimum players", true, 0.0, true, 32.0);
Я упомянул про bind_pcvar_*, если использовать данные нативы то отпадает нужда в получении поинтера на квары, соответственно больше использовать get_pcvar_* не придётся.





3)

Код:
for(new i = 0; i < sizeof(g_short); i++)
-g_shortSpr[i] = precache_model(g_short[i]);
+    g_shortSpr[i] = precache_model(g_short[i]);




4)

Ни у одного таска нет нормального названия, только непонятная цифра, это плохо.





5)

Код:
-SendAudio(0, fmt("sound/%s", SND_MR));
+SendAudio(0, SND_MR);




6)

Код:
new g_Name[MAX_PLAYERS];
get_user_name(g_Num, g_Name, MAX_PLAYERS-1)
Во-первых, точно так же как и с картой, почему тут MAX_PLAYERS? Для ника есть MAX_NAME_LENGTH, однако так как поддержка AMXX 1.9.0 и выше то ник вообще не нужно получать.

Пример как должно быть если бы была поддержка ниже AMXX 1.9.0:
Код:
new szName[MAX_NAME_LENGTH];
get_user_name(id, szName, charsmax(szName));
client_print_color(id, id, "^4* ^1Your name: ^3%s", szName);
Пример как должно быть если поддержка AMXX 1.9.0 или выше:
Код:
client_print_color(id, id, "^4* ^1Your name: ^3%n", id);




7)

Код:
for(new i = 1; i <= g_PlayersMax; i++)
{
    if(i != g_Num){
        // Конечный худ с инфой по поводу разыгрывания дамага среди игроков
        set_dhudmessage(random_num(50,255), random_num(50,255), random_num(50,255), -1.0, 0.60, 2, 0.4, 0.4, 0.1, get_pcvar_float(DMG_SCROLL_HUD2));
        show_dhudmessage(i, "%L", i, "DMG_HUD_STOP", g_Name);
    }
}
В данном коде нет проверок на валидность игроков. В идеале, нужно использовать get_players_ex
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
w0w, спасибо за критику, но я пока не особо знаю все фичи 1.9.0 (функции по типу bind_pcvar и тд), сделал так сказать как смог, по своим знаниям. А 1.8.2 не поддерживаю) Я стал против. Буду смотреть .inc 1.9.0)

А так, в след. версиях данного творения, буду учитывать твои замечания.
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
Мои 5 копеек:
Код:
--for(new i = 0; i < sizeof(g_short); i++)
++for(new i = 0; i < sizeof g_short; i++)
sizeof не функция, и не макрос (как в случае charsmax). Скобки не нужны.
Да, ни на что не влияет, но, хороший код это также чистый и правильный код.
 
Сообщения
141
Реакции
201
Помог
5 раз(а)
Мои 5 копеек:
Код:
--for(new i = 0; i < sizeof(g_short); i++)
++for(new i = 0; i < sizeof g_short; i++)
sizeof не функция, и не макрос (как в случае charsmax). Скобки не нужны.
Да, ни на что не влияет, но, хороший код это также чистый и правильный код.
зачем ты это написал?
 
Сообщения
271
Реакции
347
Помог
15 раз(а)
Можно использовать "псевдо структуры" енумы.
 
Сообщения
327
Реакции
289
Помог
9 раз(а)
C++:
//Все подключенные
    g_PlayersMax = get_playersnum()

    //Вычесляем рандом игрока (среди всех подключенных)
    g_Num = random_num(1,g_PlayersMax)
Похоже на лохотрон :smile3:
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
zhenja29, потому что ид игроков будут идти не по очереди (например 1, 4, 12), и рандом может выпасть на 2 из 3 игроков. Также хлтв не учтен
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
fantom, всм? я там определяю макс количество игроков, далее из этого количества выбираем 1 айди, каждый раунд цифра же меняется. Так что все норм.
27 Июл 2019
Так что можно использовать, как хороший способ. Да можно было по другому, но это мне показалось. самым простым вычислением рандом игрока из всех играющих.
27 Июл 2019
И потом, если про то, что Вы говорите, на 2 из 3 всегда выпадать будет, есть специальная настройка:

DMG_PLAYERS = register_cvar("dmg_players", "2"); //Кол-во игроков, после набора которых будет запуск всего функционала. (если меньше, то ошибка-инфо).
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
зачем ты это написал?
А что не так?
Возможно, человек ошибочно думал, что sizeof это функция/макрос. sizeof оператор.
Я дал ему дополнительные, правильные знания. "А чего добился ты?" (с)
 
Сообщения
141
Реакции
201
Помог
5 раз(а)
А что не так?
Возможно, человек ошибочно думал, что sizeof это функция/макрос. sizeof оператор.
Я дал ему дополнительные, правильные знания. "А чего добился ты?" (с)
Вы игнорируете публикации этого пользователя. Показать игнорируемые публикации ?

всм? я там определяю макс количество игроков, далее из этого количества выбираем 1 айди, каждый раунд цифра же меняется. Так что все норм.
не норм, игрок может занимать 16-ый слот, (id 16 по твоим представлениям)
а get_playersnum() , допустим, вернет 3 (играет 3 игрока)
дальше сам думай что у тебя ломается)) (починить можно с get_players)
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Замечания по коду:

1)

В plugin_init() следующий код вызывается до регистрации плагина, а должен после, так как иначе в списке плагинов не будет отображаться правильная информация о плагине.

Код:
    // Отключаем не нужные карты (на картах, начинающихся на эти префиксы, не будет работать плагин (если не нужно, то '//' строки))
    new mapname[MAX_PLAYERS];
    get_mapname(mapname, charsmax(mapname));
    new maps[][] = { "$", "awp", "fy" };
    for(new i; i < sizeof maps; i++){
        if(containi(mapname, maps[i]) != -1){
            pause("ad");
            return;
        }
    }
Относительно этого кода. Во-первых, почему у массива mapname длина MAX_PLAYERS? MAX_PLAYERS - дефайн который означает максимальное количество возможных игроков в игре. Для длины карты есть свой дефайн: MAX_MAPNAME_LENGTH

Тут также ещё лучше заменить awp и fy на awp_ и fy_ соответственно.





2)

Далее, регистрация кваров. Так как поддержка AMXX 1.9.0 и выше, то стоит уже забыть про register_cvar и использовать create_cvar + bind_pcvar_* нативы.

Пример:

Код:
-DMG_PLAYERS = register_cvar("dmg_players", "2");
+DMG_PLAYERS = create_cvar("dmg_players", "2", FCVAR_NONE, "Minimum players", true, 0.0, true, 32.0);
Я упомянул про bind_pcvar_*, если использовать данные нативы то отпадает нужда в получении поинтера на квары, соответственно больше использовать get_pcvar_* не придётся.





3)

Код:
for(new i = 0; i < sizeof(g_short); i++)
-g_shortSpr[i] = precache_model(g_short[i]);
+    g_shortSpr[i] = precache_model(g_short[i]);




4)

Ни у одного таска нет нормального названия, только непонятная цифра, это плохо.





5)

Код:
-SendAudio(0, fmt("sound/%s", SND_MR));
+SendAudio(0, SND_MR);




6)

Код:
new g_Name[MAX_PLAYERS];
get_user_name(g_Num, g_Name, MAX_PLAYERS-1)
Во-первых, точно так же как и с картой, почему тут MAX_PLAYERS? Для ника есть MAX_NAME_LENGTH, однако так как поддержка AMXX 1.9.0 и выше то ник вообще не нужно получать.

Пример как должно быть если бы была поддержка ниже AMXX 1.9.0:
Код:
new szName[MAX_NAME_LENGTH];
get_user_name(id, szName, charsmax(szName));
client_print_color(id, id, "^4* ^1Your name: ^3%s", szName);
Пример как должно быть если поддержка AMXX 1.9.0 или выше:
Код:
client_print_color(id, id, "^4* ^1Your name: ^3%n", id);




7)

Код:
for(new i = 1; i <= g_PlayersMax; i++)
{
    if(i != g_Num){
        // Конечный худ с инфой по поводу разыгрывания дамага среди игроков
        set_dhudmessage(random_num(50,255), random_num(50,255), random_num(50,255), -1.0, 0.60, 2, 0.4, 0.4, 0.1, get_pcvar_float(DMG_SCROLL_HUD2));
        show_dhudmessage(i, "%L", i, "DMG_HUD_STOP", g_Name);
    }
}
В данном коде нет проверок на валидность игроков. В идеале, нужно использовать get_players_ex
Доброй ночи, в ходе проверки, выявлено, что подстановка new mapname[MAX_MAPNAME_LENGTH ]; вместо new mapname[MAX_PLAYERS]; при компиляции на Amxx 1.9.0 выдает варнинги.

//// Damage-Roulette.sma
//
// C:\Users\\Desktop\└ъЄры№эюх\amxmodx-1.9.0-git5241-windows\addons\amxmodx\scripting\Damage-Roulette.sma(101) : error 017: undefined symbol "MAX_MAPNAME_LENGTH"
// C:\Users\\Desktop\└ъЄры№эюх\amxmodx-1.9.0-git5241-windows\addons\amxmodx\scripting\Damage-Roulette.sma(101) : error 009: invalid array size (negative or zero)
// C:\Users\\Desktop\└ъЄры№эюх\amxmodx-1.9.0-git5241-windows\addons\amxmodx\scripting\Damage-Roulette.sma(101) : error 036: empty statement
// C:\Users\\Desktop\└ъЄры№эюх\amxmodx-1.9.0-git5241-windows\addons\amxmodx\scripting\Damage-Roulette.sma(101) : fatal error 107: too many error messages on one line
//
// Compilation aborted.
// 4 Errors.
// Could not locate output file compiled\Damage-Roulette.amx (compile failed).
//
// Compilation Time: 0,56 sec
// --------------------------------
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
wellasgood, забыл что дефайн добавили на AMXX 1.10.0. Надо так:

Код:
#if !defined MAX_MAPNAME_LENGTH
    #define MAX_MAPNAME_LENGTH 64
#endif
 
Сообщения
1,408
Реакции
182
Помог
2 раз(а)
Код:
+SendAudio(0, SND_MR);
тоже выдает ошибку:

//// Damage-Roulette.sma
//
// C:\Users\\Desktop\└ъЄры№эюх\amxmodx-1.9.0-git5241-windows\addons\amxmodx\scripting\Damage-Roulette.sma(220) : error 035: argument type mismatch (argument 2)
// C:\Users\\Desktop\└ъЄры№эюх\amxmodx-1.9.0-git5241-windows\addons\amxmodx\scripting\Damage-Roulette.sma(268) : error 035: argument type mismatch (argument 2)
//
// 2 Errors.
// Could not locate output file compiled\Damage-Roulette.amx (compile failed).
//
// Compilation Time: 0,61 sec
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
wellasgood,
new const SND_RT[] = "damage-roulette/rt.wav";

В функции куда передаётся звук не const.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу