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

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

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

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

> Правила раздела

Перед созданием новой темы убедитесь, не искал ли кто-нибудь подобный плагин до вас, для этого следует воспользоваться поиском.

Все вновь созданные темы, с названием типа "Помогите найти", "А что это за плагин", "Ищу плагин", "Нужен плагин", "Подскажите пожалуйста название плагина" - будут удалены.
При создании темы постарайтесь максимально понятно сформулировать её заголовок так, чтобы он соответствовал функциям плагина который Вы ищите. В том случае, если Вам не удается сформулировать мысль и правильно расписать всё в теме, воспользуйтесь графическим редактором, к примеру Paint, что бы примерно изобразить функции нужного Вам плагина.
2 страниц V   1 2

Неглюкавый раздатчик

progamer
сообщение 10.4.2015, 11:02
Сообщение #1
Стаж: 11 лет

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

Здравствуйте.
Помогите найти неглюкавый раздатчик, а именно.
1. Чтобы после его установки, он не удалялся в конце раунда, а только когда его кто-то расстреляет (уничтожит).
2. Чтобы когда устанавливаешь раздатчик, ты не залипал внутри модели раздатчика, если не успеешь отбежать.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
progamer
сообщение 10.4.2015, 14:55
Сообщение #2
Стаж: 11 лет

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

По 2 му пункту лучше бы чтобы ты не прилипал к раздатчику или отбрасывался на пол-метра.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя rGame
сообщение 10.4.2015, 14:59
Сообщение #3
Стаж: 12 лет

Сообщений: 390
Благодарностей: 629
Полезность: 1016

Попробуйте ему написать, думаю это будет не дорого стоить - Написание плагинов
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
progamer
сообщение 10.4.2015, 15:08
Сообщение #4
Стаж: 11 лет

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

А зачем писать, если этот плагин уже существует, только малёха глюкавый.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя vovan4ik1997
сообщение 10.4.2015, 15:10
Сообщение #5


Стаж: 13 лет

Сообщений: 1087
Благодарностей: 433
Полезность: 718

Может чтобы тебя его исправили нужно приложить исходник?


Представь, что ты заплатил однажды, а получаешь прибыль постоянно.
Закажи правильный контент тут
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя rGame
сообщение 10.4.2015, 15:12
Сообщение #6
Стаж: 12 лет

Сообщений: 390
Благодарностей: 629
Полезность: 1016

Цитата(progamer @ 10.4.2015, 15:08) *
А зачем писать, если этот плагин уже существует, только малёха глюкавый.

Так кто говорит что писать его с 0? Так же можно заказать редактирование плагина.


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
progamer
сообщение 10.4.2015, 19:42
Сообщение #7
Стаж: 11 лет

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

Цитата(vovan4ik1997 @ 10.4.2015, 15:10) *
Может чтобы тебя его исправили нужно приложить исходник?

Код:

#include < amxmodx >
#include < amxmisc >

#include < fakemeta >
#include < hamsandwich >
#include < cstrike >
#include < engine >
#include < fun >
#include < xs >

#define PLUGIN_VERSION "#1.0.3mod"
#define BREAK_COMPUTER 6
#define MAX_PLAYERS 32 + 1

enum
{
STATUS_BUILDING,
STATUS_ACTIVE
};

new const gDamageSounds[ ][ ] =
{
"debris/metal1.wav",
"debris/metal2.wav",
"debris/metal3.wav"
};

new const gDispenserClassname[ ] = "NiceDispenser:D";

new const gDispenserActive[ ] = "buttons/button9.wav";
new const gDispenserMdl[ ] = "models/dispenser.mdl";
new const gMetalGibsMdl[ ] = "models/computergibs.mdl";
new const gHealingSprite[ ] = "sprites/laserbeam.spr";

new gHealingBeam;
new gMetalGibs;
new gHudSync;

new gCvarEnabled;
new gDispenserCost;
new gCvarDispenserHealth;
new gCvarBuildTime;
new gCvarReplenishRadius;
new gCvarSpinDispenser;
new gCvarMaxHealth;
new gCvarMaxArmor;
new Float:gDispenserOrigin[ MAX_PLAYERS ][ 3 ];
new gBeamcolor[ MAX_PLAYERS ][ 3 ];

new despid[ MAX_PLAYERS ];
new Float:gDispenserHealthOff[ MAX_PLAYERS ];
new bool:bDispenserBuild[ MAX_PLAYERS ];

public plugin_init( )
{
register_plugin( "Build Dispenser", PLUGIN_VERSION, "tuty" );

register_event( "TextMsg", "EVENT_TextMsg", "a", "2&#Game_C", "2&#Game_w", "2&#Game_will_restart_in" );
register_logevent( "LOG_RoundEnd", 2, "1=Round_End" );

RegisterHam( Ham_TakeDamage, "info_target", "bacon_TakeDamage", 1 );
RegisterHam( Ham_TraceAttack, "info_target", "bacon_TraceAttack" );

register_think( gDispenserClassname, "DispenserThink" );
// register_clcmd( "drop", "CommandDispenserBuild" );
register_concmd("amx_dispenser", "CommandDispenserBuild", ADMIN_KICK);
register_clcmd( "say /dispenser", "CommandDispenserBuild" );

gCvarEnabled = register_cvar( "dispenser_enabled", "1" );
gDispenserCost = register_cvar( "dispenser_cost", "500" );
gCvarDispenserHealth = register_cvar( "dispenser_health", "300" );
gCvarBuildTime = register_cvar( "dispenser_buildtime", "3" );
gCvarReplenishRadius = register_cvar( "dispenser_radius", "500" );
gCvarSpinDispenser = register_cvar( "dispenser_spin", "1" );
gCvarMaxHealth = register_cvar( "dispenser_playermax_health", "150" );
gCvarMaxArmor = register_cvar( "dispenser_playermax_armor", "150" );

gHudSync = CreateHudSyncObj( );
}

