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

Сообщения
37
Реакции
12
Позже уже со звуком поиграюсь...

C++:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define SAVE
#if defined(SAVE)
#include <nvault>
#define FILE_NAME "kills"
#define SAVE_TYPE 1
#define AUTORESET
#define AUTORESET_DAYS 30
new g_nVault;
#endif

#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];

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 );

#if defined(SAVE)
g_nVault = nvault_open(FILE_NAME);

#if defined(AUTORESET)
nvault_prune(g_nVault, 0, get_systime() - (86400 * AUTORESET_DAYS));
#endif
#endif
}

#if defined(SAVE)
public plugin_end()
nvault_close(g_nVault);

save_data(id)
{
new trackid[64];

if (!get_trackid(id, trackid, charsmax(trackid)))
return 0;

new value[2];
formatex(value, charsmax(value), "%d", g_bszSoundsEnable[id] ? 1 : 2);
nvault_set(g_nVault, trackid, value);

return 1;
}

#if AMXX_VERSION_NUM >= 183 && SAVE_TYPE == 2
load_data(id, const trackid[])
#else
load_data(id)
#endif
{
#if AMXX_VERSION_NUM >= 183 && SAVE_TYPE == 2
if (!authid_is_valid(trackid))
return 0;
#else
new trackid[72];

if (!get_trackid(id, trackid, charsmax(trackid)))
return 0;
#endif

new nResult = nvault_get(g_nVault, trackid);

if (!nResult)
return 0;

#if defined(AUTORESET)
nvault_touch(g_nVault, trackid, -1);
#endif

g_bszSoundsEnable[id] = nResult == 1 ? true : false;

return 1;
}

get_trackid(id, trackid[], len)
{
#if SAVE_TYPE == 1
get_user_name(id, trackid, len);
/* #elseif AMXX_VERSION_NUM >= 183 && SAVE_TYPE == 2
get_user_authid(id, trackid, len);
if (!authid_is_valid(trackid))
return 0;
#elseif SAVE_TYPE == 3
get_user_ip(id, trackid, len, 1); */
#endif
return 1;
}

#if AMXX_VERSION_NUM >= 183 && SAVE_TYPE == 2
authid_is_valid(const authid[])
{
if (!strcmp(authid, "STEAM_ID_LAN") || !strcmp(authid, "VALVE_ID_LAN"))
return 0;

return 1;
}
#endif
#endif

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, "Звуки убийств включены." );
}

#if defined(SAVE)
save_data(iPlayer);
#endif

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;
}
}
}
}

#if defined(SAVE)
#if AMXX_VERSION_NUM >= 183 && SAVE_TYPE == 2
public client_authorized(iPlayer, const authid[])
#else
public client_authorized(iPlayer)
#endif
{
#if AMXX_VERSION_NUM >= 183 && SAVE_TYPE == 2
if (!load_data(iPlayer, authid))
#else
if (!load_data(iPlayer))
#endif
g_bszSoundsEnable[iPlayer] = true;

g_iKillCount[ iPlayer ] = 0;
}
#else
public client_authorized(iPlayer)
{
g_bszSoundsEnable[iPlayer] = true;
g_iKillCount[ iPlayer ] = 0;
}
#endif


shram47, так как с компиляцией быть?
2 Июл 2017
wopox1337, Subb98, P.S. : И тут я понял, что 1.8.3 и 1.8.2 Имеют всё больше и больше отличий :dntknw: чем заменить authid проверку?:sorry:
 

Вложения

  • 5.7 KB Просмотры: 33
Сообщения
162
Реакции
4
Помог
3 раз(а)
shram47, я не увидел ваше сообщение сначала:)звуки почему то не воспроизводит.
 
