Killstreak Announcer

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
Накидал по-быстрому под себя самый простой Killstreak Announcer. Хотелось бы услышать совета опытных скриптеров, что можно было бы улучшить.
Код:
#include <amxmodx>
#include <reapi>

#define VERSION "0.1"

new g_Kills[MAX_PLAYERS + 1];

public plugin_init()
{
    register_plugin("KillStreakAnnouncer", VERSION, "Nordic Warrior");

    RegisterHookChain(RG_CSGameRules_PlayerKilled, "PlayerKilled", 1);
}

public plugin_precache()
{
    precache_sound("sky/dominating.wav");
    precache_sound("sky/megakill.wav");
    precache_sound("sky/unstopable.wav");
    precache_sound("sky/rampage.wav");
    precache_sound("sky/mosnterkill.wav");
    precache_sound("sky/lidacriskill.wav");
    precache_sound("sky/wickedsick.wav");
    precache_sound("sky/holyshit.wav");
    precache_sound("sky/godlike.wav");
}

public PlayerKilled(victim, killer)
{
    g_Kills[killer]++;
    g_Kills[victim] = 0;

    set_hudmessage(80, 160, 255, 0.85, 0.45, 1, 0.0, 3.0, 0.1, 0.2, -1);

    switch(g_Kills[killer])
    {
        case 5:
        {
            rg_send_audio(0, "sky/dominating.wav");
            show_hudmessage(0, "%n делает комбо 5!", killer);
        }
        case 8:
        {
            rg_send_audio(0, "sky/megakill.wav")
            show_hudmessage(0, "%n делает комбо 8!", killer);
        }
        case 10:
        {
            rg_send_audio(0, "sky/unstopable.wav")
            show_hudmessage(0, "%n делает комбо 10!", killer);
        }
        case 13:
        {
            rg_send_audio(0, "sky/rampage.wav")
            show_hudmessage(0, "%n делает комбо 13!", killer);
        }
        case 15:
        {
            rg_send_audio(0, "sky/mosnterkill.wav")
            show_hudmessage(0, "%n делает комбо 15!", killer);
        }
        case 17:
        {
            rg_send_audio(0, "sky/lidacriskill.wav")
            show_hudmessage(0, "%n делает комбо 17!", killer);
        }
        case 20:
        {
            rg_send_audio(0, "sky/wickedsick.wav")
            show_hudmessage(0, "%n делает комбо 20!", killer);
        }
        case 23:
        {
            rg_send_audio(0, "sky/holyshit.wav")
            show_hudmessage(0, "%n делает комбо 23!", killer);
        }
        case 25:
        {
            rg_send_audio(0, "sky/godlike.wav")
            show_hudmessage(0, "%n делает комбо 25!", killer);
        }
    }
}
 
Сообщения
285
Реакции
251
Помог
7 раз(а)
Проверка на суицид, проверка ффа, проверка на коннект убийцы, использовать ShowSyncHudMsg ибо сейчас у тебя мессаги тупо накладываются друг на друга, обнуление киллов в начале раунда.

Ах, блин. Надо было мнение опытных скриптеров.
 
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
Jumper, про синкХуд и проверку на суицид думал, остальное не понадобится, т.к. у меня кнф дм. Спасибо
11 Янв 2019
Jumper, мб глупый вопрос, но в каком случае понадобится проверка на коннект убийцы?
если даже чел выйдет из кс без дисконнекта, и будет еще висеть на серве, то он никак никого не сможет убить
 
Сообщения
271
Реакции
347
Помог
15 раз(а)
sbelov020, убийцей может быть не только игрок
 
Последнее редактирование:
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
Denzer, понял, спасибо.

Jumper, ну что-то вроде того получилось. Сойдет?
Код:
#include <amxmodx>
#include <reapi>

#define VERSION "0.2"

new g_KillsCounter[MAX_PLAYERS + 1], g_SyncHud;

