Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

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

niceserver
сообщение 28.6.2017, 10:25
Сообщение #1
Стаж: 9 лет

Сообщений: 257
Благодарностей: 21
Полезность: 83

Приветствую.Есть плагин который воспроизводит звуки при убийстве.Включается он по команде /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;
}


Отредактировал: niceserver, - 28.6.2017, 10:29
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
niceserver
сообщение 1.7.2017, 10:24
Сообщение #2
Стаж: 9 лет

Сообщений: 257
Благодарностей: 21
Полезность: 83

Также желательно добавить автоудаление неактивных игроков.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя JIuXeP
сообщение 1.7.2017, 13:03
Сообщение #3


Стаж: 12 лет

Сообщений: 338
Благодарностей: 205
Полезность: 792

разумнее использовать в этом случае nvault
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
niceserver
сообщение 1.7.2017, 13:05
Сообщение #4
Стаж: 9 лет

Сообщений: 257
Благодарностей: 21
Полезность: 83

JIuXeP, я в павне не понимаю ничего.поэтому и написал сюда.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя energydance
сообщение 1.7.2017, 13:11
Сообщение #5


Стаж: 10 лет

Сообщений: 2809
Благодарностей: 740
Полезность: 213

niceserver, по поводу оповещения в чат , можно сделать в каком нибудь рекламном менеджере )


Press enter to exit ...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Cobra1998
сообщение 1.7.2017, 13:21
Сообщение #6
Стаж: 13 лет
Город: Lvov

Сообщений: 74
Благодарностей: 8
Полезность: 86

код
#include <amxmodx>
#include <amxmisc>

new kills[33] = {0,...};
new deaths[33] = {0,...};
new kill[33][24];

#define LEVELS 12
#define TASK_CLEAR_KILL 100

new levels[LEVELS] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

new sounds[LEVELS][] =
{
"misc/female/f_multikill",
"misc/female/f_killingspree",
"misc/female/f_megakill",
"misc/female/f_dominating",
"misc/female/f_ultrakill",
"misc/female/f_rampage",
"misc/female/f_monsterkill",
"misc/female/f_ludacrisskill",
"misc/female/f_unstoppable",
"misc/female/f_godlike",
"misc/female/f_holyshit",
"misc/female/f_wickedsick"
};

public plugin_precache()
{
for(new i = 0; i < LEVELS; i++)
{
new CacheSound[64]
formatex(CacheSound, 63, "%s.wav", sounds[i])
precache_sound(CacheSound)
}
}

new messages[LEVELS][] =
{
"%s ^nделает -2. MULTI-KILL!",
"%s ^nделает -3. Это смертельная шутка!",
"%s ^nделает -4! MEGA-KILL!",
"%s ^nделает -5!! Какое превосходство!",
"%s ^nделает -6!!! ULTRA-KILL!",
"%s ^nв ЯРОСТИ! 7x!",
"%s ^nМОООООНСТЕР!! 9x!",
"%s ^nБЕЗУМЕЦ!!! 10x!",
"%s ^nПРОСТО НЕПОБЕДИМ!!!! 11x!",
"%s ^nБОЖЕНСТВЕННЫЙ!!!!! GODLIKE 12x!",
"%s ^nТАЩЕР ОТ БОГА!!!!!! HOLYSHIT 13x!",
"%s ^nДЕЛАЕТ НЕВОЗМОЖНОЕ!!!!!!! WICKEDSICK 14x!"
};

new killstreaktype

new sound_on[33]=0;

public plugin_init()
{
register_plugin("Ultimate KillStreak Sounds", "1.0", "no");

killstreaktype = register_cvar("ut_killstreak_advanced", "3");
register_clcmd("say /sound","menu_sound");
register_event("DeathMsg", "event_death", "a");
register_event("ResetHUD", "reset_hud", "b");
}

public menu_sound(id)
{
new menu=menu_create("\d[\rMC\d]\y Меню озвучки убийств","menu_handler");

menu_additem(menu,sound_on[id] ? "Выключить звук" : "\dВключить звук","1",0);

menu_setprop(menu,MPROP_EXIT,1);
menu_setprop(menu,MPROP_EXITNAME,"Выход");
menu_setprop(menu,MPROP_NUMBER_COLOR,"\w");
menu_display(id,menu,0);

return PLUGIN_HANDLED;
}

public menu_handler(id,menu,item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}