public chteam(id)
{
switch( cs_get_user_team( id ) )
{
case CS_TEAM_T:
{
gBeamcolor[ id ][ 0 ] = 250, gBeamcolor[ id ][ 1 ] = 20, gBeamcolor[ id ][ 2 ] = 20;
set_rendering( despid[id], kRenderFxGlowShell, gBeamcolor[ id ][ 0 ], gBeamcolor[ id ][ 1 ], gBeamcolor[ id ][ 2 ], kRenderNormal, 3 );
}

case CS_TEAM_CT:
{
gBeamcolor[ id ][ 0 ] = 20, gBeamcolor[ id ][ 1 ] = 20, gBeamcolor[ id ][ 2 ] = 250;
set_rendering( despid[id], kRenderFxGlowShell, gBeamcolor[ id ][ 0 ], gBeamcolor[ id ][ 1 ], gBeamcolor[ id ][ 2 ], kRenderNormal, 3 );
}
}
}

public client_connect( id )
{
bDispenserBuild[ id ] = false;
}

public plugin_precache( )
{
gHealingBeam = precache_model( gHealingSprite );
gMetalGibs = precache_model( gMetalGibsMdl );

precache_model( gDispenserMdl );
precache_sound( gDispenserActive );

new i;
for( i = 0; i < sizeof gDamageSounds; i++ )
{
precache_sound( gDamageSounds[ i ] );
}
}

public CommandDispenserBuild( id )
{
new pName[33]
get_user_name(id, pName, charsmax(pName))
if( get_pcvar_num( gCvarEnabled ) != 1 || !(get_user_flags(id) & ADMIN_KICK) )
{
client_print( 0, print_chat, "У игрока %s нет привилегий для постройки раздатчика!", pName );
return PLUGIN_CONTINUE;
}

if( !is_user_alive( id ) || get_pcvar_num( gCvarEnabled ) != 1 || !(get_user_flags(id) & ADMIN_KICK) )
{
client_print( id, print_chat, "Вы должны быть живы" );
return PLUGIN_CONTINUE;
}

if( !( pev( id, pev_flags ) & FL_ONGROUND ) )
{
client_print( id, print_chat, "Вы можете построить раздатчик на полу!" );

return PLUGIN_HANDLED;
}

if( bDispenserBuild[ id ] == true )
{
client_print( id, print_chat, "Вы построили раздатчик!" );

return PLUGIN_HANDLED;
}

new iMoney = cs_get_user_money( id );
new iCost = get_pcvar_num( gDispenserCost );

if( iMoney < iCost )
{
client_print( id, print_chat, "Не хватает средств! Нужно %d$", iCost );

return PLUGIN_HANDLED;
}

new Float:flPlayerOrigin[ 3 ];
pev( id, pev_origin, flPlayerOrigin );

new Float:flHealth = float( get_pcvar_num( gCvarDispenserHealth ) );

new iEntity = create_entity( "info_target" );

if( !pev_valid( iEntity ) )

return PLUGIN_HANDLED;


set_pev( iEntity, pev_classname, gDispenserClassname );
engfunc( EngFunc_SetModel, iEntity, gDispenserMdl );
engfunc( EngFunc_SetSize, iEntity, Float:{ -12.0, -10.0, -12.0 }, Float:{ 12.0, 10.0, 12.0 } );
set_pev( iEntity, pev_origin, flPlayerOrigin );
set_pev( iEntity, pev_solid, SOLID_NOT );
set_pev( iEntity, pev_movetype, MOVETYPE_FLY );
set_pev( iEntity, pev_health, flHealth );
set_pev( iEntity, pev_takedamage, DAMAGE_YES );
set_pev( iEntity, pev_iuser2, id );
set_pev( iEntity, pev_iuser3, STATUS_BUILDING );
set_pev( iEntity, pev_nextthink, get_gametime( ) + 0.1 ); ///

gDispenserOrigin[ id ][ 0 ] = flPlayerOrigin[ 0 ];
gDispenserOrigin[ id ][ 1 ] = flPlayerOrigin[ 1 ];
gDispenserOrigin[ id ][ 2 ] = flPlayerOrigin[ 2 ];

gDispenserHealthOff[ id ] = flHealth;
bDispenserBuild[ id ] = true;

despid[id] = iEntity;
set_task( float( get_pcvar_num( gCvarBuildTime ) ), "BuildDispenserSolid", iEntity );
cs_set_user_money( id, iMoney - iCost, 1 );
client_print( id, print_chat, "Постройка раздатчика запущена..." );

return PLUGIN_HANDLED;
}

