Raised This Month: $51 Target: $400
 12% 

Problem with /invis plugin


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
wAyz
Senior Member
Join Date: Feb 2010
Location: Germany
Old 07-28-2014 , 12:15   Problem with /invis plugin
Reply With Quote #1

Hello,

I'm currently using /invis plugin 2.0 by SchlumPF, following problem:
If 2 players are on different parts of the map, they can hear each others sounds
again (shooting, footsteps, ..). Usually this plugin disables any nearby player's sounds,
now when for example a wall is between 2 players, they hear each others sounds again.
Is this possible to fix somehow?



Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>

#define MAX_ENTITYS 900+15*32 // (900+15*SERVER_SLOTS) is the calculation cs uses but it can be bypassed by the "-num_edicts <x>"-parameter

new bool:g_bPlayerInvisible[33];
new bool:g_bWaterInvisible[33];

new bool:g_bWaterEntity[MAX_ENTITYS];
new bool:g_bWaterFound;

new g_iSpectatedId[33];

public plugin_init( )
{
    register_plugin( "Invis", "2.0", "SchlumPF" );
    
    register_clcmd( "say /invis", "menuInvisDisplay" );
    register_menucmd( register_menuid( "\rInvisibility - SchlumPF^n^n" ), 1023, "menuInvisAction" );
    
    register_forward( FM_AddToFullPack, "fwdAddToFullPack_Post", 1 );
    RegisterHam( Ham_Spawn, "player", "hamSpawnPlayer_Post", 1 );
    
    register_event( "SpecHealth2", "eventSpecHealth2", "bd" );
}

public plugin_cfg( )
{
    new ent = -1;
    while( ( ent = find_ent_by_class( ent, "func_water" ) ) != 0 )
    {
        // pev( ent, pev_skin ) ==  CONTENTS_WATER is also true on func_water entities
        
        if( !g_bWaterFound )
        {
            g_bWaterFound = true;
        }

        g_bWaterEntity[ent] = true;
    }
    
    // thanks to connor for finding the following two detections
    ent = -1;
    while( ( ent = find_ent_by_class( ent, "func_illusionary" ) ) != 0 )
    {
        if( pev( ent, pev_skin ) ==  CONTENTS_WATER )
        {
            if( !g_bWaterFound )
            {
                g_bWaterFound = true;
            }
    
            g_bWaterEntity[ent] = true;
        }
    }
    
    ent = -1;
    while( ( ent = find_ent_by_class( ent, "func_conveyor" ) ) != 0 )
    {
        if( pev( ent, pev_spawnflags ) == 3 )
        {
            if( !g_bWaterFound )
            {
                g_bWaterFound = true;
            }
    
            g_bWaterEntity[ent] = true;
        }
    }
}

public fwdAddToFullPack_Post( es_handle, e, ent, host, hostflags, player, pset )
{
    if( player && g_bPlayerInvisible[host] && host != ent && ent != g_iSpectatedId[host] )
    {
        static const Float:corner[8][3] = 
        {
            { -4096.0, -4096.0, -4096.0 },
            { -4096.0, -4096.0, 4096.0 },
            { -4096.0, 4096.0, -4096.0 },
            { -4096.0, 4096.0, 4096.0 },
            { 4096.0, -4096.0, -4096.0 },
            { 4096.0, -4096.0, 4096.0 },
            { 4096.0, 4096.0, -4096.0 },
            { 4096.0, 4096.0, 4096.0 }
        };
        
        // rounded; distance from the map's center to the corners; sqrt( 4096^2 + 4096^2 + 4096^2 )
        static const Float:map_distance = 7094.480108;
        
        static Float:origin[3];
        get_es( es_handle, ES_Origin, origin );
        
        static i;
        while( get_distance_f( origin, corner[i] ) > map_distance )
        { 
            if( ++i >= sizeof( corner ) )
            {
                // better to nullify the varibale now then doing it each time before the loop
                i = 0;
            }
        }
        
        set_es( es_handle, ES_Origin, corner[i] );
        set_es( es_handle, ES_Effects, get_es( es_handle, ES_Effects ) | EF_NODRAW );
    }
    else if( g_bWaterInvisible[host] && g_bWaterEntity[ent])
    {
        set_es( es_handle, ES_Effects, get_es( es_handle, ES_Effects ) | EF_NODRAW );
    }
}

public hamSpawnPlayer_Post( id )
{
    g_iSpectatedId[id] = 0;
}

// thanks to xPaw who told me about this event
public eventSpecHealth2( id )
{
    g_iSpectatedId[id] = read_data( 2 );
}

public menuInvisDisplay( id )
{
    static menu[256];

    new len = formatex( menu, 255, "\rInvisibility - SchlumPF^n^n" );
    
    len += formatex( menu[len], 255 - len, "\r1. \wPlayers: %s^n", g_bPlayerInvisible[id] ? "invisible" : "visible" );
    
    if( g_bWaterFound )
    {
        len += formatex( menu[len], 255 - len, "\r2. \wWater: %s^n", g_bWaterInvisible[id] ? "invisible" : "visible" );
    }
     //else
    //{
    //    len += formatex( menu[len], 255 - len, "\r2. \wWater: There is no water on this map!^n" );
    //}

    len += formatex( menu[len], 255 - len, "^n\r0. \wExit" );
    
    show_menu( id, ( 1<<0 | 1<<1 | 1<<9 ), menu, -1 );
        
    return PLUGIN_HANDLED;
}

public menuInvisAction( id, key )
{
    switch( key )
    {
        case 0:
        {
            g_bPlayerInvisible[id] = !g_bPlayerInvisible[id];
            menuInvisDisplay( id );
        }
        case 1:
        {
            if( g_bWaterFound )
            {
                g_bWaterInvisible[id] = !g_bWaterInvisible[id];
            }
            
            menuInvisDisplay( id );
        }
        case 9: show_menu( id, 0, "" );
    }
}

public client_connect( id )
{
    g_bPlayerInvisible[id] = false;
    g_bWaterInvisible[id] = false;
    g_iSpectatedId[id] = 0;
}

Last edited by wAyz; 07-28-2014 at 12:28.
wAyz is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 07:15.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode