Доделать плагин со звуками

Сообщения
162
Реакции
4
Помог
3 раз(а)
Приветствую.Есть плагин который воспроизводит звуки при убийстве.Включается он по команде /sound.Нужно сделать чтобы плагин мог запомнить выбор игрока (желательно чтобы записывался в mysql).То есть чтобы не приходилось постоянно включать/отключать звуки.Сколько будет стоить переделать плагин я не знаю поэтому пишите цену сами.На всякий случай прикреплю исходник.
Код:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >

#define MAX_CLIENTS 32

#define m_LastHitGroup 75
#define m_bitsDamageType 76

#define m_pActiveItem 373

#define m_iId 43

new g_iKillCount[ MAX_CLIENTS +1 ];

new bool: g_bszFirstBlood;

new bool: g_bszSoundsEnable[ MAX_CLIENTS +1 char ];

new const SOUNDS_KILL[ ][ ] =
{
"soundkills/firstkill.wav",
"soundkills/doublekill.wav",
"soundkills/tripplekill.wav",
"soundkills/multikill.wav",
"soundkills/crazy.wav",
"soundkills/rampage.wav",
"soundkills/headshot.wav",
"soundkills/knife.wav",
"soundkills/grenade.wav"
};

public plugin_init( )
{
register_plugin( "", "", "" );

register_logevent( "LogEV_RoundStart", 2, "1=Round_Start" );

register_clcmd( "say /sounds", "Command_Sounds" );
register_clcmd( "say_team /sounds", "Command_Sounds" );

RegisterHam( Ham_Killed, "player", "CPlayer__Killed_Post", .Post = 1 );
}

public plugin_precache( )
{
for( new i = 0; i < sizeof SOUNDS_KILL; i++ )
engfunc( EngFunc_PrecacheSound, SOUNDS_KILL[ i ] );
}

public LogEV_RoundStart( )
{
g_bszFirstBlood = true;

for( new iPlayers = MAX_CLIENTS; iPlayers > 0; iPlayers-- )
g_iKillCount[ iPlayers ] = 0;
}

public Command_Sounds( iPlayer )
{
if( g_bszSoundsEnable{ iPlayer } )
{
g_bszSoundsEnable{ iPlayer } = false;

client_print( iPlayer, print_chat, "Звуки убийств отключены." );
}
else
{
g_bszSoundsEnable{ iPlayer } = true;

client_print( iPlayer, print_chat, "Звуки убийств включены." );
}

return PLUGIN_HANDLED;
}

public CPlayer__Killed_Post( iVictim, iAttacker, iGib )
{
if( iVictim == iAttacker || !is_user_connected( iAttacker ) )
return;

if( !g_bszSoundsEnable{ iAttacker } )
return;

new iBitsDamageType = get_pdata_int( iVictim, m_bitsDamageType );
new iLastHitGroup = get_pdata_int( iVictim, m_LastHitGroup );
new iActiveItem = get_pdata_cbase( iAttacker, m_pActiveItem );

if( pev_valid( iActiveItem ) != 2 )
return;

new iId = get_pdata_int( iActiveItem, m_iId, 4 );

g_iKillCount[ iAttacker ]++;

if( iLastHitGroup == HIT_HEAD )
{
if( g_bszFirstBlood )
{
client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 0 ] );

g_bszFirstBlood = false;
}
else
client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 6 ] );

return;
}

if( iId == CSW_KNIFE && iBitsDamageType & ( DMG_NEVERGIB | DMG_BULLET ) )
{
if( g_bszFirstBlood )
{
client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 0 ] );

g_bszFirstBlood = false;
}
else
client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 7 ] );

return;
}

if( ~iBitsDamageType & ( DMG_NEVERGIB | DMG_BULLET ) )
{
if( g_bszFirstBlood )
{
client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 0 ] );

g_bszFirstBlood = false;
}
else
client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 8 ] );

return;
}

if( g_bszFirstBlood )
{
client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 0 ] );

g_bszFirstBlood = false;
}
else
{
switch( g_iKillCount[ iAttacker ] )
{
case 2: client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 1 ] );
case 3: client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 2 ] );
case 4: client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 3 ] );
case 5: client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 4 ] );
case 6:
{
client_cmd( iAttacker, "spk %s", SOUNDS_KILL[ 5 ] );

g_iKillCount[ iAttacker ] = 5;
}
}
}
}

public client_putinserver( iPlayer )
{
g_bszSoundsEnable{ iPlayer } = true;

g_iKillCount[ iPlayer ] = 0;
}
 
Сообщения
37
Реакции
12
Лишний запрос в бд зачем? Может проще записывать в файл на сервер, по типу: "nick" "on\off" или "steamid" "on\off". Для записи в файл игрок должен хоть раз ввести /sound (чтобы не всех кто подключается записывало) :-)
 
  • Нравится
Реакции: ifx
Сообщения
162
Реакции
4
Помог
3 раз(а)
Лишний запрос в бд зачем? Может проще записывать в файл на сервер, по типу: "nick" "on\off" или "steamid" "on\off". Для записи в файл игрок должен хоть раз ввести /sound (чтобы не всех кто подключается записывало) :-)
просто боюсь нагрузка на сервер будет.
 
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
Последнее редактирование:
Сообщения
37
Реакции
12
wopox1337, приму во внимание, гляну ближе к 9 вечера, с ником покажу на проверку

