Killstreak Announcer

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
647
Реакции
150
Накидал по-быстрому под себя самый простой 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);
        }
    }
}
 
Сообщения
122
Реакции
111
Проверка на суицид, проверка ффа, проверка на коннект убийцы, использовать ShowSyncHudMsg ибо сейчас у тебя мессаги тупо накладываются друг на друга, обнуление киллов в начале раунда.

Ах, блин. Надо было мнение опытных скриптеров.
 
Сообщения
647
Реакции
150
Jumper, про синкХуд и проверку на суицид думал, остальное не понадобится, т.к. у меня кнф дм. Спасибо
11 Янв 2019
Jumper, мб глупый вопрос, но в каком случае понадобится проверка на коннект убийцы?
если даже чел выйдет из кс без дисконнекта, и будет еще висеть на серве, то он никак никого не сможет убить
 
Сообщения
99
Реакции
132
sbelov020, убийцей может быть не только игрок
 
Последнее редактирование:
Сообщения
647
Реакции
150
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);
        }
    }
}
 
Сообщения
99
Реакции
132
sbelov020,
1. killer == victim и !victim - разные вещи, надо их тоже учитывать
2. Почему не пользуешься массивом?
3. g_KillsCounter[victim] = 0; как костыль получается (чтобы при суициде свитч не вызывался) или это для того чтобы сбрасывать серию убийств? Если да, то тогда лучше сбрасывать при спавне думаю.
 
Сообщения
1.582
Реакции
1.709
Код:
#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
Сообщения
647
Реакции
150
Denzer, 1. у меня !=. 2. Пока не догнал как сделать, вот сейчас fantom показал вариант, плюс у меня был вариант от w0w, сейчас переделаю. Да и код писался за 10 мин на коленке, тогда не было времени.
3. Да, это для сброса серии убийств.

fantom, спасибо, интересный вариант. А что значит sound == -1?
 
Сообщения
1.582
Реакции
1.709
sbelov020, звук для такого количества убийств не найден
 
Сообщения
1.582
Реакции
1.709
sbelov020,
Код:
- new sound = getSound(KillsCounter[victim]);
+ new sound = getSound(KillsCounter[killer]);
 
Сообщения
647
Реакции
150
fantom, теперь отлично, благодарю.

Конечный код:
Код:
/* Thanks to [email protected] */

#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 ?
 
Сообщения
647
Реакции
150
fantom, была такая догадка, спасибо.
Если ни у кого не найдется замечаний, тему можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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