Code: Select all
/*
Plugin: Xmas Gifts 2.3.2
Autor: KronoS # GG
Credite:
@FakeNick - pentru pluginul Pick up present de unde a pornit tot
@joropito - pentru Super Spawns
@Askhanar - pentru fixarea Super Spawns
Cvar-uri:
- presents_respawn_time 60.0 (Dupa cat timp dupa ridicarea unui cadou apare altul pe harta)
- presents_on_map 11 (Cate cadouri sa apara pe harta)
ATENTIE*: Se calculeaza numarul cvar-ului - 1!!!
Daca puneti 11 or sa apara doar 10 cadouri!
Changelog:
* v2.3.2 - 28.12.2012
- cadourile primeau respawn chiar daca timpul era setat pe 0.0
* v2.3.1 - 28.12.2012
- cadourile nu primeau respawn
* v2.3 - 28.12.2012
- cod infrumusetat
- cadourile nu mai apareau dupa prima runda (fixat de Askhanar)
* v2.2 - 25.11.2010
- bug reparat: cadourile dispareau de pe harta
- FM_Think indeparta
* v2.1 - 17.11.2010
- super spawns
- cvar: presents_on_map
- bug reparat: cadourile apareau in aer
- variabila globala
- FUN -> Fakemeta
- Hamsandwich
- optimizare mesaje HUD
* v1.0 - 14.11.2010
- plugin publicat
*/
#include < amxmodx >
#include < cstrike >
#include < hamsandwich >
#include < engine >
#include < fakemeta >
#pragma tabsize 0
native csgor_get_user_keys(id);
native csgor_set_user_keys(id,amount);
native csgor_get_user_dusts(id);
native csgor_set_user_dusts(id,amount);
native csgor_get_user_cases(id);
native csgor_set_user_cases(id,amount);
//native csgor_get_user_skins(id,amount)
native csgor_set_user_skins(id,skinid,amount);
native csgor_is_user_logged(id);
/* Model cadou */
#define MODEL_CUTIE "models/cutie.mdl"
/* Extras din Super Spawns */
#define SS_MIN_DISTANCE 500.0
#define SS_MAX_LOOPS 100000
new Array:g_vecSsOrigins;
new Array:g_vecSsSpawns;
new Array:g_vecSsUsed;
new Float:g_flSsMinDist;
new g_iSsTime;
new const g_szStarts[ ][ ] = { "info_player_start", "info_player_deathmatch" };
new const Float:g_flOffsets[ ] = { 3500.0, 3500.0, 1500.0 };
/*
// Floats
new Float:fMaxs[ 3 ] = { 13.0, 13.0, 35.0 };
new Float:fMins[ 3 ] = { -13.0, -13.0, 0.0 };
*/
new pcvar_respawn_time, pcvar_presents_on_map;
public plugin_precache( )
{
engfunc( EngFunc_PrecacheModel, MODEL_CUTIE );
pcvar_presents_on_map = register_cvar( "presents_on_map", "4" );
}
public plugin_init( )
{
register_plugin( "XMAS GIFTS", "2.3.2", "KronoS" );
// Eventuri
//register_event( "HLTV", "spawn_gifts", "a", "1=0", "2=0" );
RegisterHam( Ham_Killed, "player", "client_death", 1 );
register_forward( FM_Touch, "forward_touch" );
// Cvar-uri
pcvar_respawn_time = register_cvar( "presents_respawn_time", "90.0" );
//NOI
register_cvar("box_chei","1");
register_cvar("box_cutii","1");
register_cvar("box_pulbere","1");
register_cvar("box_bani","333");
register_cvar("box_skin_max","80");
SsInit( 800.0 );
SsScan( );
XGIFTS_Spawn( );
}
public spawn_gifts( ) XGIFTS_Spawn( );
public XGIFTS_Spawn( )
{
new Float:fOrigin[ 3 ];//xxx
for( new i = 1; i <= get_pcvar_num( pcvar_presents_on_map ); i++ ) if ( SsGetOrigin( fOrigin ) ) XGIFTS_Create( fOrigin );
}
public XGIFTS_Create( const Float:fOrigin[ 3 ] )
{
//create
new ent = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
if ( pev_valid( ent ) )
{
set_pev( ent, pev_classname, "csgo_supplybox" );
engfunc( EngFunc_SetOrigin, ent, fOrigin );
engfunc( EngFunc_SetModel, ent, MODEL_CUTIE );
//entity_set_int( ent, EV_INT_movetype, MOVETYPE_NONE );
set_pev( ent, pev_solid, SOLID_BBOX );
static Float:fMaxs[ 3 ] = { 2.0, 2.0, 4.0 };
static Float:fMins[ 3 ] = { -2.0, -2.0, -4.0 };
engfunc( EngFunc_SetSize, ent, fMins, fMaxs );
engfunc( EngFunc_DropToFloor, ent );
//drop_to_floor( ent );
}
//return 1;
}
public XGIFTS_Respawn( iOrigin[ ] )
{
new Float:fOrigin[ 3 ], auxOrigin[ 3 ];
auxOrigin[ 0 ] = iOrigin[ 0 ];
auxOrigin[ 1 ] = iOrigin[ 1 ];
auxOrigin[ 2 ] = iOrigin[ 2 ];
IVecFVec( auxOrigin, fOrigin );
XGIFTS_Create( fOrigin );
set_hudmessage(255, 165, 0, 0.02, 0.73, 0, 6.0, 5.0,0.1,0.2,-1);
show_hudmessage(0,"Tocmai a fost aruncata o cutie pe mapa!^nCautati-o pentru a afla ce ascunde.");
return 0;
}
public forward_touch( const ent, const id )
{
if ( !pev_valid( ent )||!is_user_alive( id )/*||!( 1 <= id <= 32 )*/ ) return FMRES_IGNORED;
static class[ 20 ];
pev( ent, pev_classname, class, sizeof class - 1 );
if ( !equal( class, "csgo_supplybox" ) ) return FMRES_IGNORED;
set_pev( ent, pev_solid, SOLID_NOT );
set_pev( ent, pev_effects, EF_NODRAW );
if ( get_pcvar_float( pcvar_respawn_time ) > 0.0 )
{
//new iParm[ 3 ];
new Float:flOrigin[ 3 ], iOrigin[ 3 ];
entity_get_vector( ent, EV_VEC_origin, flOrigin );
FVecIVec( flOrigin, iOrigin );
/*iParm[ 0 ] = iOrigin[ 0 ];
iParm[ 1 ] = iOrigin[ 1 ];
iParm[ 2 ] = iOrigin[ 2 ];*/
set_task( get_pcvar_float( pcvar_respawn_time ), "XGIFTS_Respawn", _, /*iParm*/iOrigin, 3 );
}
switch ( random_num( 0, 4 ) )
{
case 0:
{
if(csgor_is_user_logged(id))
{
csgor_set_user_keys(id,csgor_get_user_keys(id)+get_cvar_num("box_chei"));
client_print(id,print_chat,"Super!Ai primit +%d chei%s",get_cvar_num("box_chei"),get_cvar_num("box_chei")==1?"e":"");
}
else
{
client_print(id,print_chat,"Inregistreaza-te prin /reg pentru a avea acces la Supply BOX");
Bani(id);
}
}
case 1:
{
if(csgor_is_user_logged(id))
{
csgor_set_user_cases(id,csgor_get_user_cases(id)+get_cvar_num("box_cutii"));
client_print(id,print_chat,"Super!Ai primit +%d cuti%s",get_cvar_num("box_cutii"),get_cvar_num("box_cutii")==1?"e":"i");
}
else
{
client_print(id,print_chat,"Inregistreaza-te prin /reg pentru a avea acces la Supply BOX");
Bani(id);
}
}
case 2:
{
if(csgor_is_user_logged(id))
{
csgor_set_user_dusts(id,csgor_get_user_dusts(id)+get_cvar_num("box_pulbere"));
client_print(id,print_chat,"Super!Ai primit +%d pulber%s",get_cvar_num("box_pulbere"),get_cvar_num("box_pulbere")==1?"e":"i");
}
else
{
client_print(id,print_chat,"Inregistreaza-te prin /reg pentru a avea acces la Supply BOX");
Bani(id);
}
}
case 3:
{
if(csgor_is_user_logged(id))
{
csgor_set_user_skins(id,random_num(0,get_cvar_num("box_skin_max")),1);
client_print(id,print_chat,"Super!Ai primit +1 skin");
}
else
{
client_print(id,print_chat,"Inregistreaza-te prin /reg pentru a avea acces la Supply BOX");
Bani(id);
}
}
case 4: Bani(id);
}
//remove_entity( ent );
return FMRES_IGNORED;//0
}
public Bani(id)
{
cs_set_user_money(id,cs_get_user_money(id)+get_cvar_num("box_bani"),1);
client_print(id,print_chat,"Super!Ai primit +%d$",get_cvar_num("box_bani"));
}
// Super spawns
public SsInit( Float:mindist )
{
g_flSsMinDist = mindist;
g_vecSsOrigins = ArrayCreate( 3, 1 );
g_vecSsSpawns = ArrayCreate( 3, 1 );
g_vecSsUsed = ArrayCreate( 3, 1 );
}
stock SsClean( )
{
g_flSsMinDist = 0.0;
ArrayClear( g_vecSsOrigins );
ArrayClear( g_vecSsSpawns );
ArrayClear( g_vecSsUsed );
}
stock SsGetOrigin( Float:origin[ 3 ] )
{
new Float:data[3], size;
new ok = 1;
while( ( size = ArraySize( g_vecSsOrigins ) ) )
{
new idx = random_num( 0, size - 1 );
ArrayGetArray( g_vecSsOrigins, idx, origin );
new used = ArraySize( g_vecSsUsed );
for( new i = 0; i < used; i++ )
{
ok = 0;
ArrayGetArray( g_vecSsUsed, i, data );
if( get_distance_f( data, origin ) >= g_flSsMinDist )
{
ok = 1;
break;
}
}
ArrayDeleteItem( g_vecSsOrigins, idx );
if ( ok )
{
ArrayPushArray( g_vecSsUsed, origin );
return true;
}
}
return false;
}
public SsScan( )
{
new start, Float:origin[ 3 ], starttime;
starttime = get_systime( );
for( start = 0; start < sizeof( g_szStarts ); start++ )
{
server_print( "Searching for %s", g_szStarts[ start ] );
new ent;
if( ( ent = engfunc( EngFunc_FindEntityByString, ent, "classname", g_szStarts[ start ] ) ) )
{
new counter;
pev( ent, pev_origin, origin );
ArrayPushArray( g_vecSsSpawns, origin );
while ( counter < SS_MAX_LOOPS ) counter = GetLocation( origin, counter );
}
}
g_iSsTime = get_systime( );
g_iSsTime -= starttime;
}
GetLocation( Float:start[ 3 ], &counter )
{
new Float:end[ 3 ];
for( new i = 0; i < 3; i++ ) end[ i ] += random_float( 0.0 - g_flOffsets[ i ], g_flOffsets[ i ] );
if( IsValid( start, end ) )
{
start[ 0 ] = end[ 0 ];
start[ 1 ] = end[ 1 ];
start[ 2 ] = end[ 2 ];
ArrayPushArray( g_vecSsOrigins, end );
}
counter ++;
return counter;
}
IsValid( Float:start[ 3 ], Float:end[ 3 ] )
{
SetFloor( end );
end[ 2 ] += 36.0;
new point = engfunc( EngFunc_PointContents, end );
if( point == CONTENTS_EMPTY ) if ( CheckPoints( end ) && CheckDistance( end ) && CheckVisibility( start, end ) ) if ( !trace_hull( end, HULL_LARGE, -1 ) ) return true;
return false;
}
CheckVisibility( Float:start[ 3 ], Float:end[ 3 ] )
{
new tr;
engfunc( EngFunc_TraceLine, start, end, IGNORE_GLASS, -1, tr );
return ( get_tr2( tr, TR_pHit ) < 0 );
}
SetFloor( Float:start[ 3 ] )
{
new tr, Float:end[ 3 ];
end[ 0 ] = start[ 0 ];
end[ 1 ] = start[ 1 ];
end[ 2 ] = -99999.9;
engfunc( EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, -1, tr );
get_tr2( tr, TR_vecEndPos, start );
}
CheckPoints( Float:origin[ 3 ] )
{
new Float:data[ 3 ], tr, point;
data[ 0 ] = origin[ 0 ];
data[ 1 ] = origin[ 1 ];
data[ 2 ] = 99999.9;
engfunc( EngFunc_TraceLine, origin, data, DONT_IGNORE_MONSTERS, -1, tr );
get_tr2( tr, TR_vecEndPos, data );
point = engfunc( EngFunc_PointContents, data );
if ( point == CONTENTS_SKY && get_distance_f( origin, data ) < 250.0 ) return false;
data[ 2 ] = -99999.9;
engfunc( EngFunc_TraceLine, origin, data, DONT_IGNORE_MONSTERS, -1, tr );
get_tr2( tr, TR_vecEndPos, data );
point = engfunc( EngFunc_PointContents, data );
if ( point < CONTENTS_SOLID ) return false;
return true;
}
CheckDistance( Float:origin[ 3 ] )
{
new Float:dist, Float:data[ 3 ];
new count = ArraySize( g_vecSsSpawns );
for( new i = 0; i < count; i++ )
{
ArrayGetArray( g_vecSsSpawns, i, data );
dist = get_distance_f( origin, data );
if( dist < SS_MIN_DISTANCE ) return false;
}
count = ArraySize( g_vecSsOrigins );
for( new i = 0; i < count; i++ )
{
ArrayGetArray( g_vecSsOrigins, i, data );
dist = get_distance_f( origin, data );
if( dist < SS_MIN_DISTANCE ) return false;
}
return true;
}
stock fm_find_ent_by_owner(index, const classname[], owner, jghgtype = 0) {
new strtype[11] = "classname", ent = index;
switch (jghgtype) {
case 1: strtype = "target";
case 2: strtype = "targetname";
}
while ((ent = engfunc(EngFunc_FindEntityByString, ent, strtype, classname)) && pev(ent, pev_owner) != owner) {}
return ent;
}