P.S.: как я понимаю, согласен со мною по поводу хранения на самом сервере)
 
Последнее редактирование:

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Как вариант через setinfo запоминать выбор, примеров много.
 
Сообщения
37
Реакции
12
d3m37r4, setinfo запись клиенту в cfg, а он допустим only read, и что тогда? Такой вариант не подходит нынче....
 
Сообщения
258
Реакции
262
Помог
5 раз(а)
shram47, можно сделать через set_user_info. Настройка будет храниться для игрока всё время, пока он на сервере (и после смены карты тоже). А вот после повторного входа, да, придётся выбрать опцию заново. А если сюда ещё добавить и Trie, то можно избавиться и от проблемы сброса настройки при реконнекте.
 
Сообщения
3,025
Реакции
1,731
Помог
80 раз(а)
Когда составил ТЗ, но скриптер так и не написал )
  • Сделать проигрывание звуков при убийствах.
    Звуки по дефолту отключены для всех.
    Сделать доступ по флагу или всем. Выбрать можно в исходе или конфиге( как решишь )
    Как будут работать звуки? Сохраняться до смерти, или в каждом раунде заново ( дефайн ? :D )
    Сделать вызов меню:
    Командой в консоли ( sound)
    Командой в чате ( /sound на ум не приходит)
    В меню можно выбрать 2 типа звуков ( 2 пака )
    Сделать возможность в исхонике или в конфиге оставить для выбора один или другой тип пака голосов, ну и соответственно сразу 2 пака голосов.
    Тоесть например на 1 странице меню звуки одного типа ( из квейка ), на второй другого ( женский голос )
    Если возможно сделать выбор разных звуков из двух типов.
    Соответственно два одинаковых звука ( Megakill) из квейка и женский выбрать нельзя.
    Получается напротив звука пишется 1 или 0, тоесть звук включен или нет.
    МОжет игрок захочет себе поставить только 3 звука а не 10 :D
    Весь этот выбор сохраняется так же в меню этом же.
    Кнопка сохранения нужна только на второй странице или может на двух сделать? а количество звков в меню может не останется?)))
    Нужно ли сделать очищение настроек файла в nvault? Например сохраняется на 30 дней ( дефайн? :D ). Либо навсегда.
    Если звуки через меню можно изменить, то в файле nvault записывается заного или плагин будет искать и редактировать уже сохраненную настройку игрока?
  • Сделать по 8 звуков для каждого типа.
  • Первая страница 8 звуков
    цифра 9 - дальше
    цифра 0 - выход
    На второй странице 8 звуков
    цифра 9 СОХРА/НИТЬ ВЫБОР
    Цифра 0 выход
 
Сообщения
37
Реакции
12
Subb98, тоже верно, но видишь ли, он хочет сохранять на больший срок, может проще выдавать flag и забирать xD(шучу) Ну кроме как сделать выводом в бд, я ничего и не надумал, но все варианты предложенные хороши, но и также везде нюансы... В файл если записывать, то нельзя допускать больше 500 записей, имхо скажется на сервере. Записывать setinfo - идея хорошая, а не будет блокировать *.cfg -> Только чтение ?
Алексеич, не совсем понял - это чьё тех.задание ? О_о
 
Сообщения
162
Реакции
4
Помог
3 раз(а)
Когда составил ТЗ, но скриптер так и не написал )
  • Сделать проигрывание звуков при убийствах.
    Звуки по дефолту отключены для всех.
    Сделать доступ по флагу или всем. Выбрать можно в исходе или конфиге( как решишь )
    Как будут работать звуки? Сохраняться до смерти, или в каждом раунде заново ( дефайн ? :D )
    Сделать вызов меню:
    Командой в консоли ( sound)
    Командой в чате ( /sound на ум не приходит)
    В меню можно выбрать 2 типа звуков ( 2 пака )
    Сделать возможность в исхонике или в конфиге оставить для выбора один или другой тип пака голосов, ну и соответственно сразу 2 пака голосов.
    Тоесть например на 1 странице меню звуки одного типа ( из квейка ), на второй другого ( женский голос )
    Если возможно сделать выбор разных звуков из двух типов.
    Соответственно два одинаковых звука ( Megakill) из квейка и женский выбрать нельзя.
    Получается напротив звука пишется 1 или 0, тоесть звук включен или нет.
    МОжет игрок захочет себе поставить только 3 звука а не 10 :D
    Весь этот выбор сохраняется так же в меню этом же.
    Кнопка сохранения нужна только на второй странице или может на двух сделать? а количество звков в меню может не останется?)))
    Нужно ли сделать очищение настроек файла в nvault? Например сохраняется на 30 дней ( дефайн? :D ). Либо навсегда.
    Если звуки через меню можно изменить, то в файле nvault записывается заного или плагин будет искать и редактировать уже сохраненную настройку игрока?
  • Сделать по 8 звуков для каждого типа.
  • Первая страница 8 звуков
    цифра 9 - дальше
    цифра 0 - выход
    На второй странице 8 звуков
    цифра 9 СОХРА/НИТЬ ВЫБОР
    Цифра 0 выход
