Jump to content

[Plugin-RF] Realistic Snow


Don Liviu

Recommended Posts

# Descriere: Acest plugin creaza o  ninsoare seamana cu o ninsoare adevarata.
# Download: 

 

/* Plugin generated by AMXX-Studio */

    #include < amxmodx >
    #include < fakemeta >
    #include < engine >
    #include < xs >
    
    
    new const
        PLUGIN_NAME[ ]         = "Realistic Snow",
        PLUGIN_VERSION[ ]     = "0.4.2b";
        
    
    #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_iCvarSnowType;
    
    new g_iSprite;
    
    new Array:g_vecOrigins;
    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" );    

    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_iCvarSnowType = register_cvar( "rs_type", "3" );
    
    
    // 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( 200.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 )
{
    set_pev( iEnt, pev_nextthink, get_gametime( ) + 3.1 );
    
    static iSnowType;
    iSnowType = clamp( get_pcvar_num( g_iCvarSnowType ), 0, 3 );

    if( iEnt != g_iMagicEntity || !pev_valid( iEnt ) || !iSnowType )
        return FMRES_IGNORED;
        
        
        
    static Float:fOrigin[ 3 ], iLocations, iCount;
    //iCount = iSnowType == 1 ? 3 : iSnowType * 2;
    switch( iSnowType )
    {
        case 1:
        {
            iCount = 3;
            iLocations = 20;
        }
        case 2:
        {
            iCount = 5;
            iLocations = 30;
        }
        case 3:
        {
            iCount = 10;
            iLocations = 45;
        }
    }
    
    while( iLocations > 0 )
    {
        ArrayGetArray( g_vecOrigins, random( g_iOrigins ), fOrigin );
        MakeSnow( fOrigin, g_iSprite, iCount, 8, random_num( 5, 10 ), 50, 30 );
        iLocations--;
        
    }
    
    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 ] + 40 ); // 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 ) )
        {
            ArrayPushArray( g_vecOrigins, fOrigin );
            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 += random_float(0.0 - g_flOffsets, g_flOffsets);
    }

    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============*/


# Nume: Realistic Snow
# Versiunea: 0.4.2b
# Instalare:

=> Fisierul rs.sma il puneti in addons/amxmodx/scripting 
=> Fisierul rs.amxx il puneti in addons/amxmodx/plugins 
=> Intrati in fisierul addons/amxmodx/configs/plugins.ini si adaugati la urma:

rs.amxx
Fisierul rs_wind.wav il puneti in hlds/cstrike/sound/misc
Fisierul snow1.spr il puneti in hlds/cstrike/sprites
 
Cvar-uri (se adauga in fisierul amxmodx\configs\amxx.cfg):
 
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 ].( Default 1 )
rs_fog <1/0> - Activeaza/Dezactiveaza ceata de pe server. ( Default 1 )
rs_type<1/2/3/0> <tag> - [ 0 Nu ninge deloc | 1 Ninge lin | 2 Ninge moderat | 3 Ninge abundent ]
 
 
Nota !
 
Pluginu foloseste un task la fiecare 35 de secunde care se repeta la infinit , iar cand fulgii cand cad pe pamant sar ca niste mingiute pentru un efect mai puternic este recomandat instalarea hartilor de toamna !
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...