Сообщения
29
Реакции
62
Совершенно случайно сюда забрел
shram47, уважаемый, когда берете готовый чужой код, хоть комментарии не удаляйте. Как человек ничего не понимающий, должен разобраться с настройками?
Макросов много из-за того, что пытался сделать плагин адаптивнее, перетрудился. Много отличий? Загляните в инклюды разных версий amxmodx
1.png
3.png

Вы способны сами добавить и заменить функцию проигрывания звуков? Вам даже код скинули. вставить, заменить
2 Июл 2017
И тут я понял, что 1.8.3 и 1.8.2 Имеют всё больше и больше отличий :dntknw: чем заменить authid проверку?:sorry:
Зачем?

C++:

#if SAVE_TYPE == 2
authid_is_valid(const authid[])
{
if (!strcmp(authid, "STEAM_ID_LAN") || !strcmp(authid, "VALVE_ID_LAN")) // if (contain(authid, "_ID_LAN") != -1)
return 0;

return 1;
}
#endif
 
Последнее редактирование:
Сообщения
258
Реакции
262
Помог
5 раз(а)
чем заменить authid проверку?
Объясните, пожалуйста, ваш вопрос кодом. Конкретными строками. Качать ничего не хочется.
2 Июл 2017
authid_is_valid(const authid[]) { if (!strcmp(authid, "STEAM_ID_LAN") || !strcmp(authid, "VALVE_ID_LAN")) // if (contain(authid, "_ID_LAN") != -1) return 0; return 1; }
Какой ужас. Всё проще:

Код:
if(contain(authid, ":") != -1) {
return true;
}
return false;
 
Сообщения
162
Реакции
4
Помог
3 раз(а)
UPD.Подскажите как сюда подключить cfg в котором можно будет указывать любое кол-во звуков?
 
Сообщения
2,713
Реакции
2,995
Помог
59 раз(а)
ALIK, только истинные и настоящие оптимизации. Красиво.
 
Сообщения
162
Реакции
445
Помог
2 раз(а)
:crazy:
Оператор == и так возвращает bool. Явное приведение типа не требуется.
return authid[6] == 'I';
 
Последнее редактирование:
Сообщения
162
Реакции
445
Помог
2 раз(а)
fantom, не нужно. Операторы сравнения возвращают bool и в павне тоже.
Код:

new bool:b = 1 < 2; // all good
new bool:b2 = 15; // tag mismatch

Да и в контексте павна типа bool нет вообще.
bool - это всего лишь тэг (метка), которая задает в каком качестве планируется использовать переменную.
Если переменной был задан тэг bool, компилятор сможет выдать предупреждение "tag mismatch", если в коде попытаться записать в нее значение с плавающей точкой например.

Другими словами, система тегов в павне была разработана для проверки использования переменных в compile-time.

Кстати, в pawn есть оператор tagof, который возвращает уникальный номер тэга переменной.

Код:

new i = 0;
new bool:b = false;
new Float:f = 0.0;

server_print("%i", tagof(i));
server_print("%i", tagof(b));
server_print("%i", tagof(f));
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Тогда еще больше оптимизаций
#define authid_is_valid(%0) (%0[6] == 73)
11 Окт 2017
Итог: мы общими усилиями оптимизировали всего лишь одну небольшую функцию. Но читабельность пропала почти полностью
11 Окт 2017
Кстати если уже и оптимизировать, то по хорошему лучше всего запретить в настрйоках реюниона STEAM_ID_LAN и STEAM_ID_VALVE
 
Сообщения
29
Реакции
62
#define authid_is_valid(%0) (%0[6] == 73)
При успешном выполнении данного условия он, для большинства случаев пожалуй, - ИНвалид.
Разве что у тебя стоит какая-то другая конкретная задача... но мне ум ничего не приходит :crazy:
А так да, юзаю подобный макрос в своих работах благодаря сия топику. Сам как-то не допер)
 
Сообщения
55
Реакции
5
Помог
1 раз(а)
Dmitriy Korolev, к

BlackSignature обратись мне он делал очень качественно всё работает
 

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

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