new s_Data[6], s_Name[64], i_Access, i_Callback;
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback);

new i_Key = str_to_num(s_Data);
switch(i_Key)
{
case 1:
{
sound_on[id]=!sound_on[id];
set_hudmessage(200, 100, 0, -1.0, 0.30, 0, 3.0, 3.0, 0.15, 0.15, 1)
show_hudmessage(id,sound_on[id] ? "Звук включен" : "Звук откючен")
}
}
return PLUGIN_HANDLED;
}



public event_death(id)
{
new killer = read_data(1);
new victim = read_data(2);
// new headshot = read_data(3);
new weapon[24], vicname[32], killname[32]
read_data(4,weapon,23)
get_user_name(victim,vicname,31)
get_user_name(killer,killname,31)

if(kill[killer][0] && equal(kill[killer],weapon))
{
kill[killer][0] = 0;
}
else
{
kill[killer] = weapon;
set_task(0.1,"clear_kill",TASK_CLEAR_KILL+killer);
}

kills[killer] += 1;
kills[victim] = 0;
deaths[killer] = 0;
deaths[victim] += 1;

for (new i = 0; i < LEVELS; i++)
{
if (kills[killer] == levels[i])
{
announce(killer, i);
break;
}
}
}

announce(killer, level)
{
if(killer == 0 || !is_user_connected(killer)) // FiX - No Server Kills ;D
{
return PLUGIN_CONTINUE;
}

new name[33]
get_user_name(killer, name, 32);

new hud_col = random_num(1,4)
switch (hud_col)
{
case 1: set_hudmessage(224, 224, 0, 0.05, 0.65, 2, 0.02, 5.0, 0.02, 0.25, 2); // yellow
case 2: set_hudmessage(0, 224, 224, 0.05, 0.65, 2, 0.02, 5.0, 0.02, 0.25, 2); // birz
case 3: set_hudmessage(128, 0, 224, 0.05, 0.65, 2, 0.02, 5.0, 0.02, 0.25, 2); // violla
case 4: set_hudmessage(0, 224, 0, 0.05, 0.65, 2, 0.02, 5.0, 0.02, 0.25, 2); // green
}

if( (get_pcvar_num(killstreaktype) <= 0 ) || get_pcvar_num(killstreaktype) > 3) return PLUGIN_HANDLED;

if(get_pcvar_num(killstreaktype) == 1)
{
show_hudmessage(0, messages[level], name);
}
else if(get_pcvar_num(killstreaktype) == 2)
{
new players[32],num;
get_players(players,num,"CH");
for(new i=1;i<num;i++)
{
if(sound_on[players[i]] && is_user_connected(players[i]))
client_cmd(players[i],"spk %s", sounds[level])
}
}
else if(get_pcvar_num(killstreaktype) == 3)
{
new players[32],num;
get_players(players,num,"CH");
for(new i=1;i<num;i++)
{
if(sound_on[players[i]] && is_user_connected(players[i]))
{
show_hudmessage(0, messages[level], name);
client_cmd(players[i], "spk %s", sounds[level]);
}
}
}

return PLUGIN_CONTINUE;
}

public reset_hud(id)
{
if (kills[id] > levels[0])
{
set_hudmessage(0,224,224, 0.98, 0.70, 2, 0.02, 4.0, 0.02, 0.5, 2);
show_hudmessage(id, "Комбо %dx!", kills[id]);
}
else if (deaths[id] > 1)
{
set_hudmessage(224,224,0, 0.98, 0.70, 2, 0.02, 4.0, 0.02, 0.3, 2);
show_hudmessage(id, "Лошара! Ты умераешь %d-ый раунд подряд!", deaths[id]);
}
}

public client_connect(id)
{
kills[id] = 0;
deaths[id] = 0;
sound_on[id]=0;
}

public clear_kill(taskid)
{
new id = taskid-TASK_CLEAR_KILL;
kill[id][0] = 0;
}

здесь уже реализонаво все, кроме nvault
буду рад если кто-то допилит)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
niceserver
сообщение 1.7.2017, 14:39
Сообщение #7
Стаж: 9 лет

Сообщений: 257
Благодарностей: 21
Полезность: 83

Cobra1998, тяжёлый код же.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legend21
сообщение 1.7.2017, 21:52
Сообщение #8
Стаж: 14 лет
Город: Винница

Сообщений: 604
Благодарностей: 229
Полезность: 561

niceserver,

пробуй
Код:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >

// Включить\Выключить сохранение функции >> g_bszSoundsEnable << в корень amxmodx
#define SAVE

#if defined SAVE
#include < nvault >
new g_vault_data
#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 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 );

#if defined SAVE
g_vault_data = nvault_open( "sound_save" );
#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;
Recording( iPlayer )
client_print( iPlayer, print_chat, "Звуки убийств отключены." );
}
else
{
g_bszSoundsEnable{ iPlayer } = true;
Recording( iPlayer )
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 )
{
Recording( iPlayer )
//g_bszSoundsEnable{ iPlayer } = true;

g_iKillCount[ iPlayer ] = 0;
}

public client_disconnect( iPlayer )
{
Check_Data( iPlayer )
}

#if defined SAVE
public Recording( iPlayer )
{
new sAuthID[ 35 ];

get_user_authid( iPlayer, sAuthID, 35 );

new i_vaultkey[ 64 ], d_vaultdata[ 256 ];
format( i_vaultkey, 63, "%s", sAuthID );
format( d_vaultdata, 255, "%i#", g_bszSoundsEnable{ iPlayer } );

nvault_set( g_vault_data, i_vaultkey, d_vaultdata );
return PLUGIN_CONTINUE;
}

public Check_Data( iPlayer )
{
new sAuthID[ 35 ];

get_user_authid( iPlayer, sAuthID, 35 );

new i_vaultkey[64], d_vaultdata[256];
format( i_vaultkey, 63, "%s", sAuthID );
format( d_vaultdata, 255, "%i#", g_bszSoundsEnable{ iPlayer } );
nvault_get( g_vault_data, i_vaultkey, d_vaultdata, 255 );

replace_all( d_vaultdata, 255, "#", " " );

/*
new cz_playerSounds[ 32 ];
parse( d_vaultdata, cz_playerSounds, 31 );
g_bszSoundsEnable{ iPlayer } = str_to_num( cz_playerSounds );
*/
return PLUGIN_CONTINUE;
}
#endif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя JIuXeP
сообщение 2.7.2017, 0:14
Сообщение #9


Стаж: 12 лет

Сообщений: 338
Благодарностей: 205
Полезность: 792

Legend21, shok.gif

Cкрытый текст

опустим критику)


Отредактировал: JIuXeP, - 2.7.2017, 0:23
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя JIuXeP
сообщение 2.7.2017, 0:52
Сообщение #10


Стаж: 12 лет

Сообщений: 338
Благодарностей: 205
Полезность: 792

начудил тут малеха.

Настройки все в исходнике под макросами
Естественно особо это не тестировалось, да и бодрствовать уже поздно

upd:подправил...

Отредактировал: JIuXeP, - 2.7.2017, 14:54
Прикрепленные файлы:
Прикрепленный файл  amx_killsounds.sma ( 6,37 килобайт ) Кол-во скачиваний: 39
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Legend21
сообщение 3.7.2017, 19:00
Сообщение #11
Стаж: 14 лет
Город: Винница

Сообщений: 604
Благодарностей: 229
Полезность: 561

JIuXeP, оставь формальности. я даже не писал, просто скопипастил. Этот натив уже давно неактуален, просто хотел помочь.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Jack2345
сообщение 4.7.2017, 18:47
Сообщение #12
Стаж: 11 лет
Город: Москва

Сообщений: 277
Благодарностей: 0
Полезность: < 0

там вить абсолютно легко


Success
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
dimka198
сообщение 9.10.2017, 19:44
Сообщение #13
Стаж: 12 лет

Сообщений: 1541
Благодарностей: 283
Полезность: 13

JIuXeP, можно ко всему этому подключить cfg файл чтобы звуки не в sma указывать а там.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя dialyabev
сообщение 10.10.2017, 8:54
Сообщение #14


Стаж: 11 лет

Сообщений: 243
Благодарностей: 120
Полезность: 596

Если актуально , готов сделать, в скайп


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя MiKi
сообщение 10.10.2017, 10:02
Сообщение #15


Стаж: 11 лет

Сообщений: 80
Благодарностей: 8
Полезность: 4

Если еще нужно,отпиши,я сделаю
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
dimka198
сообщение 11.10.2017, 10:12
Сообщение #16
Стаж: 12 лет

Сообщений: 1541
Благодарностей: 283
Полезность: 13

dialyabev, есть другие варианты связи?в скайп просто никак.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: