AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   1 spawnpoint & 32 users (https://forums.alliedmods.net/showthread.php?t=100576)

One 08-15-2009 20:21

1 spawnpoint & 32 users
 
is it poss? i mean when semiclip is on, players can spawn in other players or not?!.

Mxnn 08-15-2009 22:38

Re: 1 spawnpoint & 32 users
 
But if there are 1 spawnpoint only, the 32 users spawn in the same and dead or they stack..

Hunter-Digital 08-15-2009 23:47

Re: 1 spawnpoint & 32 users
 
I know if there aren't any spawns available you can't join the team... if you can get in the team by any chance (trick the menu or move yourself via amxx commands), two or more players can spawn on a spawn point but one of them will die... I think because they collide :-??

You can try it, hook Ham_Spawn as pre, make the spawning player not solid and see if it works... once he's out of the spawnpoint's range set him as solid.
If that doesn't work, hook Ham_Killed at spawning only, supercede it and set player as alive with flags and stuff...

Alka 08-16-2009 04:40

Re: 1 spawnpoint & 32 users
 
Hmm no.You can simply multiply the spawn points...

ConnorMcLeod 08-16-2009 05:10

Re: 1 spawnpoint & 32 users
 
I think that if there are 32 spawns with the same origin, and that if there is a player afk at this spawn point, players won't be able to spawn and server gonna crash.
The game checks if the spawnpoint is empty to allow players to spawn in it.
Can someone test this ?

Alka 08-16-2009 05:50

Re: 1 spawnpoint & 32 users
 
Yes, that's true, but as i can see he use a semiclip plugin or whatever...

ConnorMcLeod 08-16-2009 06:32

Re: 1 spawnpoint & 32 users
 
I meant, even with a semiclip.

Code:

BOOL IsSpawnPointValid( CBaseEntity *pPlayer, CBaseEntity *pSpot )
{
        CBaseEntity *ent = NULL;

        if ( !pSpot->IsTriggered( pPlayer ) )
        {
                return FALSE;
        }

        while ( (ent = UTIL_FindEntityInSphere( ent, pSpot->pev->origin, 128 )) != NULL )
        {
                // if ent is a client, don't spawn on 'em
                if ( ent->IsPlayer() && ent != pPlayer )
                        return FALSE;
        }

        return TRUE;
}

void CBasePlayer::Spawn( void )
{
        // [...]

        g_pGameRules->PlayerSpawn( this );
}

edict_t *CGameRules :: GetPlayerSpawnSpot( CBasePlayer *pPlayer )
{
        edict_t *pentSpawnSpot = EntSelectSpawnPoint( pPlayer );

        pPlayer->pev->origin = VARS(pentSpawnSpot)->origin + Vector(0,0,1);
        pPlayer->pev->v_angle  = g_vecZero;
        pPlayer->pev->velocity = g_vecZero;
        pPlayer->pev->angles = VARS(pentSpawnSpot)->angles;
        pPlayer->pev->punchangle = g_vecZero;
        pPlayer->pev->fixangle = TRUE;
       
        return pentSpawnSpot;
}

edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer )
{
        CBaseEntity *pSpot;
        edict_t                *player;

        player = pPlayer->edict();

// choose a info_player_deathmatch point
        if (g_pGameRules->IsCoOp())
        {
                pSpot = UTIL_FindEntityByClassname( g_pLastSpawn, "info_player_coop");
                if ( !FNullEnt(pSpot) )
                        goto ReturnSpot;
                pSpot = UTIL_FindEntityByClassname( g_pLastSpawn, "info_player_start");
                if ( !FNullEnt(pSpot) )
                        goto ReturnSpot;
        }
        else if ( g_pGameRules->IsDeathmatch() )
        {
                pSpot = g_pLastSpawn;
                // Randomize the start spot
                for ( int i = RANDOM_LONG(1,5); i > 0; i-- )
                        pSpot = UTIL_FindEntityByClassname( pSpot, "info_player_deathmatch" );
                if ( FNullEnt( pSpot ) )  // skip over the null point
                        pSpot = UTIL_FindEntityByClassname( pSpot, "info_player_deathmatch" );

                CBaseEntity *pFirstSpot = pSpot;

                do
                {
                        if ( pSpot )
                        {
                                // check if pSpot is valid
                                if ( IsSpawnPointValid( pPlayer, pSpot ) )
                                {
                                        if ( pSpot->pev->origin == Vector( 0, 0, 0 ) )
                                        {
                                                pSpot = UTIL_FindEntityByClassname( pSpot, "info_player_deathmatch" );
                                                continue;
                                        }

                                        // if so, go to pSpot
                                        goto ReturnSpot;
                                }
                        }
                        // increment pSpot
                        pSpot = UTIL_FindEntityByClassname( pSpot, "info_player_deathmatch" );
                } while ( pSpot != pFirstSpot ); // loop if we're not back to the start

                // we haven't found a place to spawn yet,  so kill any guy at the first spawn point and spawn there
                if ( !FNullEnt( pSpot ) )
                {
                        CBaseEntity *ent = NULL;
                        while ( (ent = UTIL_FindEntityInSphere( ent, pSpot->pev->origin, 128 )) != NULL )
                        {
                                // if ent is a client, kill em (unless they are ourselves)
                                if ( ent->IsPlayer() && !(ent->edict() == player) )
                                        ent->TakeDamage( VARS(INDEXENT(0)), VARS(INDEXENT(0)), 300, DMG_GENERIC );
                        }
                        goto ReturnSpot;
                }
        }

        // If startspot is set, (re)spawn there.
        if ( FStringNull( gpGlobals->startspot ) || !strlen(STRING(gpGlobals->startspot)))
        {
                pSpot = UTIL_FindEntityByClassname(NULL, "info_player_start");
                if ( !FNullEnt(pSpot) )
                        goto ReturnSpot;
        }
        else
        {
                pSpot = UTIL_FindEntityByTargetname( NULL, STRING(gpGlobals->startspot) );
                if ( !FNullEnt(pSpot) )
                        goto ReturnSpot;
        }

ReturnSpot:
        if ( FNullEnt( pSpot ) )
        {
                ALERT(at_error, "PutClientInServer: no info_player_start on level");
                return INDEXENT(0);
        }

        g_pLastSpawn = pSpot;
        return pSpot->edict();
}


Hunter-Digital 08-16-2009 06:52

Re: 1 spawnpoint & 32 users
 
One, you could simply change the origin of players after they spawn to the origin of the single spawn point.

One 08-16-2009 07:23

Re: 1 spawnpoint & 32 users
 
ty ppl. @hunter : no. i want it so. :P


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

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