public bacon_TakeDamage( ent, idinflictor, idattacker, Float:damage, damagebits )
{
new szClassname[ 32 ];
pev( ent, pev_classname, szClassname, charsmax( szClassname ) );

if( equal( szClassname, gDispenserClassname ) )
{
new iOwner = pev( ent, pev_iuser2 );

if( pev( ent, pev_health ) <= 0.0 )
{
new szName[ 32 ];
get_user_name( idattacker, szName, charsmax( szName ) );

new Float:flOrigin[ 3 ];
pev( ent, pev_origin, flOrigin );

UTIL_BreakModel( flOrigin, gMetalGibs, BREAK_COMPUTER );
set_pev( ent, pev_flags, pev( ent, pev_flags ) | FL_KILLME );

if( idattacker == iOwner )
{
client_print( iOwner, print_chat, "Вы уничтожили раздатчик!" );
}

else
{
client_print( iOwner, print_chat, "%s уничтожил ваш раздатчик!", szName );
}

client_cmd( iOwner, "speak ^"vox/bizwarn computer destroyed^"" );
bDispenserBuild[ iOwner ] = false;
}

gDispenserHealthOff[ iOwner ] = float( pev( ent, pev_health ) );
emit_sound( ent, CHAN_STATIC, gDamageSounds[ random_num( 0, charsmax( gDamageSounds ) ) ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
}
}

public bacon_TraceAttack( iVictim, iAttacker, Float:flDamage, Float:flDirection[ 3 ], iTr, iDamageBits )
{
new szClassname[ 32 ];
pev( iVictim, pev_classname, szClassname, charsmax( szClassname ) );

if( equal( szClassname, gDispenserClassname ) )
{
new Float:flEndOrigin[ 3 ];
get_tr2( iTr, TR_vecEndPos, flEndOrigin );

UTIL_Sparks( flEndOrigin );
}
}

public DispenserThink( iEnt )
{
if( pev_valid( iEnt ) )
{
new iStatus = pev( iEnt, pev_iuser3 );
new iOwner = pev( iEnt, pev_iuser2 );

switch( iStatus )
{
case STATUS_BUILDING:
{
set_rendering( iEnt, kRenderFxDistort, 255, 255, 255, kRenderTransAdd, 70 );
}

case STATUS_ACTIVE:
{
new players[32], num, id;

get_players(players, num);

for( new i = 0; i < num; i++ )
{
id = players[i];
if(is_user_connected(iOwner) && is_user_connected(id) && is_user_alive( id ) && cs_get_user_team( id ) == cs_get_user_team( iOwner ) )
{
new Float:flOrigin[ 3 ];
pev( id, pev_origin, flOrigin );

if( get_distance_f( gDispenserOrigin[ iOwner ], flOrigin ) <= float( get_pcvar_num( gCvarReplenishRadius ) ) )
{
if( UTIL_IsVisible( id, iEnt ) )
{
UTIL_GiveWeaponAmmo( id );

// people will ask why i didn't used if and else if...
// because i want to recharge health and armor and ammo in same time if needed :D

if( get_user_health( id ) < get_pcvar_num( gCvarMaxHealth ) )
{
set_user_health( id, get_user_health( id ) + 1 );
}

if( get_user_armor( id ) < get_pcvar_num( gCvarMaxArmor ) )
{
set_user_armor( id, get_user_armor( id ) + 1 );
}

UTIL_BeamEnts( gDispenserOrigin[ iOwner ], flOrigin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ] );
}
}
}
}

set_hudmessage( gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], 0.01, 0.21, 0, 6.0, 0.2 );
ShowSyncHudMsg( iOwner, gHudSync, ">>>[Раздатчик]<<<^n^nСтатус: [%d]", floatround( gDispenserHealthOff[ iOwner ] ) );
}
}

if( get_pcvar_num( gCvarSpinDispenser ) == 1 )
{
new Float:flAngles[ 3 ];
pev( iEnt, pev_angles, flAngles );

flAngles[ 1 ] += 1.0;

set_pev( iEnt, pev_angles, flAngles );
}

set_pev( iEnt, pev_nextthink, get_gametime( ) + 0.1 ); ///
}
}

public BuildDispenserSolid( iEntity )
{
if( pev_valid( iEntity ) )
{
new iOwner = pev( iEntity, pev_iuser2 );

switch( cs_get_user_team( iOwner ) )
{
case CS_TEAM_T:
{
gBeamcolor[ iOwner ][ 0 ] = 250, gBeamcolor[ iOwner ][ 1 ] = 20, gBeamcolor[ iOwner ][ 2 ] = 20;
set_rendering( iEntity, kRenderFxGlowShell, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], kRenderNormal, 3 );
}

case CS_TEAM_CT:
{
gBeamcolor[ iOwner ][ 0 ] = 20, gBeamcolor[ iOwner ][ 1 ] = 20, gBeamcolor[ iOwner ][ 2 ] = 250;
set_rendering( iEntity, kRenderFxGlowShell, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], kRenderNormal, 3 );
}
}

set_pev( iEntity, pev_solid, SOLID_BBOX );
set_pev( iEntity, pev_iuser3, STATUS_ACTIVE );
engfunc( EngFunc_DropToFloor, iEntity );

emit_sound( iEntity, CHAN_STATIC, gDispenserActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
}
}

public EVENT_TextMsg( )
{
UTIL_DestroyDispensers( );
}

public LOG_RoundEnd( )
{
UTIL_DestroyDispensers( );
}


/*
~~~~~~~~~~~~~~~~~~~~~~~
Stocks
~~~~~~~~~~~~~~~~~~~~~~~
*/


stock UTIL_DestroyDispensers( )
{
new iEnt = FM_NULLENT;

while( ( iEnt = find_ent_by_class( iEnt, gDispenserClassname ) ) )
{
new iOwner = pev( iEnt, pev_iuser2 );

bDispenserBuild[ iOwner ] = false;
set_pev( iEnt, pev_flags, pev( iEnt, pev_flags ) | FL_KILLME );
}
}

stock UTIL_BreakModel( Float:flOrigin[ 3 ], model, flags )
{
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
write_byte( TE_BREAKMODEL );
engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
write_coord( 16 );
write_coord( 16 );
write_coord( 16 );
write_coord( random_num( -20, 20 ) );
write_coord( random_num( -20, 20 ) );
write_coord( 10 );
write_byte( 10 );

write_short( model );
write_byte( 10 );
write_byte( 9 );
write_byte( flags );
message_end( );
}

stock UTIL_BeamEnts( Float:flStart[ 3 ], Float:flEnd[ 3 ], r, g, b )
{
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flStart );
write_byte( TE_BEAMPOINTS );
engfunc( EngFunc_WriteCoord, flStart[ 0 ] );
engfunc( EngFunc_WriteCoord, flStart[ 1 ] );
engfunc( EngFunc_WriteCoord, flStart[ 2 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 0 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 1 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 2 ] );
write_short( gHealingBeam );
write_byte( 5 );
write_byte( 2 );
write_byte( 1 );
write_byte( 80 );
write_byte( 1 );
write_byte( r );
write_byte( g );
write_byte( b );
write_byte( 130 );
write_byte( 0 );
message_end( );
}

stock UTIL_GiveWeaponAmmo( index )
{
new szCopyAmmoData[ 40 ];

switch( get_user_weapon( index ) )
{
case CSW_P228: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_357sig" );
case CSW_SCOUT, CSW_G3SG1, CSW_AK47: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_762nato" );
case CSW_XM1014, CSW_M3: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_buckshot" );
case CSW_MAC10, CSW_UMP45, CSW_USP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_45acp" );
case CSW_SG550, CSW_GALIL, CSW_FAMAS, CSW_M4A1, CSW_SG552, CSW_AUG: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_556nato" );
case CSW_ELITE, CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_9mm" );
case CSW_AWP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_338magnum" );
case CSW_M249: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_556natobox" );
case CSW_FIVESEVEN, CSW_P90: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_57mm" );
case CSW_DEAGLE: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_50ae" );
}

give_item( index, szCopyAmmoData );
}

stock UTIL_Sparks( Float:flOrigin[ 3 ] )
{
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
write_byte( TE_SPARKS );
engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
message_end( );
}

stock bool:UTIL_IsVisible( index, entity, ignoremonsters = 0 )
{
new Float:flStart[ 3 ], Float:flDest[ 3 ];
pev( index, pev_origin, flStart );
pev( index, pev_view_ofs, flDest );

xs_vec_add( flStart, flDest, flStart );

pev( entity, pev_origin, flDest );
engfunc( EngFunc_TraceLine, flStart, flDest, ignoremonsters, index, 0 );

new Float:flFraction;
get_tr2( 0, TR_flFraction, flFraction );

if( flFraction == 1.0 || get_tr2( 0, TR_pHit) == entity )
{
return true;
}

return false;
}

Установка раздатчика say /dispenser, необходим админ флаг "с".

Глюки и хотелки:
1. Когда ставишь раздатчик, если не успеваешь отбежать, то сам прилипаешь к раздатчику (нужно его расстрелять чтобы отлипнуть)
2. Хочу чтобы раздатчик не убирался в конце раунда, а стоял, пока его кто-то не уничтожит
3. Чисто косметически, чтобы модель не висела в воздухе, а стояла на полу - т.е. опустить модель раздатчика на 10 см ниже.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Problem
сообщение 10.4.2015, 19:46
Сообщение #8
Стаж: 12 лет

Сообщений: 325
Благодарностей: 569
Полезность: 861

Вот возьми и закажи у скриптера. С золотым АКом мозги долбил , теперь еще и с этим...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя csnet
сообщение 10.4.2015, 19:55
Сообщение #9
Стаж: 12 лет

Сообщений: 4808
Благодарностей: 3849
Полезность: 690

лучше использовать Ham_Fvisible


go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя vovan4ik1997
сообщение 10.4.2015, 20:04
Сообщение #10


Стаж: 13 лет

Сообщений: 1087
Благодарностей: 433
Полезность: 718

Проверь 2,3. На счет опускания на пол - уже было реализовано. Не знаю, в чем проблема.
Код:
#include < amxmodx >
#include < amxmisc >

#include < fakemeta >
#include < hamsandwich >
#include < cstrike >
#include < engine >
#include < fun >
#include < xs >

#define PLUGIN_VERSION "#1.0.3mod"
#define BREAK_COMPUTER 6
#define MAX_PLAYERS 32 + 1

enum
{
STATUS_BUILDING,
STATUS_ACTIVE
};

new const gDamageSounds[ ][ ] =
{
"debris/metal1.wav",
"debris/metal2.wav",
"debris/metal3.wav"
};

new const gDispenserClassname[ ] = "NiceDispenser:D";

new const gDispenserActive[ ] = "buttons/button9.wav";
new const gDispenserMdl[ ] = "models/dispenser.mdl";
new const gMetalGibsMdl[ ] = "models/computergibs.mdl";
new const gHealingSprite[ ] = "sprites/laserbeam.spr";

new gHealingBeam;
new gMetalGibs;
new gHudSync;

new gCvarEnabled;
new gDispenserCost;
new gCvarDispenserHealth;
new gCvarBuildTime;
new gCvarReplenishRadius;
new gCvarSpinDispenser;
new gCvarMaxHealth;
new gCvarMaxArmor;
new Float:gDispenserOrigin[ MAX_PLAYERS ][ 3 ];
new gBeamcolor[ MAX_PLAYERS ][ 3 ];

new despid[ MAX_PLAYERS ];
new Float:gDispenserHealthOff[ MAX_PLAYERS ];
new bool:bDispenserBuild[ MAX_PLAYERS ];

public plugin_init( )
{
register_plugin( "Build Dispenser", PLUGIN_VERSION, "tuty" );

register_event( "TextMsg", "EVENT_TextMsg", "a", "2&#Game_C", "2&#Game_w", "2&#Game_will_restart_in" );

RegisterHam( Ham_TakeDamage, "info_target", "bacon_TakeDamage", 1 );
RegisterHam( Ham_TraceAttack, "info_target", "bacon_TraceAttack" );

register_think( gDispenserClassname, "DispenserThink" );
// register_clcmd( "drop", "CommandDispenserBuild" );
register_concmd("amx_dispenser", "CommandDispenserBuild", ADMIN_KICK);
register_clcmd( "say /dispenser", "CommandDispenserBuild" );

gCvarEnabled = register_cvar( "dispenser_enabled", "1" );
gDispenserCost = register_cvar( "dispenser_cost", "500" );
gCvarDispenserHealth = register_cvar( "dispenser_health", "300" );
gCvarBuildTime = register_cvar( "dispenser_buildtime", "3" );
gCvarReplenishRadius = register_cvar( "dispenser_radius", "500" );
gCvarSpinDispenser = register_cvar( "dispenser_spin", "1" );
gCvarMaxHealth = register_cvar( "dispenser_playermax_health", "150" );
gCvarMaxArmor = register_cvar( "dispenser_playermax_armor", "150" );

gHudSync = CreateHudSyncObj( );
}

public chteam(id)
{
switch( cs_get_user_team( id ) )
{
case CS_TEAM_T:
{
gBeamcolor[ id ][ 0 ] = 250, gBeamcolor[ id ][ 1 ] = 20, gBeamcolor[ id ][ 2 ] = 20;
set_rendering( despid[id], kRenderFxGlowShell, gBeamcolor[ id ][ 0 ], gBeamcolor[ id ][ 1 ], gBeamcolor[ id ][ 2 ], kRenderNormal, 3 );
}

case CS_TEAM_CT:
{
gBeamcolor[ id ][ 0 ] = 20, gBeamcolor[ id ][ 1 ] = 20, gBeamcolor[ id ][ 2 ] = 250;
set_rendering( despid[id], kRenderFxGlowShell, gBeamcolor[ id ][ 0 ], gBeamcolor[ id ][ 1 ], gBeamcolor[ id ][ 2 ], kRenderNormal, 3 );
}
}
}

public client_connect( id )
{
bDispenserBuild[ id ] = false;
}

public plugin_precache( )
{
gHealingBeam = precache_model( gHealingSprite );
gMetalGibs = precache_model( gMetalGibsMdl );

precache_model( gDispenserMdl );
precache_sound( gDispenserActive );

new i;
for( i = 0; i < sizeof gDamageSounds; i++ )
{
precache_sound( gDamageSounds[ i ] );
}
}

public CommandDispenserBuild( id )
{
new pName[33]
get_user_name(id, pName, charsmax(pName))
if( get_pcvar_num( gCvarEnabled ) != 1 || !(get_user_flags(id) & ADMIN_KICK) )
{
client_print( 0, print_chat, "У игрока %s нет привилегий для постройки раздатчика!", pName );
return PLUGIN_CONTINUE;
}

if( !is_user_alive( id ) || get_pcvar_num( gCvarEnabled ) != 1 || !(get_user_flags(id) & ADMIN_KICK) )
{
client_print( id, print_chat, "Вы должны быть живы" );
return PLUGIN_CONTINUE;
}

if( !( pev( id, pev_flags ) & FL_ONGROUND ) )
{
client_print( id, print_chat, "Вы можете построить раздатчик на полу!" );

return PLUGIN_HANDLED;
}

if( bDispenserBuild[ id ] == true )
{
client_print( id, print_chat, "Вы построили раздатчик!" );

return PLUGIN_HANDLED;
}

new iMoney = cs_get_user_money( id );
new iCost = get_pcvar_num( gDispenserCost );

if( iMoney < iCost )
{
client_print( id, print_chat, "Не хватает средств! Нужно %d$", iCost );

return PLUGIN_HANDLED;
}

new Float:flPlayerOrigin[ 3 ];
pev( id, pev_origin, flPlayerOrigin );

new Float:flHealth = float( get_pcvar_num( gCvarDispenserHealth ) );

new iEntity = create_entity( "info_target" );

if( !pev_valid( iEntity ) )

return PLUGIN_HANDLED;


set_pev( iEntity, pev_classname, gDispenserClassname );
engfunc( EngFunc_SetModel, iEntity, gDispenserMdl );
engfunc( EngFunc_SetSize, iEntity, Float:{ -12.0, -10.0, -12.0 }, Float:{ 12.0, 10.0, 12.0 } );
set_pev( iEntity, pev_origin, flPlayerOrigin );
set_pev( iEntity, pev_solid, SOLID_NOT );
set_pev( iEntity, pev_movetype, MOVETYPE_FLY );
set_pev( iEntity, pev_health, flHealth );
set_pev( iEntity, pev_takedamage, DAMAGE_YES );
set_pev( iEntity, pev_iuser2, id );
set_pev( iEntity, pev_iuser3, STATUS_BUILDING );
set_pev( iEntity, pev_nextthink, get_gametime( ) + 0.1 ); ///

gDispenserOrigin[ id ][ 0 ] = flPlayerOrigin[ 0 ];
gDispenserOrigin[ id ][ 1 ] = flPlayerOrigin[ 1 ];
gDispenserOrigin[ id ][ 2 ] = flPlayerOrigin[ 2 ];

gDispenserHealthOff[ id ] = flHealth;
bDispenserBuild[ id ] = true;

despid[id] = iEntity;
set_task( float( get_pcvar_num( gCvarBuildTime ) ), "BuildDispenserSolid", iEntity );
cs_set_user_money( id, iMoney - iCost, 1 );
client_print( id, print_chat, "Постройка раздатчика запущена..." );

return PLUGIN_HANDLED;
}

