Code: Select all
#include < amxmodx >
#include < cstrike >
#include < hamsandwich >
#include < fakemeta >
#include < fakemeta_util >
#include < engine >
#include < fun >
#include < cellarray >
#include < xs >
#define AUTHOR "Askhanar"
#define PLUGIN "Gifts"
#define VERSION "1.0"
#define TAG "!n[!gTAG AICI!n]"
#define SS_VERSION "1.0"
#define SS_MIN_DISTANCE 250.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
};
new const g_szFmuGiftsModels[]= "models/model_cutie.mdl"
new const g_iFmuGiftsColors[][] =
{
{ 0, 255, 255 },
{ 0, 255, 125 },
{ 255, 125, 65 },
{ 255, 0, 125 },
{ 255, 25, 25 },
{ 255, 255, 0 },
{ 255, 255, 255 }
};
new const g_szFmuGiftClassName[] = "fmu_gift";
new Float:fMaxs[ 3 ] = { 13.0, 13.0, 35.0 };
new Float:fMins[ 3 ] = { -13.0, -13.0, 0.0 };
new gCvarRespawnTime;
new gCvarNum;
public plugin_precache()
{
precache_model(g_szFmuGiftsModels);
}
public plugin_init( )
{
register_plugin(PLUGIN, VERSION, AUTHOR);
gCvarRespawnTime = register_cvar("fmu_gifts_respawntime", "45");
gCvarNum = register_cvar("fmu_gifts_number", "35");
register_touch(g_szFmuGiftClassName, "player", "FwdPlayerTouchGift");
SsInit(800.0);
SsScan();
LoadAllGifts();
}
public FwdPlayerTouchGift( const iEnt, const id )
{
if(is_valid_ent(iEnt) && ( 1 <= id <= 32 ) && is_user_alive( id ) )
{
new iParm[ 3 ];
new Float:flOrigin[ 3 ], iOrigin[ 3 ];
entity_get_vector( iEnt, EV_VEC_origin, flOrigin );
FVecIVec( flOrigin, iOrigin );
iParm[ 0 ] = iOrigin[ 0 ];
iParm[ 1 ] = iOrigin[ 1 ];
iParm[ 2 ] = iOrigin[ 2 ];
set_task(float(get_pcvar_num( gCvarRespawnTime)), "Respawn_Entity", _, iParm, 3 );
GivePlayerGift(id);
remove_entity(iEnt);
}
return 0;
}
public GivePlayerGift(id)
{
switch(random_num(1, 7))
{
case 1:
{
new Health = 10
fm_set_user_health(id, get_user_health(id) + Health)
chat_color(id, "!g%s !nAi gasit in cufar !g%d !nHP.", TAG, Health)
}
case 2:
{
new Armor = 20
fm_set_user_armor(id, get_user_armor(id) + Armor)
chat_color(id, "!g%s !nAi gasit in cufar !g%d !nAP.", TAG, Armor)
}
case 3:
{
if(!user_has_weapon(id, CSW_HEGRENADE))
fm_give_item(id, "weapon_hegrenade")
else
cs_set_user_bpammo(id, CSW_HEGRENADE, cs_get_user_bpammo(id, CSW_HEGRENADE) + 1);
chat_color(id, "!g%s !nAi gasit in cufar !gHE GRENADE", TAG)
}
case 4:
{
cs_set_user_bpammo(id, CSW_HEGRENADE, cs_get_user_bpammo(id, CSW_HEGRENADE) + 1);
cs_set_user_bpammo(id, CSW_FLASHBANG, cs_get_user_bpammo(id, CSW_FLASHBANG) + 1);
chat_color(id, "!g%s !nAi gasit in cufar !gHE GRENADE !n+ !gFLASH GRENADE", TAG)
}
case 5:
{
new Armor = 20
new Health = 5
fm_set_user_armor(id, get_user_armor(id) + Armor)
fm_set_user_health(id, get_user_health(id) + Health)
chat_color(id, "!g%s !nAi gasit in cufar !g%d !nAP + !g%d !nHP", TAG, Armor, Health)
}
case 6:
{
new Money = 2000
cs_set_user_money(id, cs_get_user_money(id) + Money)
chat_color(id, "!g%s !nAi gasit in cufar !g%d !n$", TAG, Money)
}
case 7:
{
chat_color(id, "!g%s !nNu ai gasit nimic in cufar!", TAG)
return PLUGIN_HANDLED;
}
}
return PLUGIN_CONTINUE;
}
public Respawn_Entity( iParm[ ] )
{
new Float:flOrigin[ 3 ], iOrigin[ 3 ];
iOrigin[ 0 ] = iParm[ 0 ];
iOrigin[ 1 ] = iParm[ 1 ];
iOrigin[ 2 ] = iParm[ 2 ];
IVecFVec( iOrigin, flOrigin );
CreateGift( flOrigin );
return 0;
}
public CreateGift(const Float:fOrigin[3])
{
new iEnt = create_entity( "info_target" );
if ( !is_valid_ent(iEnt) ) return 0;
new iRandom = random_num(0, 6);
entity_set_string( iEnt, EV_SZ_classname, g_szFmuGiftClassName );
entity_set_origin( iEnt, fOrigin );
entity_set_model( iEnt, g_szFmuGiftsModels);
entity_set_int( iEnt, EV_INT_movetype, MOVETYPE_NONE );
entity_set_int( iEnt, EV_INT_solid, SOLID_BBOX );
entity_set_size( iEnt, fMins, fMaxs );
set_rendering(iEnt, kRenderFxGlowShell, g_iFmuGiftsColors[ iRandom ][ 0 ], g_iFmuGiftsColors[ iRandom ][ 1 ], g_iFmuGiftsColors[ iRandom ][ 2 ], kRenderNormal, 255 );
drop_to_floor( iEnt );
return 1;
}
public LoadAllGifts( )
{
new Float:fOrigin[3];
for( new i = 1; i <= get_pcvar_num(gCvarNum); i++ )
if( SsGetOrigin( fOrigin ) )
CreateGift( fOrigin );
}
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 chat_color(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4")
replace_all(msg, 190, "!n", "^1")
replace_all(msg, 190, "!t", "^3")
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i])
write_string(msg)
message_end()
}
}
}
}