public plugin_init()
{
    register_plugin("KillStreakAnnouncer", VERSION, "Nordic Warrior");

    RegisterHookChain(RG_CSGameRules_PlayerKilled, "PlayerKilled", 1);
    
    g_SyncHud = CreateHudSyncObj();
}

public plugin_precache()
{
    precache_sound("sky/dominating.wav");
    precache_sound("sky/megakill.wav");
    precache_sound("sky/unstopable.wav");
    precache_sound("sky/rampage.wav");
    precache_sound("sky/mosnterkill.wav");
    precache_sound("sky/lidacriskill.wav");
    precache_sound("sky/wickedsick.wav");
    precache_sound("sky/holyshit.wav");
    precache_sound("sky/godlike.wav");
}

public client_putinserver(id)
    g_KillsCounter[id] = 0;

public PlayerKilled(victim, killer)
{
    if(!is_user_connected(killer))
        return;
    
    if(killer != victim)
        g_KillsCounter[killer]++;

    g_KillsCounter[victim] = 0;

    set_hudmessage(80, 160, 255, 0.85, 0.45, 1, 0.0, 3.0, 0.1, 0.2, -1);

    switch(g_KillsCounter[killer])
    {
        case 5:
        {
            rg_send_audio(0, "sky/dominating.wav");
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 5!", killer);
        }
        case 8:
        {
            rg_send_audio(0, "sky/megakill.wav")
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 8!", killer);
        }
        case 10:
        {
            rg_send_audio(0, "sky/unstopable.wav")
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 10!", killer);
        }
        case 13:
        {
            rg_send_audio(0, "sky/rampage.wav")
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 13!", killer);
        }
        case 15:
        {
            rg_send_audio(0, "sky/mosnterkill.wav")
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 15!", killer);
        }
        case 17:
        {
            rg_send_audio(0, "sky/lidacriskill.wav")
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 17!", killer);
        }
        case 20:
        {
            rg_send_audio(0, "sky/wickedsick.wav")
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 20!", killer);
        }
        case 23:
        {
            rg_send_audio(0, "sky/holyshit.wav")
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 23!", killer);
        }
        case 25:
        {
            rg_send_audio(0, "sky/godlike.wav")
            ShowSyncHudMsg(0, g_SyncHud, "%n делает комбо 25!", killer);
        }
    }
}
 
Сообщения
271
Реакции
347
Помог
15 раз(а)
sbelov020,
1. killer == victim и !victim - разные вещи, надо их тоже учитывать
2. Почему не пользуешься массивом?
3. g_KillsCounter[victim] = 0; как костыль получается (чтобы при суициде свитч не вызывался) или это для того чтобы сбрасывать серию убийств? Если да, то тогда лучше сбрасывать при спавне думаю.
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Код:
#include <amxmodx>
#include <reapi>


enum _:Sound {
    KillsCount,
    SoundPath[32]
}

new const SOUNDS[][Sound] = {
    { 5, "sky/dominating.wav" },
    { 8, "sky/megakill.wav" },
    { 10, "sky/unstopable.wav" },
    { 13, "sky/rampage.wav" },
    { 15, "sky/mosnterkill.wav" },
    { 17, "sky/lidacriskill.wav" },
    { 20, "sky/wickedsick.wav" },
    { 23, "sky/holyshit.wav" },
    { 25, "sky/godlike.wav" }
};

new SyncHud, KillsCounter[MAX_PLAYERS + 1];

public plugin_precache() {
    for (new i = 0; i < sizeof SOUNDS; i++) {
        precache_sound(SOUNDS[i][SoundPath]);
    }
}

public plugin_init() {
    RegisterHookChain(RG_CSGameRules_PlayerKilled, "CSGameRules_PlayerKilled_Post", true);
    SyncHud = CreateHudSyncObj();
}

public client_putinserver(id) {
    KillsCounter[id] = 0;
}