public bacon_TakeDamage( ent, idinflictor, idattacker, Float:damage, damagebits )
{
new szClassname[ 32 ];
pev( ent, pev_classname, szClassname, charsmax( szClassname ) );

if( equal( szClassname, gDispenserClassname ) )
{
new iOwner = pev( ent, pev_iuser2 );

if( pev( ent, pev_health ) <= 0.0 )
{
new szName[ 32 ];
get_user_name( idattacker, szName, charsmax( szName ) );

new Float:flOrigin[ 3 ];
pev( ent, pev_origin, flOrigin );

UTIL_BreakModel( flOrigin, gMetalGibs, BREAK_COMPUTER );
set_pev( ent, pev_flags, pev( ent, pev_flags ) | FL_KILLME );

if( idattacker == iOwner )
{
client_print( iOwner, print_chat, "Вы уничтожили раздатчик!" );
}

else
{
client_print( iOwner, print_chat, "%s уничтожил ваш раздатчик!", szName );
}

client_cmd( iOwner, "speak ^"vox/bizwarn computer destroyed^"" );
bDispenserBuild[ iOwner ] = false;
}

gDispenserHealthOff[ iOwner ] = float( pev( ent, pev_health ) );
emit_sound( ent, CHAN_STATIC, gDamageSounds[ random_num( 0, charsmax( gDamageSounds ) ) ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
}
}

public bacon_TraceAttack( iVictim, iAttacker, Float:flDamage, Float:flDirection[ 3 ], iTr, iDamageBits )
{
new szClassname[ 32 ];
pev( iVictim, pev_classname, szClassname, charsmax( szClassname ) );

if( equal( szClassname, gDispenserClassname ) )
{
new Float:flEndOrigin[ 3 ];
get_tr2( iTr, TR_vecEndPos, flEndOrigin );

UTIL_Sparks( flEndOrigin );
}
}

public DispenserThink( iEnt )
{
if( pev_valid( iEnt ) )
{
new iStatus = pev( iEnt, pev_iuser3 );
new iOwner = pev( iEnt, pev_iuser2 );

switch( iStatus )
{
case STATUS_BUILDING:
{
set_rendering( iEnt, kRenderFxDistort, 255, 255, 255, kRenderTransAdd, 70 );
}

case STATUS_ACTIVE:
{
new players[32], num, id;

get_players(players, num);

for( new i = 0; i < num; i++ )
{
id = players[i];
if(is_user_connected(iOwner) && is_user_connected(id) && is_user_alive( id ) && cs_get_user_team( id ) == cs_get_user_team( iOwner ) )
{
new Float:flOrigin[ 3 ];
pev( id, pev_origin, flOrigin );

if( get_distance_f( gDispenserOrigin[ iOwner ], flOrigin ) <= float( get_pcvar_num( gCvarReplenishRadius ) ) )
{
if( UTIL_IsVisible( id, iEnt ) )
{
UTIL_GiveWeaponAmmo( id );

// people will ask why i didn't used if and else if...
// because i want to recharge health and armor and ammo in same time if needed :D

if( get_user_health( id ) < get_pcvar_num( gCvarMaxHealth ) )
{
set_user_health( id, get_user_health( id ) + 1 );
}

if( get_user_armor( id ) < get_pcvar_num( gCvarMaxArmor ) )
{
set_user_armor( id, get_user_armor( id ) + 1 );
}

UTIL_BeamEnts( gDispenserOrigin[ iOwner ], flOrigin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ] );
}
}
}
}

set_hudmessage( gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], 0.01, 0.21, 0, 6.0, 0.2 );
ShowSyncHudMsg( iOwner, gHudSync, ">>>[Раздатчик]<<<^n^nСтатус: [%d]", floatround( gDispenserHealthOff[ iOwner ] ) );
}
}

if( get_pcvar_num( gCvarSpinDispenser ) == 1 )
{
new Float:flAngles[ 3 ];
pev( iEnt, pev_angles, flAngles );

flAngles[ 1 ] += 1.0;

set_pev( iEnt, pev_angles, flAngles );
}

set_pev( iEnt, pev_nextthink, get_gametime( ) + 0.1 ); ///
}
}

