AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Problem with /invis plugin (https://forums.alliedmods.net/showthread.php?t=245112)

wAyz 07-28-2014 12:15

Problem with /invis plugin
 
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;
}



All times are GMT -4. The time now is 13:17.

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