public CSGameRules_PlayerKilled_Post(victim, killer) {
    KillsCounter[victim] = 0;
    if (!is_user_connected(killer) || killer == victim) {
        return;
    }
    
    KillsCounter[killer]++;
    
    new sound = getSound(KillsCounter[victim]);
    if (sound == -1) {
        return;
    }
    
    rg_send_audio(0, SOUNDS[sound][SoundPath]);
    set_hudmessage(80, 160, 255, 0.85, 0.45, 1, 0.0, 3.0, 0.1, 0.2, -1);
    ShowSyncHudMsg(0, SyncHud, "%n делает комбо %i!", killer, KillsCounter[killer]);
}

getSound(const kills) {
    for (new i = 0; i < sizeof SOUNDS; i++) {
        if (SOUNDS[i][KillsCount] == kills) {
            return i;
        }
    }
    
    return -1;
}
 
  • Нравится
Реакции: ifx
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
Denzer, 1. у меня !=. 2. Пока не догнал как сделать, вот сейчас fantom показал вариант, плюс у меня был вариант от w0w, сейчас переделаю. Да и код писался за 10 мин на коленке, тогда не было времени.
3. Да, это для сброса серии убийств.

fantom, спасибо, интересный вариант. А что значит sound == -1?
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
sbelov020, звук для такого количества убийств не найден
 
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
звук для такого количества убийств не найден
понял.

Сейчас проверил код на локальном сервере. Не работает. Ошибок нет, просто не воспроизводит звук и нет худа
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
sbelov020,
Код:
- new sound = getSound(KillsCounter[victim]);
+ new sound = getSound(KillsCounter[killer]);
 
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
fantom, теперь отлично, благодарю.

Конечный код:
Код:
/* Thanks to F@nt0M */

#include <amxmodx>
#include <reapi>

#define VERSION "0.3"

#pragma semicolon 1

enum _:Sound
{
    KillsCount,
    SoundPath[MAX_PLAYERS]
}

new const SOUNDS[][Sound] = {
    { 7, "sky/dominating.wav" },
    { 10, "sky/megakill.wav" },
    { 12, "sky/unstopable.wav" },
    { 15, "sky/rampage.wav" },
    { 17, "sky/mosnterkill.wav" },
    { 20, "sky/lidacriskill.wav" },
    { 22, "sky/wickedsick.wav" },
    { 25, "sky/holyshit.wav" },
    { 30, "sky/godlike.wav" }
};

new SyncHud, KillsCounter[MAX_PLAYERS + 1];

public plugin_init()
{
    register_plugin("KillStreakAnnouncer", VERSION, "Nordic Warrior");

    RegisterHookChain(RG_CSGameRules_PlayerKilled, "CSGameRules_PlayerKilled_Post", true);
    SyncHud = CreateHudSyncObj();
}

public plugin_precache()
{
    for(new i = 0; i < sizeof SOUNDS; i++)
        precache_sound(SOUNDS[i][SoundPath]);
}

public client_putinserver(id)
    KillsCounter[id] = 0;

public CSGameRules_PlayerKilled_Post(victim, killer)
{
    KillsCounter[victim] = 0;

    if(!is_user_connected(killer) || killer == victim)
        return;

    KillsCounter[killer]++;

    new sound = getSound(KillsCounter[killer]);
    if(sound == -1)
        return;

    rg_send_audio(0, SOUNDS[sound][SoundPath]);

    set_hudmessage(80, 160, 255, 0.85, 0.45, 1, 0.0, 3.0, 0.1, 0.2);
    ShowSyncHudMsg(0, SyncHud, "%n делает комбо %i!", killer, KillsCounter[killer]);
}

getSound(const kills)
{
    for(new i = 0; i < sizeof SOUNDS; i++)
    {
        if(SOUNDS[i][KillsCount] == kills)
            return i;
    }
    return -1;
}

Не совсем понимаю, какую роль тут играет SoundPath ?
 
Сообщения
3,256
Реакции
1,436
Помог
121 раз(а)
fantom, была такая догадка, спасибо.
Если ни у кого не найдется замечаний, тему можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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