public BuildDispenserSolid( iEntity )
{
if( pev_valid( iEntity ) )
{
new iOwner = pev( iEntity, pev_iuser2 );

switch( cs_get_user_team( iOwner ) )
{
case CS_TEAM_T:
{
gBeamcolor[ iOwner ][ 0 ] = 250, gBeamcolor[ iOwner ][ 1 ] = 20, gBeamcolor[ iOwner ][ 2 ] = 20;
set_rendering( iEntity, kRenderFxGlowShell, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], kRenderNormal, 3 );
}

case CS_TEAM_CT:
{
gBeamcolor[ iOwner ][ 0 ] = 20, gBeamcolor[ iOwner ][ 1 ] = 20, gBeamcolor[ iOwner ][ 2 ] = 250;
set_rendering( iEntity, kRenderFxGlowShell, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], kRenderNormal, 3 );
}
}

set_pev( iEntity, pev_solid, SOLID_BBOX );
set_pev( iEntity, pev_iuser3, STATUS_ACTIVE );
drop_to_floor(iEntity);

emit_sound( iEntity, CHAN_STATIC, gDispenserActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
}
}

public EVENT_TextMsg( )
{
UTIL_DestroyDispensers( );
}



/*
~~~~~~~~~~~~~~~~~~~~~~~
Stocks
~~~~~~~~~~~~~~~~~~~~~~~
*/


stock UTIL_DestroyDispensers( )
{
new iEnt = FM_NULLENT;

while( ( iEnt = find_ent_by_class( iEnt, gDispenserClassname ) ) )
{
new iOwner = pev( iEnt, pev_iuser2 );

bDispenserBuild[ iOwner ] = false;
set_pev( iEnt, pev_flags, pev( iEnt, pev_flags ) | FL_KILLME );
}
}

stock UTIL_BreakModel( Float:flOrigin[ 3 ], model, flags )
{
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
write_byte( TE_BREAKMODEL );
engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
write_coord( 16 );
write_coord( 16 );
write_coord( 16 );
write_coord( random_num( -20, 20 ) );
write_coord( random_num( -20, 20 ) );
write_coord( 10 );
write_byte( 10 );

write_short( model );
write_byte( 10 );
write_byte( 9 );
write_byte( flags );
message_end( );
}

stock UTIL_BeamEnts( Float:flStart[ 3 ], Float:flEnd[ 3 ], r, g, b )
{
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flStart );
write_byte( TE_BEAMPOINTS );
engfunc( EngFunc_WriteCoord, flStart[ 0 ] );
engfunc( EngFunc_WriteCoord, flStart[ 1 ] );
engfunc( EngFunc_WriteCoord, flStart[ 2 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 0 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 1 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 2 ] );
write_short( gHealingBeam );
write_byte( 5 );
write_byte( 2 );
write_byte( 1 );
write_byte( 80 );
write_byte( 1 );
write_byte( r );
write_byte( g );
write_byte( b );
write_byte( 130 );
write_byte( 0 );
message_end( );
}

stock UTIL_GiveWeaponAmmo( index )
{
new szCopyAmmoData[ 40 ];

switch( get_user_weapon( index ) )
{
case CSW_P228: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_357sig" );
case CSW_SCOUT, CSW_G3SG1, CSW_AK47: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_762nato" );
case CSW_XM1014, CSW_M3: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_buckshot" );
case CSW_MAC10, CSW_UMP45, CSW_USP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_45acp" );
case CSW_SG550, CSW_GALIL, CSW_FAMAS, CSW_M4A1, CSW_SG552, CSW_AUG: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_556nato" );
case CSW_ELITE, CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_9mm" );
case CSW_AWP: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_338magnum" );
case CSW_M249: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_556natobox" );
case CSW_FIVESEVEN, CSW_P90: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_57mm" );
case CSW_DEAGLE: copy( szCopyAmmoData, charsmax( szCopyAmmoData ), "ammo_50ae" );
}

give_item( index, szCopyAmmoData );
}

stock UTIL_Sparks( Float:flOrigin[ 3 ] )
{
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
write_byte( TE_SPARKS );
engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
message_end( );
}

stock bool:UTIL_IsVisible( index, entity, ignoremonsters = 0 )
{
new Float:flStart[ 3 ], Float:flDest[ 3 ];
pev( index, pev_origin, flStart );
pev( index, pev_view_ofs, flDest );

xs_vec_add( flStart, flDest, flStart );

pev( entity, pev_origin, flDest );
engfunc( EngFunc_TraceLine, flStart, flDest, ignoremonsters, index, 0 );

new Float:flFraction;
get_tr2( 0, TR_flFraction, flFraction );

if( flFraction == 1.0 || get_tr2( 0, TR_pHit) == entity )
{
return true;
}

return false;
}


Представь, что ты заплатил однажды, а получаешь прибыль постоянно.
Закажи правильный контент тут
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
progamer
сообщение 10.4.2015, 21:36
Сообщение #11
Стаж: 11 лет

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

Спасибо!!
Глюк с залипанием на модели раздатчика очень мешает - игрок установил, отбежать не успел и прилип к раздатчику.
Моделька раздатчика всё равно не стоит на полу, она немного выше, 10-15 см просвет до пола. Можно ли её поставить чуть ниже.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя vovan4ik1997
сообщение 10.4.2015, 21:47
Сообщение #12


