Plugin-uriPlugin Realistic Snow

Moderatori: Moderators, Founder

Mesaj

Avatar utilizator
CEO
Posts
3802
Nume Plugin:
Descriere: o ninsoare care sa semene cat de mult posibil cu o ninsoare adevarata.
Instalare:

1. Fisierul rs.sma il puneti in addons/amxmodx/scripting
2. Fisierul rs.amxx il puneti in addons/amxmodx/plugins
3. Intrati in fisierul addons/amxmodx/configs/plugins.ini si adaugati la urma: rs.amxx
4. Fisierul rs_wind.wav il puneti in hlds/cstrike/sound/misc
5. Fisierul snow1.spr il puneti in hlds/cstrike/sprites


Descarcare:

http://www.mediafire.com/download/984b15q0ueoo566/Resurse.zip

Cod: Selectaţi tot

/* Plugin generated by AMXX-Studio */

#include < amxmodx >
#include < fakemeta >
#include < engine >
#include < xs >


new const
PLUGIN_NAME[ ] = "Realistic Snow",
PLUGIN_VERSION[ ] = "1.1.0b";


#define TASKID_FOG 1337
#define TASKID_WIND 7331


/* Thanks to joropito for his SuperSpawns */
#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
};
/* End of SuperSpawns */

new const g_szSound[ ] = "misc/rs_wind.wav";

new g_iCvarSound;
new g_iCvarSky;
new g_iCvarLight;
new g_iCvarFog;
new g_iCvarDelay;

new g_iSprite;

//new Array:g_vecOrigins;
new Float:g_fVecOrigins[ 128 ][ 3 ];
new g_iOrigins = 0;

new g_iMagicEntity;

public plugin_precache( )
{
// We register plugin info and the cvars here because it's a must!
register_plugin( PLUGIN_NAME, PLUGIN_VERSION, "Askhanar" );
register_cvar( "rs_version", PLUGIN_VERSION, FCVAR_SERVER | FCVAR_SPONLY );
g_iCvarSound = register_cvar( "rs_sound", "1" );
g_iCvarSky = register_cvar( "rs_sky", "1" );
g_iCvarLight = register_cvar( "rs_light", "1" );
g_iCvarFog = register_cvar( "rs_fog", "1" );
g_iCvarDelay = register_cvar( "rs_delay", "0.8" );


// Precache our wind sound.
precache_sound( g_szSound );

//Precache our snow .spr
g_iSprite = precache_model( "sprites/snow1.spr" );


// Let's put a random snow sky if the cvar allows us to.
if( get_pcvar_num( g_iCvarSky) )
set_cvar_string( "sv_skyname", random_num( 0, 1 ) == 1 ? "snow" : "snowlake_" );

// We need to make the snow look cooler.. so let's make the map darker.. if the cvar allows us to.
if( get_pcvar_num( g_iCvarLight ) )
set_lights( "d" );
}

public plugin_init( )
{

// We make sure to remove anoying entities..
remove_entity_name( "env_fog" );
remove_entity_name( "env_rain" );
remove_entity_name( "env_snow" );

// Prepare some stuffs
//g_vecOrigins = ArrayCreate( 3, 1 );

SsInit( 250.0 );
SsScan( );
SsDump( );

// Set a task to play sound..
set_task( 35.0, "task_PlayWind", TASKID_WIND, _, _, "b", 0 );

// Create our MagicEntity. ( snow's brain.. )
CreateEntity:

new iEnt;
iEnt = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) );
if( !pev_valid( iEnt ) || !iEnt )
goto CreateEntity;

set_pev( iEnt, pev_classname, "Askhanar's_MagicEntity" );
set_pev( iEnt, pev_nextthink, get_gametime( ) + 1.0 );

register_forward( FM_Think, "fwd_MagicEntityThink" );
g_iMagicEntity = iEnt;



}

public task_PlayWind( )
if( get_pcvar_num( g_iCvarSound ) )
{
client_cmd( 0, "spk %s", g_szSound );
}

public client_putinserver( id )
{
if( is_user_bot( id ) || is_user_hltv( id ) )
return;

if( get_pcvar_num( g_iCvarFog ) )
if( !task_exists( id + TASKID_FOG ) )
set_task( 3.0, "task_MakeFogToPlayer", id + TASKID_FOG );

}

public task_MakeFogToPlayer( id )
{

id -= TASKID_FOG;
if( !is_user_connected( id ) )
return;

MakeFog( id, 255, 255, 255, 111, 18, 3, 58 );

}

public fwd_MagicEntityThink( iEnt )
{

if( iEnt != g_iMagicEntity || !pev_valid( iEnt ) )
return FMRES_IGNORED;

set_pev( iEnt, pev_nextthink, get_gametime( ) + get_pcvar_float( g_iCvarDelay ) );

for( new i = 0; i < g_iOrigins; i++ )
MakeSnow( g_fVecOrigins[ i ], g_iSprite, 1, 1, random_num( 1, 10 ), random_num( 0, 15 ), random_num( 0, 5 ) );

return FMRES_IGNORED;
}

