in case you use rehlds + regame i have a plugin that adds spawn near other spawn automatically, just in case
PHP Code:
#include < amxmodx >
#include < hamsandwich >
#include < fakemeta >
#include < reapi >
#pragma semicolon 1
#define TEAM_SPAWNPOINTS_COUNT 20
new bool: g_bFixFirstSpawn[ MAX_PLAYERS + 1 ];
new HamHook: g_HamHook_PlayerIsPlayer;
public plugin_init( )
{
register_plugin( "Spawns add auto", "1.0.", "dev" );
RegisterHookChain( RG_CBasePlayer_Spawn, "@CBasePlayer__Spawn_Pre", false );
RegisterHookChain( RG_CBasePlayer_Spawn, "@CBasePlayer__Spawn_Post", true );
DisableHamForward( ( g_HamHook_PlayerIsPlayer = RegisterHamPlayer( Ham_IsPlayer, "@CBasePlayer__IsPlayer_Pre", false ) ) );
AddSpawnPoints( "info_player_deathmatch" );
AddSpawnPoints( "info_player_start" );
}
public client_putinserver( iPlayer )
{
g_bFixFirstSpawn[ iPlayer ] = true;
}
@CBasePlayer__Spawn_Pre( iPlayer )
{
new TeamName: iTeam = get_member( iPlayer, m_iTeam );
if( iTeam == TEAM_TERRORIST || iTeam == TEAM_CT )
{
if( g_bFixFirstSpawn[ iPlayer ] )
{
g_bFixFirstSpawn[ iPlayer ] = false;
return;
}
}
else
return;
// Using this only for selection spawn point (prevent the bugs with a player)
EnableHamForward( g_HamHook_PlayerIsPlayer );
}
@CBasePlayer__Spawn_Post( iPlayer )
{
DisableHamForward( g_HamHook_PlayerIsPlayer );
}
// HACK: prevent the death of a player
@CBasePlayer__IsPlayer_Pre( iEntity )
{
SetHamReturnInteger( false );
return HAM_SUPERCEDE;
}
AddSpawnPoints( const sClassname[ ] )
{
new Float: vecOrigin[ 3 ];
new Float: vecAngles[ 3 ];
new Float: vecOriginLast[ 2 ];
new Float: vecMidOrigin[ 2 ];
new Float: vecMidAngles[ 3 ];
new Array: aSpawnPoints = ArrayCreate( 1 );
new iSpot = MaxClients;
while( ( iSpot = rg_find_ent_by_class( iSpot, sClassname, true ) ) )
{
ArrayPushCell( aSpawnPoints, iSpot );
get_entvar( iSpot, var_origin, vecOrigin );
get_entvar( iSpot, var_angles, vecAngles );
vecMidOrigin[ 0 ] += vecOrigin[ 0 ] - vecOriginLast[ 0 ];
vecMidOrigin[ 1 ] += vecOrigin[ 1 ] - vecOriginLast[ 1 ];
vecMidAngles[ 0 ] += vecAngles[ 0 ];
vecMidAngles[ 1 ] += vecAngles[ 1 ];
vecOriginLast[ 0 ] = vecOrigin[ 0 ];
vecOriginLast[ 1 ] = vecOrigin[ 1 ];
}
new iSpotsCount = ArraySize( aSpawnPoints );
if( iSpotsCount >= TEAM_SPAWNPOINTS_COUNT )
return;
new Float: flSpotsCount = float( iSpotsCount );
vecMidOrigin[ 0 ] /= flSpotsCount;
vecMidOrigin[ 1 ] /= flSpotsCount;
vecMidAngles[ 0 ] /= flSpotsCount;
vecMidAngles[ 1 ] /= flSpotsCount;
new iAllSpawns = iSpotsCount;
new Float: flDistance = floatsqroot( vecMidOrigin[ 0 ] * vecMidOrigin[ 0 ] + vecMidOrigin[ 1 ] * vecMidOrigin[ 1 ] );
for( new iIndex = 0; iIndex < ArraySize( aSpawnPoints ); iIndex++ )
{
iSpot = ArrayGetCell( aSpawnPoints, iIndex );
get_entvar( iSpot, var_origin, vecOrigin );
iSpot = CreateSpawnPoint( sClassname, vecOrigin, vecMidAngles, flDistance );
if( iSpot == NULLENT )
continue;
ArrayPushCell( aSpawnPoints, iSpot );
if( ++iAllSpawns >= TEAM_SPAWNPOINTS_COUNT )
break;
}
ArrayDestroy( aSpawnPoints );
if( iAllSpawns >= TEAM_SPAWNPOINTS_COUNT )
return;
server_print( "FAILED: not all ^"%s^". Added %d", sClassname, TEAM_SPAWNPOINTS_COUNT - iAllSpawns );
}
CreateSpawnPoint( const sClassname[ ], Float: vecOrigin[ 3 ], Float: vecAngles[ 3 ], Float: flDistance )
{
new Float: vecOffset[ 8 ][ 2 ] = { { -1.0, 0.0 }, { 1.0, 0.0 }, { 0.0, -1.0 }, { 0.0, 1.0 }, { -1.0, -1.0 }, { 1.0, 1.0 }, { -1.0, 1.0 }, { 1.0, -1.0 } };
new Float: flRange;
new Float: flFraction;
new Float: vecSelect[ 3 ];
vecSelect[ 2 ] = vecOrigin[ 2 ];
for( new iDeepLevel = 0, j; iDeepLevel <= 4; iDeepLevel++ )
{
switch( iDeepLevel )
{
case 0: flRange = flDistance;
case 1: flRange = flDistance * 0.5;
case 2: flRange = flDistance * 1.5;
case 3: flRange = flDistance * 2.0;
case 4: flRange = flDistance * 2.5;
}
for( j = 0; j < sizeof vecOffset; j++ )
{
vecSelect[ 0 ] = vecOrigin[ 0 ] + flRange * vecOffset[ j ][ 0 ];
vecSelect[ 1 ] = vecOrigin[ 1 ] + flRange * vecOffset[ j ][ 1 ];
engfunc( EngFunc_TraceLine, vecOrigin, vecSelect, DONT_IGNORE_MONSTERS, -1, 0 );
get_tr2( 0, TR_flFraction, flFraction );
if( flFraction != 1.0 )
continue;
engfunc( EngFunc_TraceHull, vecSelect, vecSelect, 0, HULL_HUMAN, -1, 0 );
if( get_tr2( 0, TR_StartSolid ) || get_tr2( 0, TR_AllSolid ) || !get_tr2( 0, TR_InOpen ) )
continue;
new iEntity = rg_create_entity( sClassname, true );
if( is_nullent( iEntity ) )
continue;
engfunc( EngFunc_SetOrigin, iEntity, vecSelect );
set_entvar( iEntity, var_angles, vecAngles );
return iEntity;
}
}
return NULLENT;
}
here i have a lot of maps with over 40 spawns on them, so if you use them you dont need any plugin such as spawn editor:
https://disk.yandex.com/d/cauwFLLp3PR6Bx
the files has a password, wich i sent to you by pm