diff options
Diffstat (limited to 'src/game')
-rw-r--r-- | src/game/g_buildable.c | 25 | ||||
-rw-r--r-- | src/game/g_cmds.c | 29 | ||||
-rw-r--r-- | src/game/g_local.h | 1 | ||||
-rw-r--r-- | src/game/tremulous.h | 1 |
4 files changed, 46 insertions, 10 deletions
diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index 3783053..61a3460 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -2091,9 +2091,6 @@ void HNone_Think( gentity_t *self ) self->nextthink = level.time + 1000; } - -#define TRAPPER_ACCURACY 9 // lower is better - /* ================ ATrapper_FireOnEnemy @@ -5072,6 +5069,28 @@ static void G_LayoutBuildItem( buildable_t buildable, vec3_t origin, } /* +============== +G_LayoutExists + +Check if a layout with the given name exists for the given map. +============== +*/ +qboolean G_LayoutExists( char *mapName, char *layoutName ) +{ + fileHandle_t f; + int len; + if( !layoutName[ 0 ] || !Q_stricmp( layoutName, "*BUILTIN*" ) ) + return qtrue; + + len = trap_FS_FOpenFile( va( "layouts/%s/%s.dat", mapName, layoutName ), &f, FS_READ ); + if( len < 0 ) + return qfalse; + + trap_FS_FCloseFile( f ); + return qtrue; +} + +/* ============ G_LayoutLoad diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index f876553..77c6f82 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -1426,8 +1426,7 @@ void Cmd_CallVote_f( gentity_t *ent ) } else if( !Q_stricmp( vote, "map" ) ) { - if( (( level.time - level.startTime ) < 60 * 1000 ) - && ( level.numPlayingClients > 0 && level.numConnectedClients > 1 ) ) + if( (( level.time - level.startTime ) < 60 * 1000 ) ) { trap_SendServerCommand( ent-g_entities, "print \"You cannot call for a map change in the first minute.\n\"" ); return; @@ -1449,11 +1448,27 @@ void Cmd_CallVote_f( gentity_t *ent ) return; } - Com_sprintf( level.voteString[ team ], sizeof( level.voteString ), - "%s \"%s\"", vote, arg ); - Com_sprintf( level.voteDisplayString[ team ], - sizeof( level.voteDisplayString[ team ] ), - "Change to map '%s'", arg ); + if( reason[0] ) + { + if( !G_LayoutExists( arg, reason ) ) + { + trap_SendServerCommand( ent-g_entities, + va( "print \"%s: 'layouts/%s/%s.dat' could not be found on the server\n\"", + cmd, arg, reason ) ); + return; + } + Com_sprintf( level.voteString[ team ], sizeof( level.voteString ), + "%s \"%s\" \"%s\"", vote, arg, reason ); + Com_sprintf( level.voteDisplayString[ team ], + sizeof( level.voteDisplayString[ team ] ), + "Change to map '%s' (layout: '%s')", arg, reason ); + } else { + Com_sprintf( level.voteString[ team ], sizeof( level.voteString ), + "%s \"%s\"", vote, arg ); + Com_sprintf( level.voteDisplayString[ team ], + sizeof( level.voteDisplayString[ team ] ), + "Change to map '%s'", arg ); + } level.voteDelay[ team ] = 3000; } else if( !Q_stricmp( vote, "nextmap" ) ) diff --git a/src/game/g_local.h b/src/game/g_local.h index 37971ed..2683ac5 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -834,6 +834,7 @@ void FinishSpawningBuildable( gentity_t *ent ); void G_LayoutSave( char *name ); int G_LayoutList( const char *map, char *list, int len ); void G_LayoutSelect( void ); +qboolean G_LayoutExists( char *mapName, char *layoutName ); void G_LayoutLoad( void ); void G_BaseSelfDestruct( team_t team ); int G_NextQueueTime( int queuedBP, int totalBP, int queueBaseRate ); diff --git a/src/game/tremulous.h b/src/game/tremulous.h index 40c0823..f76f968 100644 --- a/src/game/tremulous.h +++ b/src/game/tremulous.h @@ -694,6 +694,7 @@ TREMULOUS EDGE MOD SRC FILE #define LOCKBLOB_LOCKTIME 5000 #define LOCKBLOB_DOT 0.85f // max angle = acos( LOCKBLOB_DOT ) #define LOCKBLOB_K_SCALE 1.0f +#define TRAPPER_ACCURACY 9 // lower is better #define OVERMIND_BP 0 #define OVERMIND_BT 30000 |