Ну это чё то уже борщ))
 
Сообщения
3,025
Реакции
1,731
Помог
80 раз(а)
Dmitriy Korolev, ну это так, размышления были) я думаю можно и уменьшить немного пункты )
так хотели игроки)
 
Сообщения
258
Реакции
262
Помог
5 раз(а)
Ну кроме как сделать выводом в бд, я ничего и не надумал
БД - самый лучший вариант, если надо что-то хранить массово (для каждого игрока) и долго / постоянно. Но к этому вопросу тогда нужно подходить грамотно, проектировать БД так, чтобы: а) не плодить лишние columns (столбцы); б) сохранять целостность данных (foreign key, on delete cascade on update cascade).

Записывать setinfo - идея хорошая, а не будет блокировать *.cfg -> Только чтение ?
Если использовать set_user_info, а не client_cmd / аналоги, то никаких блокировок не будет. Данная функция выполняется на сервере и не затрагивает клиент.
 
Последнее редактирование:
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
он хочет сохранять на больший срок
Я ведь уже предложил выше NVault
В файл если записывать, то нельзя допускать больше 500 записей, имхо скажется на сервере.
И автоочистку по времени не активных игроков то же предложил.
Реализацию можно подсмотреть в плагине VIP Environment by Vaqtincha
 
Сообщения
162
Реакции
4
Помог
3 раз(а)
shram47, как будет готово дайте знать тогда.и отпишите пожалуйста в лс сколько будет стоить.
 
Сообщения
37
Реакции
12
Dmitriy Korolev, 1. Бесплатно, ибо для меня это тренинг ;-) Сделаю, проверю на сервере и сюда уже отпишу.
1 Июл 2017
Подумал, присмотрелся к тз, и всё же думаю сделать с использованием БД.
Записывать в БД name (ник), ip, и активность /sound
Т.е. name, ip, active (1 включён соунд, 0 выкл.) - далее делать проверку, но вопрос по правильной проверке, делать по подключению игрока проверку? Но тогда при смене карты 32 слота будет не слабый запросик в БД... или делать по примеру статистики? Допустим в бд статистики добавить значение активации\дизактивации звука и лишней бд подключений не потребуется, просто брать из конфига статы подключение к бд... ;-)
1 Июл 2017
wopox1337,Subb98, что скажешь?
 
Сообщения
258
Реакции
262
Помог
5 раз(а)
shram47, для чего name, ip? Почему не обойтись authid? Если только из-за протекторов, где authid динамический, то я считаю это проблемой клиентов, которые используют такие протекторы. И для игроков это будет ещё одна причина отказаться от использования протекторов с такой функцией.

Касаемо запроса к БД. Асинхронные запросы для того и существуют, чтобы подобные обстоятельства, когда разом к БД отправляется много запросов, не были критичными. Поэтому не думаю, что это стоит кэшировать.
 
Сообщения
37
Реакции
12
Subb98, сейчас попробую через setinfo xD.... не пользовался ранее ей...
2 Июл 2017
Subb98, wopox1337, ну вот к примеру брал плагин Sho0ter'а
C++:
new g_checkKillsinf[33][32]
new logdate[64], logfile[64]

C++:
public plugin_init()
{
// всяко всяко //
register_cvar("amx_kills_log", "1")
register_clcmd("say /sounds", "cmd_killson")
register_clcmd("say /sounds", "cmd_killsoff")
}

C++:
public plugin_precache()
{
get_time("20%y.%m.%d", logdate, 63)
formatex(logfile, 63, "killsounds_%s.log", logdate)

C++:
public cmd_killson(id)
{
client_cmd(id, "setinfo kills ON")
g_checkKillsinf[id]= "ON"
client_cmd(id, "spk vox/activated")
client_print( iPlayer, print_chat, "Звуки убийств отключены." );
if(get_cvar_num("amx_kills_log") == 1)
{
new map[32]
get_mapname(map, 31)
new name[32]
get_user_name(id, name, 31)
get_time("20%y.%m.%d", logdate, 63)
formatex(logfile, 63, "killsounds_%s.log", logdate)
log_to_file(logfile, "[KILLS SPK ON] [%s] [%s]", name, map)
}
return PLUGIN_CONTINUE
}


public cmd_killsoff(id)
{
client_cmd(id, "setinfo kills OFF")
g_checkKillsinf[id]= "OFF"
client_cmd(id, "spk vox/deactivated")
if(get_cvar_num("amx_kills_log") == 1)
{
new map[32]
get_mapname(map, 31)
new name[32]
get_user_name(id, name, 31)
get_time("20%y.%m.%d", logdate, 63)
formatex(logfile, 63, "killsounds_%s.log", logdate)
log_to_file(logfile, "[KILLSOUNDS SPK OFF] [%s] [%s]", name, map)
}
return PLUGIN_CONTINUE
}


Так нормально? ;-)
 

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

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