Стаж: 13 лет

Сообщений: 1087
Благодарностей: 433
Полезность: 718

Как "костыль" сделай gCvarBuildTime = register_cvar( "dispenser_buildtime", "3" ); больше 3, чтобы успевал убежать.
Функция, которая устанавливает на пол модель есть. Скорее всего проблема в модели


Представь, что ты заплатил однажды, а получаешь прибыль постоянно.
Закажи правильный контент тут
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
progamer
сообщение 11.4.2015, 9:44
Сообщение #13
Стаж: 11 лет

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

Цитата(vovan4ik1997 @ 10.4.2015, 21:47) *
Как "костыль" сделай gCvarBuildTime = register_cvar( "dispenser_buildtime", "3" ); больше 3, чтобы успевал убежать.
Функция, которая устанавливает на пол модель есть. Скорее всего проблема в модели


Попробовал такой "костыль". Поставил время =5 секунд, но проблема только усугубилась.
Другой игрок, который видит создавающийся раздатчик бежит к тому месту и прилипает к раздатчику.
Как мыши бегут на сыр и сами попадают в мышеловку.
Нужно создать раздатчик, чтобы к нему модели не прилипали или отбрасывались на пол-метра когда к нему подходят впритык.

Может проблема ив модели, но она разошлась по интернету и другой нет.
Можно ли не переделывая модель, заставить её выводится на 10 см ниже??
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
progamer
сообщение 11.4.2015, 10:47
Сообщение #14
Стаж: 11 лет

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

Кстати мысль....
Может если создавать раздатчик на 10 см ниже - то будет считаться что раздатчик создаётся не в том месте, где находится игрок и он не будет прилипать к раздатчику??
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
progamer
сообщение 11.4.2015, 14:12
Сообщение #15
Стаж: 11 лет

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

vovan4ik1997,

Подумай, может можно одним выстрелом 2 зайцев застрелить.
Берём смещаем вывод модельки раздатчика чуть вниз. Теперь координаты модели раздатчика и игрока, который ставит
раздатчик автоматически будут разные, соответственно игрок не будет прилипать к раздатчику.
Мысль не лишена смысла. Как вывести модель чуть ниже??
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
progamer
сообщение 12.4.2015, 18:36
Сообщение #16
Стаж: 11 лет

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

Кто может подсказать в какой строчке находится координата выводимого раздатчика?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
progamer
сообщение 13.4.2015, 10:30
Сообщение #17
Стаж: 11 лет

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

Код:
set_pev( iEntity, pev_classname, gDispenserClassname );
engfunc( EngFunc_SetModel, iEntity, gDispenserMdl );
engfunc( EngFunc_SetSize, iEntity, Float:{ -12.0, -10.0, -12.0 }, Float:{ 12.0, 10.0, 12.0 } );
set_pev( iEntity, pev_origin, flPlayerOrigin );
set_pev( iEntity, pev_solid, SOLID_NOT );
set_pev( iEntity, pev_movetype, MOVETYPE_FLY );
set_pev( iEntity, pev_health, flHealth );
set_pev( iEntity, pev_takedamage, DAMAGE_YES );
set_pev( iEntity, pev_iuser2, id );
set_pev( iEntity, pev_iuser3, STATUS_BUILDING );
set_pev( iEntity, pev_nextthink, get_gametime( ) + 0.1 ); ///

gDispenserOrigin[ id ][ 0 ] = flPlayerOrigin[ 0 ];
gDispenserOrigin[ id ][ 1 ] = flPlayerOrigin[ 1 ];
gDispenserOrigin[ id ][ 2 ] = flPlayerOrigin[ 2 ];

gDispenserHealthOff[ id ] = flHealth;
bDispenserBuild[ id ] = true;

despid[id] = iEntity;
set_task( float( get_pcvar_num( gCvarBuildTime ) ), "BuildDispenserSolid", iEntity );
cs_set_user_money( id, iMoney - iCost, 1 );
client_print( id, print_chat, "Постройка раздатчика запущена..." );


Насколько я понял код, в этом месте как раз находятся функции которые устанавливают раздатчик.
А где задаётся место его установки??? То есть координаты куда он поставится??

Отредактировал: GOOD FELLOW, - 13.4.2015, 10:45
Причина: Выдано устное предупреждение!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
progamer
сообщение 14.4.2015, 21:31
Сообщение #18
Стаж: 11 лет

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

Специалисты, помог бы кто.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя 3aB}{o3
сообщение 14.4.2015, 22:12
Сообщение #19


Стаж: 18 лет

Сообщений: 2145
Благодарностей: 825
Полезность: 521

progamer, я не знаю как тебе помочь, может тебе значение переменых (функций) стоит узнать?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя dialyabev
сообщение 15.4.2015, 7:20
Сообщение #20


Стаж: 11 лет

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

Код:
gDispenserOrigin[ id ][ 0 ] = flPlayerOrigin[ 0 ];
gDispenserOrigin[ id ][ 1 ] = flPlayerOrigin[ 1 ];
gDispenserOrigin[ id ][ 2 ] = flPlayerOrigin[ 2 ];


x,y,z

прибавляй к x , y число, и будет тебе счастье.

Отредактировал: dialyabev, - 15.4.2015, 7:20


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