MakeSnow( Float:fOrigin[ 3 ], iSpriteId, iCount, iLife, iScale, iVelocity, iRandomness )
{
engfunc( EngFunc_MessageBegin, MSG_BROADCAST, SVC_TEMPENTITY, fOrigin, 0 );
write_byte( TE_SPRITETRAIL ); // TE ID
engfunc( EngFunc_WriteCoord, fOrigin[ 0 ] ); // x axis
engfunc( EngFunc_WriteCoord, fOrigin[ 1 ] ); // y axis
engfunc( EngFunc_WriteCoord, fOrigin[ 2 ] ); // z axis
engfunc( EngFunc_WriteCoord, fOrigin[ 0 ] ); // x axis
engfunc( EngFunc_WriteCoord, fOrigin[ 1 ] ); // y axis
engfunc( EngFunc_WriteCoord, fOrigin[ 2 ] ); // z axis
write_short( iSpriteId ); // Sprite Index
write_byte( iCount ); // Count
write_byte( iLife ); // Life
write_byte( iScale ); // Scale
write_byte( iVelocity ); // Velocity Along Vector
write_byte( iRandomness ); // Rendomness of Velocity
message_end( );
}

MakeFog( id, const iRed, const iGreen, const iBlue, const iSD, const iED, const iD1, const iD2 )
{
static iMsgIdFog;

message_begin( id == 0 ? MSG_ALL : MSG_ONE, !iMsgIdFog ? ( iMsgIdFog = get_user_msgid( "Fog" ) ) : iMsgIdFog, {0, 0, 0}, id );
write_byte( iRed ); // R
write_byte( iGreen ); // G
write_byte( iBlue ); // B
write_byte( iSD ); // SD
write_byte( iED ); // ED
write_byte( iD1 ); // D1
write_byte( iD2 ); // D2
message_end( );
}


stock Get_Sky_Origin( const Float:vecTarget[ 3 ], Float:vecStart[ 3 ] )
{

new Float:vecHit[ 3 ];
vecStart[ 0 ] = vecTarget[ 0 ];
vecStart[ 1 ] = vecTarget[ 1 ];
vecStart[ 2 ] = vecTarget[ 2 ] + 5096.0;

while( engfunc( EngFunc_PointContents, vecStart ) != -1 )
{
if( vecStart[ 2 ] < vecTarget[ 2 ] + 128.0 )
break;

vecStart[ 2 ] -= 16.0;
}

if( vecStart[ 2 ] - vecTarget[ 2 ] <= 196.0 )
return 0;

xs_vec_copy( vecStart, vecHit );
vecHit[ 2 ] += 256.0;

new s_TextureName[ 16 ];
engfunc( EngFunc_TraceTexture, 0, vecStart, vecHit, s_TextureName, sizeof( s_TextureName ) -1 );
if( !equal( s_TextureName, "sky" ) )
return 0

vecStart[ 2 ] -= 10.0;
return 1;
}

/*====================================
=============Super Spawns============*/

public SsInit(Float:mindist)
{

register_cvar("sv_superspawns", SS_VERSION, (FCVAR_SERVER|FCVAR_SPONLY));
register_concmd("_ss_dump", "SsDump");

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 SsDump()
{
new Float:origin[3], Float:fOrigin[ 3 ];
new count = ArraySize(g_vecSsOrigins);
server_print("-------------------------------------------------------");

for(new i = 0; i < count; i++)
{
ArrayGetArray(g_vecSsOrigins, i, origin);

if( Get_Sky_Origin( origin, fOrigin ) && g_iOrigins < 128 )
{
//ArrayPushArray( g_vecOrigins, fOrigin );//

g_fVecOrigins[ g_iOrigins ][ 0 ] = fOrigin[ 0 ];
g_fVecOrigins[ g_iOrigins ][ 1 ] = fOrigin[ 1 ];
g_fVecOrigins[ g_iOrigins ][ 2 ] = fOrigin[ 2 ];
g_iOrigins++;
}
}

server_print("-------------------------------------------------------");
server_print("Number of origins: %i", count);
server_print("Number of good origins: %i", g_iOrigins);
server_print("Time: %i", g_iSsTime);
server_print("-------------------------------------------------------");

}

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

/*====================================
=============Super Spawns============*/

Link oficial:
Cvaruri:

Cod: Selectaţi tot

rs_sound <1/0> - Activeaza/Dezactiveaza daca se se auda sau nu un sunet de viscol.( Default 1 )
rs_sky <1/0> - Activeaza/Dezactiveaza daca se schimbe cerul cu unul specific de iarna.( Default 1 )
rs_light <1/0> - Activeaza/Dezactiveaza daca se schimbe lumina de pe harta [ 1 - lumina mai mica | 0 - lumina mai multa ].( Defaule 1 )
rs_fog <1/0> - Activeaza/Dezactiveaza ceata de pe server. ( Default 1 )
*NEW!!!rs_delay "x.y" - [ 0.1 0.2 0.3 1.0 1.5 5.0 DELAY dintre fulgi in secunde ( Default 0.8 )]
Comenzi administrative:
Imagini/Video:
Autor :
========================
CONTACT : diliulro@yahoo.com
========================
Scrie răspuns