From c0e95997d9e9fcaa220704c8c67b50d6761d1b66 Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Mon, 9 Sep 2002 23:32:27 +0000 Subject: * General tidy up and beautification of code * Removal of most of the legacy Q3A stuff * Cursor no longer displayed on load screen * (Biggest commit EVAR?) --- src/game/bg_lib.c | 1692 +++++++++++++++++++++++++---------------------- src/game/bg_lib.h | 68 +- src/game/bg_local.h | 13 +- src/game/bg_misc.c | 360 +++++----- src/game/bg_pmove.c | 1211 +++++++++++++++++---------------- src/game/bg_public.h | 123 ++-- src/game/bg_slidemove.c | 380 +++++------ src/game/g_active.c | 607 +++++++++-------- src/game/g_buildable.c | 194 ++---- src/game/g_client.c | 527 +++++++-------- src/game/g_cmds.c | 383 ++++------- src/game/g_combat.c | 304 ++++----- src/game/g_local.h | 956 +++++++++++--------------- src/game/g_main.c | 844 ++++++++++------------- src/game/g_mem.c | 35 +- src/game/g_misc.c | 121 ++-- src/game/g_missile.c | 114 ++-- src/game/g_mover.c | 914 +++++++++++++------------ src/game/g_session.c | 18 +- src/game/g_spawn.c | 350 +++++----- src/game/g_svcmds.c | 364 +++++----- src/game/g_syscalls.asm | 276 ++------ src/game/g_syscalls.c | 793 ++++------------------ src/game/g_target.c | 211 +++--- src/game/g_team.c | 103 ++- src/game/g_trigger.c | 232 ++++--- src/game/g_utils.c | 739 +++++++++++---------- src/game/g_weapon.c | 20 - src/game/q_math.c | 207 +++--- src/game/q_shared.c | 308 +++++---- 30 files changed, 5751 insertions(+), 6716 deletions(-) (limited to 'src/game') diff --git a/src/game/bg_lib.c b/src/game/bg_lib.c index cd241f77..f5aea779 100644 --- a/src/game/bg_lib.c +++ b/src/game/bg_lib.c @@ -1,7 +1,5 @@ // Copyright (C) 1999-2000 Id Software, Inc. // -// Copyright (C) 1999-2000 Id Software, Inc. -// // bg_lib,c -- standard C library replacement routines used by code // compiled for the virtual machine @@ -22,7 +20,7 @@ /*- * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -34,8 +32,8 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. + * This product includes software developed by the University of + * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -55,7 +53,7 @@ #if defined(LIBC_SCCS) && !defined(lint) #if 0 -static char sccsid[] = "@(#)qsort.c 8.1 (Berkeley) 6/4/93"; +static char sccsid[] = "@(#)qsort.c 8.1 (Berkeley) 6/4/93"; #endif static const char rcsid[] = "$Id$"; @@ -67,140 +65,140 @@ typedef int cmp_t(const void *, const void *); #endif static char* med3(char *, char *, char *, cmp_t *); -static void swapfunc(char *, char *, int, int); +static void swapfunc(char *, char *, int, int); #ifndef min -#define min(a, b) (a) < (b) ? a : b +#define min(a, b) (a) < (b) ? a : b #endif /* * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". */ -#define swapcode(TYPE, parmi, parmj, n) { \ - long i = (n) / sizeof (TYPE); \ - register TYPE *pi = (TYPE *) (parmi); \ - register TYPE *pj = (TYPE *) (parmj); \ - do { \ - register TYPE t = *pi; \ - *pi++ = *pj; \ - *pj++ = t; \ - } while (--i > 0); \ +#define swapcode(TYPE, parmi, parmj, n) { \ + long i = (n) / sizeof (TYPE); \ + register TYPE *pi = (TYPE *) (parmi); \ + register TYPE *pj = (TYPE *) (parmj); \ + do { \ + register TYPE t = *pi; \ + *pi++ = *pj; \ + *pj++ = t; \ + } while (--i > 0); \ } #define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ - es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; + es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; static void swapfunc(a, b, n, swaptype) - char *a, *b; - int n, swaptype; + char *a, *b; + int n, swaptype; { - if(swaptype <= 1) - swapcode(long, a, b, n) - else - swapcode(char, a, b, n) + if(swaptype <= 1) + swapcode(long, a, b, n) + else + swapcode(char, a, b, n) } -#define swap(a, b) \ - if (swaptype == 0) { \ - long t = *(long *)(a); \ - *(long *)(a) = *(long *)(b); \ - *(long *)(b) = t; \ - } else \ - swapfunc(a, b, es, swaptype) +#define swap(a, b) \ + if (swaptype == 0) { \ + long t = *(long *)(a); \ + *(long *)(a) = *(long *)(b); \ + *(long *)(b) = t; \ + } else \ + swapfunc(a, b, es, swaptype) -#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) +#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) static char * med3(a, b, c, cmp) - char *a, *b, *c; - cmp_t *cmp; + char *a, *b, *c; + cmp_t *cmp; { - return cmp(a, b) < 0 ? - (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a )) + return cmp(a, b) < 0 ? + (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a )) :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c )); } void qsort(a, n, es, cmp) - void *a; - size_t n, es; - cmp_t *cmp; + void *a; + size_t n, es; + cmp_t *cmp; { - char *pa, *pb, *pc, *pd, *pl, *pm, *pn; - int d, r, swaptype, swap_cnt; - -loop: SWAPINIT(a, es); - swap_cnt = 0; - if (n < 7) { - for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) - for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; - pl -= es) - swap(pl, pl - es); - return; - } - pm = (char *)a + (n / 2) * es; - if (n > 7) { - pl = a; - pn = (char *)a + (n - 1) * es; - if (n > 40) { - d = (n / 8) * es; - pl = med3(pl, pl + d, pl + 2 * d, cmp); - pm = med3(pm - d, pm, pm + d, cmp); - pn = med3(pn - 2 * d, pn - d, pn, cmp); - } - pm = med3(pl, pm, pn, cmp); - } - swap(a, pm); - pa = pb = (char *)a + es; - - pc = pd = (char *)a + (n - 1) * es; - for (;;) { - while (pb <= pc && (r = cmp(pb, a)) <= 0) { - if (r == 0) { - swap_cnt = 1; - swap(pa, pb); - pa += es; - } - pb += es; - } - while (pb <= pc && (r = cmp(pc, a)) >= 0) { - if (r == 0) { - swap_cnt = 1; - swap(pc, pd); - pd -= es; - } - pc -= es; - } - if (pb > pc) - break; - swap(pb, pc); - swap_cnt = 1; - pb += es; - pc -= es; - } - if (swap_cnt == 0) { /* Switch to insertion sort */ - for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) - for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; - pl -= es) - swap(pl, pl - es); - return; - } - - pn = (char *)a + n * es; - r = min(pa - (char *)a, pb - pa); - vecswap(a, pb - r, r); - r = min(pd - pc, pn - pd - es); - vecswap(pb, pn - r, r); - if ((r = pb - pa) > es) - qsort(a, r / es, es, cmp); - if ((r = pd - pc) > es) { - /* Iterate rather than recurse to save stack space */ - a = pn - r; - n = r / es; - goto loop; - } -/* qsort(pn - r, r / es, es, cmp);*/ + char *pa, *pb, *pc, *pd, *pl, *pm, *pn; + int d, r, swaptype, swap_cnt; + +loop: SWAPINIT(a, es); + swap_cnt = 0; + if (n < 7) { + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + pm = (char *)a + (n / 2) * es; + if (n > 7) { + pl = a; + pn = (char *)a + (n - 1) * es; + if (n > 40) { + d = (n / 8) * es; + pl = med3(pl, pl + d, pl + 2 * d, cmp); + pm = med3(pm - d, pm, pm + d, cmp); + pn = med3(pn - 2 * d, pn - d, pn, cmp); + } + pm = med3(pl, pm, pn, cmp); + } + swap(a, pm); + pa = pb = (char *)a + es; + + pc = pd = (char *)a + (n - 1) * es; + for (;;) { + while (pb <= pc && (r = cmp(pb, a)) <= 0) { + if (r == 0) { + swap_cnt = 1; + swap(pa, pb); + pa += es; + } + pb += es; + } + while (pb <= pc && (r = cmp(pc, a)) >= 0) { + if (r == 0) { + swap_cnt = 1; + swap(pc, pd); + pd -= es; + } + pc -= es; + } + if (pb > pc) + break; + swap(pb, pc); + swap_cnt = 1; + pb += es; + pc -= es; + } + if (swap_cnt == 0) { /* Switch to insertion sort */ + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + + pn = (char *)a + n * es; + r = min(pa - (char *)a, pb - pa); + vecswap(a, pb - r, r); + r = min(pd - pc, pn - pd - es); + vecswap(pb, pn - r, r); + if ((r = pb - pa) > es) + qsort(a, r / es, es, cmp); + if ((r = pd - pc) > es) { + /* Iterate rather than recurse to save stack space */ + a = pn - r; + n = r / es; + goto loop; + } +/* qsort(pn - r, r / es, es, cmp);*/ } //================================================================================== @@ -211,49 +209,56 @@ loop: SWAPINIT(a, es); // bk001211 - gcc errors on compiling strcpy: parse error before `__extension__' #if defined ( Q3_VM ) -size_t strlen( const char *string ) { - const char *s; +size_t strlen( const char *string ) +{ + const char *s; + + s = string; + while( *s ) + s++; - s = string; - while ( *s ) { - s++; - } - return s - string; + return s - string; } -char *strcat( char *strDestination, const char *strSource ) { - char *s; +char *strcat( char *strDestination, const char *strSource ) +{ + char *s; - s = strDestination; - while ( *s ) { - s++; - } - while ( *strSource ) { - *s++ = *strSource++; - } - *s = 0; - return strDestination; + s = strDestination; + while( *s ) + s++; + + while( *strSource ) + *s++ = *strSource++; + + *s = 0; + return strDestination; } -char *strcpy( char *strDestination, const char *strSource ) { - char *s; +char *strcpy( char *strDestination, const char *strSource ) +{ + char *s; - s = strDestination; - while ( *strSource ) { - *s++ = *strSource++; - } - *s = 0; - return strDestination; + s = strDestination; + + while( *strSource ) + *s++ = *strSource++; + + *s = 0; + return strDestination; } -int strcmp( const char *string1, const char *string2 ) { - while ( *string1 == *string2 && *string1 && *string2 ) { - string1++; - string2++; - } - return *string1 - *string2; +int strcmp( const char *string1, const char *string2 ) +{ + while( *string1 == *string2 && *string1 && *string2 ) + { + string1++; + string2++; + } + + return *string1 - *string2; } //TA: @@ -262,42 +267,47 @@ char *strrchr( const char *string, int c ) int i, length = strlen( string ); char *p; - for( i = length - 1; i >= 0; i-- ) + for( i = length - 1; i >= 0; i-- ) { p = (char *)&string[ i ]; - if( *p == c ) - return (char *)p; - } + if( *p == c ) + return (char *)p; + } - return (char *)0; + return (char *)0; } -char *strchr( const char *string, int c ) { - while ( *string ) { - if ( *string == c ) { - return ( char * )string; - } - string++; - } - return (char *)0; +char *strchr( const char *string, int c ) +{ + while( *string ) + { + if( *string == c ) + return ( char * )string; + + string++; + } + return (char *)0; } -char *strstr( const char *string, const char *strCharSet ) { - while ( *string ) { - int i; - - for ( i = 0 ; strCharSet[i] ; i++ ) { - if ( string[i] != strCharSet[i] ) { - break; - } - } - if ( !strCharSet[i] ) { - return (char *)string; - } - string++; - } - return (char *)0; +char *strstr( const char *string, const char *strCharSet ) +{ + while( *string ) + { + int i; + + for( i = 0; strCharSet[ i ]; i++ ) + { + if( string[ i ] != strCharSet[ i ] ) + break; + } + + if( !strCharSet[ i ] ) + return (char *)string; + + string++; + } + return (char *)0; } #endif // bk001211 @@ -307,95 +317,100 @@ char *strstr( const char *string, const char *strCharSet ) { // bk001127 - undid undo #if defined ( Q3_VM ) -int tolower( int c ) { - if ( c >= 'A' && c <= 'Z' ) { - c += 'a' - 'A'; - } - return c; +int tolower( int c ) +{ + if( c >= 'A' && c <= 'Z' ) + c += 'a' - 'A'; + + return c; } -int toupper( int c ) { - if ( c >= 'a' && c <= 'z' ) { - c += 'A' - 'a'; - } - return c; +int toupper( int c ) +{ + if( c >= 'a' && c <= 'z' ) + c += 'A' - 'a'; + + return c; } #endif //#ifndef _MSC_VER -void *memmove( void *dest, const void *src, size_t count ) { - int i; - - if ( dest > src ) { - for ( i = count-1 ; i >= 0 ; i-- ) { - ((char *)dest)[i] = ((char *)src)[i]; - } - } else { - for ( i = 0 ; i < count ; i++ ) { - ((char *)dest)[i] = ((char *)src)[i]; - } - } - return dest; +void *memmove( void *dest, const void *src, size_t count ) +{ + int i; + + if( dest > src ) + { + for( i = count - 1; i >= 0; i-- ) + ( (char *)dest )[ i ] = ( (char *)src )[ i ]; + } + else + { + for( i = 0; i < count; i++ ) + ( (char *)dest )[ i ] = ( (char *)src )[ i ]; + } + + return dest; } #if 0 double floor( double x ) { - return (int)(x + 0x40000000) - 0x40000000; + return (int)(x + 0x40000000) - 0x40000000; } void *memset( void *dest, int c, size_t count ) { - while ( count-- ) { - ((char *)dest)[count] = c; - } - return dest; + while ( count-- ) { + ((char *)dest)[count] = c; + } + return dest; } void *memcpy( void *dest, const void *src, size_t count ) { - while ( count-- ) { - ((char *)dest)[count] = ((char *)src)[count]; - } - return dest; + while ( count-- ) { + ((char *)dest)[count] = ((char *)src)[count]; + } + return dest; } char *strncpy( char *strDest, const char *strSource, size_t count ) { - char *s; - - s = strDest; - while ( *strSource && count ) { - *s++ = *strSource++; - count--; - } - while ( count-- ) { - *s++ = 0; - } - return strDest; + char *s; + + s = strDest; + while ( *strSource && count ) { + *s++ = *strSource++; + count--; + } + while ( count-- ) { + *s++ = 0; + } + return strDest; } double sqrt( double x ) { - float y; - float delta; - float maxError; + float y; + float delta; + float maxError; - if ( x <= 0 ) { - return 0; - } + if ( x <= 0 ) { + return 0; + } - // initial guess - y = x / 2; + // initial guess + y = x / 2; - // refine - maxError = x * 0.001; + // refine + maxError = x * 0.001; - do { - delta = ( y * y ) - x; - y -= delta / ( 2 * y ); - } while ( delta > maxError || delta < -maxError ); + do { + delta = ( y * y ) - x; + y -= delta / ( 2 * y ); + } while ( delta > maxError || delta < -maxError ); - return y; + return y; } @@ -531,44 +546,44 @@ float sintable[1024] = { }; double sin( double x ) { - int index; - int quad; - - index = 1024 * x / (M_PI * 0.5); - quad = ( index >> 10 ) & 3; - index &= 1023; - switch ( quad ) { - case 0: - return sintable[index]; - case 1: - return sintable[1023-index]; - case 2: - return -sintable[index]; - case 3: - return -sintable[1023-index]; - } - return 0; + int index; + int quad; + + index = 1024 * x / (M_PI * 0.5); + quad = ( index >> 10 ) & 3; + index &= 1023; + switch ( quad ) { + case 0: + return sintable[index]; + case 1: + return sintable[1023-index]; + case 2: + return -sintable[index]; + case 3: + return -sintable[1023-index]; + } + return 0; } double cos( double x ) { - int index; - int quad; - - index = 1024 * x / (M_PI * 0.5); - quad = ( index >> 10 ) & 3; - index &= 1023; - switch ( quad ) { - case 3: - return sintable[index]; - case 0: - return sintable[1023-index]; - case 1: - return -sintable[index]; - case 2: - return -sintable[1023-index]; - } - return 0; + int index; + int quad; + + index = 1024 * x / (M_PI * 0.5); + quad = ( index >> 10 ) & 3; + index &= 1023; + switch ( quad ) { + case 3: + return sintable[index]; + case 0: + return sintable[1023-index]; + case 1: + return -sintable[index]; + case 2: + return -sintable[1023-index]; + } + return 0; } @@ -736,59 +751,59 @@ double acos( double x ) { double atan2( double y, double x ) { - float base; - float temp; - float dir; - float test; - int i; - - if ( x < 0 ) { - if ( y >= 0 ) { - // quad 1 - base = M_PI / 2; - temp = x; - x = y; - y = -temp; - } else { - // quad 2 - base = M_PI; - x = -x; - y = -y; - } - } else { - if ( y < 0 ) { - // quad 3 - base = 3 * M_PI / 2; - temp = x; - x = -y; - y = temp; - } - } - - if ( y > x ) { - base += M_PI/2; - temp = x; - x = y; - y = temp; - dir = -1; - } else { - dir = 1; - } - - // calcualte angle in octant 0 - if ( x == 0 ) { - return base; - } - y /= x; - - for ( i = 0 ; i < 512 ; i++ ) { - test = sintable[i] / sintable[1023-i]; - if ( test > y ) { - break; - } - } - - return base + dir * i * ( M_PI/2048); + float base; + float temp; + float dir; + float test; + int i; + + if ( x < 0 ) { + if ( y >= 0 ) { + // quad 1 + base = M_PI / 2; + temp = x; + x = y; + y = -temp; + } else { + // quad 2 + base = M_PI; + x = -x; + y = -y; + } + } else { + if ( y < 0 ) { + // quad 3 + base = 3 * M_PI / 2; + temp = x; + x = -y; + y = temp; + } + } + + if ( y > x ) { + base += M_PI/2; + temp = x; + x = y; + y = temp; + dir = -1; + } else { + dir = 1; + } + + // calcualte angle in octant 0 + if ( x == 0 ) { + return base; + } + y /= x; + + for ( i = 0 ; i < 512 ; i++ ) { + test = sintable[i] / sintable[1023-i]; + if ( test > y ) { + break; + } + } + + return base + dir * i * ( M_PI/2048); } @@ -797,8 +812,9 @@ double atan2( double y, double x ) { #ifdef Q3_VM // bk001127 - guarded this tan replacement // ld: undefined versioned symbol name tan@@GLIBC_2.0 -double tan( double x ) { - return sin(x) / cos(x); +double tan( double x ) +{ + return sin( x ) / cos( x ); } /* @@ -862,27 +878,27 @@ acos */ double acos( double x ) { - float z, p, q, r, w, s, c, df; - int hx, ix; + float z, p, q, r, w, s, c, df; + int hx, ix; - GET_FLOAT_WORD( hx, x ); - ix = hx & 0x7fffffff; + GET_FLOAT_WORD( hx, x ); + ix = hx & 0x7fffffff; - if( ix == 0x3f800000 ) - { /* |x|==1 */ - if( hx > 0 ) - return 0.0; /* acos(1) = 0 */ - else - return pi + (float)2.0 * pio2_lo; /* acos(-1)= pi */ - } + if( ix == 0x3f800000 ) + { /* |x|==1 */ + if( hx > 0 ) + return 0.0; /* acos(1) = 0 */ + else + return pi + (float)2.0 * pio2_lo; /* acos(-1)= pi */ + } else if( ix > 0x3f800000 ) - { /* |x| >= 1 */ - return (x-x)/(x-x); /* acos(|x|>1) is NaN */ - } + { /* |x| >= 1 */ + return (x-x)/(x-x); /* acos(|x|>1) is NaN */ + } - if( ix < 0x3f000000 ) - { /* |x| < 0.5 */ - if( ix <= 0x23000000 ) + if( ix < 0x3f000000 ) + { /* |x| < 0.5 */ + if( ix <= 0x23000000 ) return pio2_hi + pio2_lo;/*if|x|<2**-57*/ z = x * x; @@ -890,9 +906,9 @@ double acos( double x ) q = 1.0 + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); r = p / q; return pio2_hi - ( x - ( pio2_lo - x * r ) ); - } + } else if( hx < 0 ) - { /* x < -0.5 */ + { /* x < -0.5 */ z = ( 1.0 + x ) * (float)0.5; p = z * ( pS0 + z * ( pS1 + z * ( pS2 + z * ( pS3 + z * ( pS4 + z * pS5 ) ) ) ) ); q = 1.0 + z * ( qS1 + z * ( qS2 + z * ( qS3 + z * qS4 ) ) ); @@ -900,9 +916,9 @@ double acos( double x ) r = p / q; w = r * s - pio2_lo; return pi - (float)2.0 * ( s + w ); - } + } else - { /* x > 0.5 */ + { /* x > 0.5 */ int idf; z = ( 1.0 - x ) * (float)0.5; s = sqrt( z ); @@ -915,7 +931,7 @@ double acos( double x ) r = p / q; w = r * s + c; return (double)( 2.0 * ( df + w ) ); - } + } } //pow @@ -1276,148 +1292,170 @@ float pow( float x, float y ) static int randSeed = 0; -void srand( unsigned seed ) { - randSeed = seed; +void srand( unsigned seed ) +{ + randSeed = seed; } -int rand( void ) { - randSeed = (69069 * randSeed + 1); - return randSeed & 0x7fff; +int rand( void ) +{ + randSeed = ( 69069 * randSeed + 1 ); + return randSeed & 0x7fff; } -double atof( const char *string ) { - float sign; - float value; - int c; - - - // skip whitespace - while ( *string <= ' ' ) { - if ( !*string ) { - return 0; - } - string++; - } - - // check sign - switch ( *string ) { - case '+': - string++; - sign = 1; - break; - case '-': - string++; - sign = -1; - break; - default: - sign = 1; - break; - } - - // read digits - value = 0; - c = string[0]; - if ( c != '.' ) { - do { - c = *string++; - if ( c < '0' || c > '9' ) { - break; - } - c -= '0'; - value = value * 10 + c; - } while ( 1 ); - } else { - string++; - } - - // check for decimal point - if ( c == '.' ) { - double fraction; - - fraction = 0.1; - do { - c = *string++; - if ( c < '0' || c > '9' ) { - break; - } - c -= '0'; - value += c * fraction; - fraction *= 0.1; - } while ( 1 ); - - } - - // not handling 10e10 notation... - - return value * sign; +double atof( const char *string ) +{ + float sign; + float value; + int c; + + // skip whitespace + while( *string <= ' ' ) + { + if( !*string ) + return 0; + + string++; + } + + // check sign + switch( *string ) + { + case '+': + string++; + sign = 1; + break; + + case '-': + string++; + sign = -1; + break; + + default: + sign = 1; + break; + } + + // read digits + value = 0; + c = string[ 0 ]; + + if( c != '.' ) + { + do + { + c = *string++; + if( c < '0' || c > '9' ) + break; + + c -= '0'; + value = value * 10 + c; + } while( 1 ); + } + else + string++; + + // check for decimal point + if( c == '.' ) + { + double fraction; + + fraction = 0.1; + do + { + c = *string++; + if( c < '0' || c > '9' ) + break; + + c -= '0'; + value += c * fraction; + fraction *= 0.1; + } while( 1 ); + + } + + // not handling 10e10 notation... + + return value * sign; } -double _atof( const char **stringPtr ) { - const char *string; - float sign; - float value; +double _atof( const char **stringPtr ) +{ + const char *string; + float sign; + float value; int c = '0'; // bk001211 - uninitialized use possible - string = *stringPtr; - - // skip whitespace - while ( *string <= ' ' ) { - if ( !*string ) { - *stringPtr = string; - return 0; - } - string++; - } - - // check sign - switch ( *string ) { - case '+': - string++; - sign = 1; - break; - case '-': - string++; - sign = -1; - break; - default: - sign = 1; - break; - } - - // read digits - value = 0; - if ( string[0] != '.' ) { - do { - c = *string++; - if ( c < '0' || c > '9' ) { - break; - } - c -= '0'; - value = value * 10 + c; - } while ( 1 ); - } - - // check for decimal point - if ( c == '.' ) { - double fraction; - - fraction = 0.1; - do { - c = *string++; - if ( c < '0' || c > '9' ) { - break; - } - c -= '0'; - value += c * fraction; - fraction *= 0.1; - } while ( 1 ); - - } - - // not handling 10e10 notation... - *stringPtr = string; - - return value * sign; + string = *stringPtr; + + // skip whitespace + while( *string <= ' ' ) + { + if( !*string ) + { + *stringPtr = string; + return 0; + } + + string++; + } + + // check sign + switch( *string ) + { + case '+': + string++; + sign = 1; + break; + + case '-': + string++; + sign = -1; + break; + + default: + sign = 1; + break; + } + + // read digits + value = 0; + if( string[ 0 ] != '.' ) + { + do + { + c = *string++; + if( c < '0' || c > '9' ) + break; + + c -= '0'; + value = value * 10 + c; + } while( 1 ); + } + + // check for decimal point + if( c == '.' ) + { + double fraction; + + fraction = 0.1; + do + { + c = *string++; + if( c < '0' || c > '9' ) + break; + + c -= '0'; + value += c * fraction; + fraction *= 0.1; + } while( 1 ); + + } + + // not handling 10e10 notation... + *stringPtr = string; + + return value * sign; } @@ -1427,107 +1465,120 @@ double _atof( const char **stringPtr ) { // bk001127 - undid undo #if defined ( Q3_VM ) -int atoi( const char *string ) { - int sign; - int value; - int c; - - - // skip whitespace - while ( *string <= ' ' ) { - if ( !*string ) { - return 0; - } - string++; - } - - // check sign - switch ( *string ) { - case '+': - string++; - sign = 1; - break; - case '-': - string++; - sign = -1; - break; - default: - sign = 1; - break; - } - - // read digits - value = 0; - do { - c = *string++; - if ( c < '0' || c > '9' ) { - break; - } - c -= '0'; - value = value * 10 + c; - } while ( 1 ); - - // not handling 10e10 notation... - - return value * sign; +int atoi( const char *string ) +{ + int sign; + int value; + int c; + + // skip whitespace + while( *string <= ' ' ) + { + if( !*string ) + return 0; + + string++; + } + + // check sign + switch( *string ) + { + case '+': + string++; + sign = 1; + break; + + case '-': + string++; + sign = -1; + break; + + default: + sign = 1; + break; + } + + // read digits + value = 0; + do + { + c = *string++; + if( c < '0' || c > '9' ) + break; + + c -= '0'; + value = value * 10 + c; + } while( 1 ); + + // not handling 10e10 notation... + + return value * sign; } -int _atoi( const char **stringPtr ) { - int sign; - int value; - int c; - const char *string; - - string = *stringPtr; - - // skip whitespace - while ( *string <= ' ' ) { - if ( !*string ) { - return 0; - } - string++; - } - - // check sign - switch ( *string ) { - case '+': - string++; - sign = 1; - break; - case '-': - string++; - sign = -1; - break; - default: - sign = 1; - break; - } - - // read digits - value = 0; - do { - c = *string++; - if ( c < '0' || c > '9' ) { - break; - } - c -= '0'; - value = value * 10 + c; - } while ( 1 ); - - // not handling 10e10 notation... - - *stringPtr = string; - - return value * sign; +int _atoi( const char **stringPtr ) +{ + int sign; + int value; + int c; + const char *string; + + string = *stringPtr; + + // skip whitespace + while( *string <= ' ' ) + { + if( !*string ) + return 0; + + string++; + } + + // check sign + switch( *string ) + { + case '+': + string++; + sign = 1; + break; + + case '-': + string++; + sign = -1; + break; + + default: + sign = 1; + break; + } + + // read digits + value = 0; + do + { + c = *string++; + if( c < '0' || c > '9' ) + break; + + c -= '0'; + value = value * 10 + c; + } while( 1 ); + + // not handling 10e10 notation... + + *stringPtr = string; + + return value * sign; } -int abs( int n ) { - return n < 0 ? -n : n; +int abs( int n ) +{ + return n < 0 ? -n : n; } -double fabs( double x ) { - return x < 0 ? -x : x; +double fabs( double x ) +{ + return x < 0 ? -x : x; } @@ -1535,156 +1586,163 @@ double fabs( double x ) { //========================================================= -#define ALT 0x00000001 /* alternate form */ -#define HEXPREFIX 0x00000002 /* add 0x or 0X prefix */ -#define LADJUST 0x00000004 /* left adjustment */ -#define LONGDBL 0x00000008 /* long double */ -#define LONGINT 0x00000010 /* long integer */ -#define QUADINT 0x00000020 /* quad integer */ -#define SHORTINT 0x00000040 /* short integer */ -#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */ -#define FPT 0x00000100 /* floating point number */ - -#define to_digit(c) ((c) - '0') -#define is_digit(c) ((unsigned)to_digit(c) <= 9) -#define to_char(n) ((n) + '0') - -void AddInt( char **buf_p, int val, int width, int flags ) { - char text[32]; - int digits; - int signedVal; - char *buf; - - digits = 0; - signedVal = val; - if ( val < 0 ) { - val = -val; - } - do { - text[digits++] = '0' + val % 10; - val /= 10; - } while ( val ); - - if ( signedVal < 0 ) { - text[digits++] = '-'; - } - - buf = *buf_p; - - if( !( flags & LADJUST ) ) { - while ( digits < width ) { - *buf++ = ( flags & ZEROPAD ) ? '0' : ' '; - width--; - } - } - - while ( digits-- ) { - *buf++ = text[digits]; - width--; - } - - if( flags & LADJUST ) { - while ( width-- ) { - *buf++ = ( flags & ZEROPAD ) ? '0' : ' '; - } - } - - *buf_p = buf; +#define ALT 0x00000001 /* alternate form */ +#define HEXPREFIX 0x00000002 /* add 0x or 0X prefix */ +#define LADJUST 0x00000004 /* left adjustment */ +#define LONGDBL 0x00000008 /* long double */ +#define LONGINT 0x00000010 /* long integer */ +#define QUADINT 0x00000020 /* quad integer */ +#define SHORTINT 0x00000040 /* short integer */ +#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */ +#define FPT 0x00000100 /* floating point number */ + +#define to_digit(c) ((c) - '0') +#define is_digit(c) ((unsigned)to_digit(c) <= 9) +#define to_char(n) ((n) + '0') + +void AddInt( char **buf_p, int val, int width, int flags ) +{ + char text[ 32 ]; + int digits; + int signedVal; + char *buf; + + digits = 0; + signedVal = val; + if( val < 0 ) + val = -val; + + do + { + text[ digits++ ] = '0' + val % 10; + val /= 10; + } while( val ); + + if( signedVal < 0 ) + text[ digits++ ] = '-'; + + buf = *buf_p; + + if( !( flags & LADJUST ) ) + { + while( digits < width ) + { + *buf++ = ( flags & ZEROPAD ) ? '0' : ' '; + width--; + } + } + + while( digits-- ) + { + *buf++ = text[ digits ]; + width--; + } + + if( flags & LADJUST ) + { + while( width-- ) + *buf++ = ( flags & ZEROPAD ) ? '0' : ' '; + } + + *buf_p = buf; } -void AddFloat( char **buf_p, float fval, int width, int prec ) { - char text[32]; - int digits; - float signedVal; - char *buf; - int val; +void AddFloat( char **buf_p, float fval, int width, int prec ) +{ + char text[ 32 ]; + int digits; + float signedVal; + char *buf; + int val; // get the sign - signedVal = fval; - if ( fval < 0 ) { - fval = -fval; - } + signedVal = fval; + if( fval < 0 ) + fval = -fval; // write the float number digits = 0; - val = (int)fval; - do { - text[digits++] = '0' + val % 10; - val /= 10; - } while ( val ); + val = (int)fval; + + do + { + text[ digits++ ] = '0' + val % 10; + val /= 10; + } while( val ); - if ( signedVal < 0 ) { - text[digits++] = '-'; - } + if( signedVal < 0 ) + text[digits++] = '-'; - buf = *buf_p; + buf = *buf_p; - while ( digits < width ) { - *buf++ = ' '; - width--; - } + while( digits < width ) + *buf++ = ' '; + width--; - while ( digits-- ) { - *buf++ = text[digits]; - } + while( digits-- ) + *buf++ = text[ digits ]; - *buf_p = buf; + *buf_p = buf; - if (prec < 0) + if( prec < 0 ) prec = 6; + // write the fraction digits = 0; - while (digits < prec) { - fval -= (int) fval; + + while( digits < prec ) + { + fval -= (int)fval; fval *= 10.0; - val = (int) fval; - text[digits++] = '0' + val % 10; + val = (int)fval; + text[ digits++ ] = '0' + val % 10; } - if (digits > 0) { + if( digits > 0 ) + { buf = *buf_p; *buf++ = '.'; - for (prec = 0; prec < digits; prec++) { - *buf++ = text[prec]; - } + for( prec = 0; prec < digits; prec++ ) + *buf++ = text[ prec ]; + *buf_p = buf; } } -void AddString( char **buf_p, char *string, int width, int prec ) { - int size; - char *buf; +void AddString( char **buf_p, char *string, int width, int prec ) +{ + int size; + char *buf; - buf = *buf_p; + buf = *buf_p; - if ( string == NULL ) { - string = "(null)"; - prec = -1; - } + if( string == NULL ) + { + string = "(null)"; + prec = -1; + } - if ( prec >= 0 ) { - for( size = 0; size < prec; size++ ) { - if( string[size] == '\0' ) { - break; - } - } - } - else { - size = strlen( string ); - } + if( prec >= 0 ) + { + for( size = 0; size < prec; size++ ) + { + if( string[ size ] == '\0' ) + break; + } + } + else + size = strlen( string ); - width -= size; + width -= size; - while( size-- ) { - *buf++ = *string++; - } + while( size-- ) + *buf++ = *string++; - while( width-- > 0 ) { - *buf++ = ' '; - } + while( width-- > 0 ) + *buf++ = ' '; - *buf_p = buf; + *buf_p = buf; } /* @@ -1695,139 +1753,157 @@ just to keep it simpler. For example, the '*' and '$' are not currently supported. I've tried to make it so that it will just parse and ignore formats we don't support. */ -int vsprintf( char *buffer, const char *fmt, va_list argptr ) { - int *arg; - char *buf_p; - char ch; - int flags; - int width; - int prec; - int n; - char sign; - - buf_p = buffer; - arg = (int *)argptr; - - while( qtrue ) { - // run through the format string until we hit a '%' or '\0' - for ( ch = *fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++ ) { - *buf_p++ = ch; - } - if ( ch == '\0' ) { - goto done; - } - - // skip over the '%' - fmt++; - - // reset formatting state - flags = 0; - width = 0; - prec = -1; - sign = '\0'; +int vsprintf( char *buffer, const char *fmt, va_list argptr ) +{ + int *arg; + char *buf_p; + char ch; + int flags; + int width; + int prec; + int n; + char sign; + + buf_p = buffer; + arg = (int *)argptr; + + while( qtrue ) + { + // run through the format string until we hit a '%' or '\0' + for( ch = *fmt; ( ch = *fmt ) != '\0' && ch != '%'; fmt++ ) + *buf_p++ = ch; + + if( ch == '\0' ) + goto done; + + // skip over the '%' + fmt++; + + // reset formatting state + flags = 0; + width = 0; + prec = -1; + sign = '\0'; rflag: - ch = *fmt++; + ch = *fmt++; reswitch: - switch( ch ) { - case '-': - flags |= LADJUST; - goto rflag; - case '.': - n = 0; - while( is_digit( ( ch = *fmt++ ) ) ) { - n = 10 * n + ( ch - '0' ); - } - prec = n < 0 ? -1 : n; - goto reswitch; - case '0': - flags |= ZEROPAD; - goto rflag; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - n = 0; - do { - n = 10 * n + ( ch - '0' ); - ch = *fmt++; - } while( is_digit( ch ) ); - width = n; - goto reswitch; - case 'c': - *buf_p++ = (char)*arg; - arg++; - break; - case 'd': - case 'i': - AddInt( &buf_p, *arg, width, flags ); - arg++; - break; - case 'f': - AddFloat( &buf_p, *(double *)arg, width, prec ); + switch( ch ) + { + case '-': + flags |= LADJUST; + goto rflag; + + case '.': + n = 0; + while( is_digit( ( ch = *fmt++ ) ) ) + n = 10 * n + ( ch - '0' ); + + prec = n < 0 ? -1 : n; + goto reswitch; + + case '0': + flags |= ZEROPAD; + goto rflag; + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + n = 0; + do + { + n = 10 * n + ( ch - '0' ); + ch = *fmt++; + } while( is_digit( ch ) ); + + width = n; + goto reswitch; + + case 'c': + *buf_p++ = (char)*arg; + arg++; + break; + + case 'd': + case 'i': + AddInt( &buf_p, *arg, width, flags ); + arg++; + break; + + case 'f': + AddFloat( &buf_p, *(double *)arg, width, prec ); #ifdef __LCC__ - arg += 1; // everything is 32 bit in my compiler + arg += 1; // everything is 32 bit in my compiler #else - arg += 2; + arg += 2; #endif - break; - case 's': - AddString( &buf_p, (char *)*arg, width, prec ); - arg++; - break; - case '%': - *buf_p++ = ch; - break; - default: - *buf_p++ = (char)*arg; - arg++; - break; - } - } + break; + + case 's': + AddString( &buf_p, (char *)*arg, width, prec ); + arg++; + break; + + case '%': + *buf_p++ = ch; + break; + + default: + *buf_p++ = (char)*arg; + arg++; + break; + } + } done: - *buf_p = 0; - return buf_p - buffer; + *buf_p = 0; + return buf_p - buffer; } /* this is really crappy */ -int sscanf( const char *buffer, const char *fmt, ... ) { - int cmd; - int **arg; - int count; - - arg = (int **)&fmt + 1; - count = 0; - - while ( *fmt ) { - if ( fmt[0] != '%' ) { - fmt++; - continue; - } - - cmd = fmt[1]; - fmt += 2; - - switch ( cmd ) { - case 'i': - case 'd': - case 'u': - **arg = _atoi( &buffer ); - break; - case 'f': - *(float *)*arg = _atof( &buffer ); - break; - } - arg++; - } - - return count; +int sscanf( const char *buffer, const char *fmt, ... ) +{ + int cmd; + int **arg; + int count; + + arg = (int **)&fmt + 1; + count = 0; + + while( *fmt ) + { + if( fmt[ 0 ] != '%' ) + { + fmt++; + continue; + } + + cmd = fmt[ 1 ]; + fmt += 2; + + switch( cmd ) + { + case 'i': + case 'd': + case 'u': + **arg = _atoi( &buffer ); + break; + case 'f': + *(float *)*arg = _atof( &buffer ); + break; + } + + arg++; + } + + return count; } #endif diff --git a/src/game/bg_lib.h b/src/game/bg_lib.h index b651c9a6..221e19e4 100644 --- a/src/game/bg_lib.h +++ b/src/game/bg_lib.h @@ -40,46 +40,46 @@ typedef char * va_list; #define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */ // Misc functions -typedef int cmp_t(const void *, const void *); -void qsort(void *a, size_t n, size_t es, cmp_t *cmp); -void srand( unsigned seed ); -int rand( void ); +typedef int cmp_t( const void *, const void * ); +void qsort( void *a, size_t n, size_t es, cmp_t *cmp ); +void srand( unsigned seed ); +int rand( void ); // String functions -size_t strlen( const char *string ); -char *strcat( char *strDestination, const char *strSource ); -char *strcpy( char *strDestination, const char *strSource ); -int strcmp( const char *string1, const char *string2 ); -char *strchr( const char *string, int c ); -char *strrchr( const char *string, int c ); -char *strstr( const char *string, const char *strCharSet ); -char *strncpy( char *strDest, const char *strSource, size_t count ); -int tolower( int c ); -int toupper( int c ); +size_t strlen( const char *string ); +char *strcat( char *strDestination, const char *strSource ); +char *strcpy( char *strDestination, const char *strSource ); +int strcmp( const char *string1, const char *string2 ); +char *strchr( const char *string, int c ); +char *strrchr( const char *string, int c ); +char *strstr( const char *string, const char *strCharSet ); +char *strncpy( char *strDest, const char *strSource, size_t count ); +int tolower( int c ); +int toupper( int c ); -double atof( const char *string ); -double _atof( const char **stringPtr ); -int atoi( const char *string ); -int _atoi( const char **stringPtr ); +double atof( const char *string ); +double _atof( const char **stringPtr ); +int atoi( const char *string ); +int _atoi( const char **stringPtr ); -int vsprintf( char *buffer, const char *fmt, va_list argptr ); -int sscanf( const char *buffer, const char *fmt, ... ); +int vsprintf( char *buffer, const char *fmt, va_list argptr ); +int sscanf( const char *buffer, const char *fmt, ... ); // Memory functions -void *memmove( void *dest, const void *src, size_t count ); -void *memset( void *dest, int c, size_t count ); -void *memcpy( void *dest, const void *src, size_t count ); +void *memmove( void *dest, const void *src, size_t count ); +void *memset( void *dest, int c, size_t count ); +void *memcpy( void *dest, const void *src, size_t count ); // Math functions -double ceil( double x ); -double floor( double x ); -double sqrt( double x ); -double sin( double x ); -double cos( double x ); -double atan2( double y, double x ); -double tan( double x ); -int abs( int n ); -double fabs( double x ); -double acos( double x ); -float pow( float x, float y ); +double ceil( double x ); +double floor( double x ); +double sqrt( double x ); +double sin( double x ); +double cos( double x ); +double atan2( double y, double x ); +double tan( double x ); +int abs( int n ); +double fabs( double x ); +double acos( double x ); +float pow( float x, float y ); diff --git a/src/game/bg_local.h b/src/game/bg_local.h index da4987ac..f7d4c00d 100644 --- a/src/game/bg_local.h +++ b/src/game/bg_local.h @@ -29,21 +29,22 @@ // all of the locals will be zeroed before each // pmove, just to make damn sure we don't have // any differences when running on client or server -typedef struct { +typedef struct +{ vec3_t forward, right, up; - float frametime; + float frametime; - int msec; + int msec; qboolean walking; qboolean groundPlane; trace_t groundTrace; - float impactSpeed; + float impactSpeed; vec3_t previous_origin; vec3_t previous_velocity; - int previous_waterlevel; + int previous_waterlevel; } pml_t; extern pmove_t *pm; @@ -73,4 +74,4 @@ void PM_AddEvent( int newEvent ); qboolean PM_SlideMove( qboolean gravity ); void PM_StepEvent( vec3_t from, vec3_t to, vec3_t normal ); qboolean PM_StepSlideMove( qboolean gravity, qboolean predictive ); -qboolean PM_PredictStepMove( ); +qboolean PM_PredictStepMove( void ); diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c index e3bba6e8..8870abe0 100644 --- a/src/game/bg_misc.c +++ b/src/game/bg_misc.c @@ -373,39 +373,7 @@ buildableAttributes_t bg_buildableList[ ] = qfalse //qboolean reactorTest; }, { - BA_H_DEF1, //int buildNum; - "plasmaturret", //char *buildName; - "Plasma Turret", //char *humanName; - "team_human_def1", //char *entityName; - { "base.md3", "barrel.md3", "top.md3", 0 }, - { -24, -24, -11 }, //vec3_t mins; - { 24, 24, 11 }, //vec3_t maxs; - TR_GRAVITY, //trType_t traj; - 0.0, //float bounce; - 80, //int buildPoints; - ( 1 << S2 )|( 1 << S3 ), //int stages - 1000, //int health; - 0, //int regenRate; - 50, //int damage; - 20, //int splashDamage; - 50, //int splashRadius; - MOD_HSPAWN, //int meansOfDeath; - BIT_HUMANS, //int team; - ( 1 << WP_HBUILD2 ), //weapon_t buildWeapon; - BANIM_IDLE1, //int idleAnim; - 50, //int nextthink; - 500, //int turretFireSpeed; - 500, //int turretRange; - WP_PLASMAGUN, //weapon_t turretProjType; - 0.707f, //float minNormal; - qfalse, //qboolean invertNormal; - qfalse, //qboolean creepTest; - 0, //int creepSize; - qfalse, //qboolean dccTest; - qfalse //qboolean reactorTest; - }, - { - BA_H_DEF2, //int buildNum; + BA_H_MGTURRET, //int buildNum; "mgturret", //char *buildName; "Machinegun Turret", //char *humanName; "team_human_def2", //char *entityName; @@ -439,7 +407,7 @@ buildableAttributes_t bg_buildableList[ ] = qfalse //qboolean reactorTest; }, { - BA_H_DEF3, //int buildNum; + BA_H_TESLAGEN, //int buildNum; "tesla", //char *buildName; "Tesla Generator", //char *humanName; "team_human_tesla", //char *entityName; @@ -2608,28 +2576,6 @@ weaponAttributes_t bg_weapons[ ] = qfalse, //qboolean purchasable; 0, //int buildDelay; WUT_HUMANS //WUTeam_t team; - }, - { - WP_PLASMAGUN, //int weaponNum; - 100, //int price; - ( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages - SLOT_WEAPON, //int slots; - "plasmagun", //char *weaponName; - "Plasma Gun", //char *weaponHumanName; - { "models/weapons2/gauntlet/gauntlet.md3", 0, 0, 0 }, - "icons/iconw_gauntlet", - 0, //int quan; - 0, //int clips; - 0, //int maxClips; - qtrue, //int infiniteAmmo; - qtrue, //int usesEnergy; - 500, //int repeatRate; - 0, //int reloadTime; - qfalse, //qboolean hasAltMode; - qfalse, //qboolean hasThirdMode; - qfalse, //qboolean purchasable; - 0, //int buildDelay; - WUT_HUMANS //WUTeam_t team; } }; @@ -3344,47 +3290,55 @@ BG_EvaluateTrajectory ================ */ -void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) { +void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) +{ float deltaTime; float phase; - switch( tr->trType ) { - case TR_STATIONARY: - case TR_INTERPOLATE: - VectorCopy( tr->trBase, result ); - break; - case TR_LINEAR: - deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds - VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); - break; - case TR_SINE: - deltaTime = ( atTime - tr->trTime ) / (float) tr->trDuration; - phase = sin( deltaTime * M_PI * 2 ); - VectorMA( tr->trBase, phase, tr->trDelta, result ); - break; - case TR_LINEAR_STOP: - if ( atTime > tr->trTime + tr->trDuration ) { - atTime = tr->trTime + tr->trDuration; - } - deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds - if ( deltaTime < 0 ) { - deltaTime = 0; - } - VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); - break; - case TR_GRAVITY: - deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds - VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); - result[2] -= 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity... - break; - case TR_BUOYANCY: - deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds - VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); - result[2] += 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity... - break; - default: - Com_Error( ERR_DROP, "BG_EvaluateTrajectory: unknown trType: %i", tr->trTime ); - break; + switch( tr->trType ) + { + case TR_STATIONARY: + case TR_INTERPOLATE: + VectorCopy( tr->trBase, result ); + break; + + case TR_LINEAR: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + break; + + case TR_SINE: + deltaTime = ( atTime - tr->trTime ) / (float)tr->trDuration; + phase = sin( deltaTime * M_PI * 2 ); + VectorMA( tr->trBase, phase, tr->trDelta, result ); + break; + + case TR_LINEAR_STOP: + if( atTime > tr->trTime + tr->trDuration ) + atTime = tr->trTime + tr->trDuration; + + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + if( deltaTime < 0 ) + deltaTime = 0; + + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + break; + + case TR_GRAVITY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + result[ 2 ] -= 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity... + break; + + case TR_BUOYANCY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorMA( tr->trBase, deltaTime, tr->trDelta, result ); + result[ 2 ] += 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime; // FIXME: local gravity... + break; + + default: + Com_Error( ERR_DROP, "BG_EvaluateTrajectory: unknown trType: %i", tr->trTime ); + break; } } @@ -3395,48 +3349,58 @@ BG_EvaluateTrajectoryDelta For determining velocity at a given time ================ */ -void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result ) { +void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result ) +{ float deltaTime; float phase; - switch( tr->trType ) { - case TR_STATIONARY: - case TR_INTERPOLATE: - VectorClear( result ); - break; - case TR_LINEAR: - VectorCopy( tr->trDelta, result ); - break; - case TR_SINE: - deltaTime = ( atTime - tr->trTime ) / (float) tr->trDuration; - phase = cos( deltaTime * M_PI * 2 ); // derivative of sin = cos - phase *= 0.5; - VectorScale( tr->trDelta, phase, result ); - break; - case TR_LINEAR_STOP: - if ( atTime > tr->trTime + tr->trDuration ) { + switch( tr->trType ) + { + case TR_STATIONARY: + case TR_INTERPOLATE: VectorClear( result ); - return; - } - VectorCopy( tr->trDelta, result ); - break; - case TR_GRAVITY: - deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds - VectorCopy( tr->trDelta, result ); - result[2] -= DEFAULT_GRAVITY * deltaTime; // FIXME: local gravity... - break; - case TR_BUOYANCY: - deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds - VectorCopy( tr->trDelta, result ); - result[2] += DEFAULT_GRAVITY * deltaTime; // FIXME: local gravity... - break; - default: - Com_Error( ERR_DROP, "BG_EvaluateTrajectoryDelta: unknown trType: %i", tr->trTime ); - break; - } -} - -char *eventnames[] = { + break; + + case TR_LINEAR: + VectorCopy( tr->trDelta, result ); + break; + + case TR_SINE: + deltaTime = ( atTime - tr->trTime ) / (float)tr->trDuration; + phase = cos( deltaTime * M_PI * 2 ); // derivative of sin = cos + phase *= 0.5; + VectorScale( tr->trDelta, phase, result ); + break; + + case TR_LINEAR_STOP: + if( atTime > tr->trTime + tr->trDuration ) + { + VectorClear( result ); + return; + } + VectorCopy( tr->trDelta, result ); + break; + + case TR_GRAVITY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorCopy( tr->trDelta, result ); + result[ 2 ] -= DEFAULT_GRAVITY * deltaTime; // FIXME: local gravity... + break; + + case TR_BUOYANCY: + deltaTime = ( atTime - tr->trTime ) * 0.001; // milliseconds to seconds + VectorCopy( tr->trDelta, result ); + result[ 2 ] += DEFAULT_GRAVITY * deltaTime; // FIXME: local gravity... + break; + + default: + Com_Error( ERR_DROP, "BG_EvaluateTrajectoryDelta: unknown trType: %i", tr->trTime ); + break; + } +} + +char *eventnames[ ] = +{ "EV_NONE", "EV_FOOTSTEP", @@ -3515,7 +3479,7 @@ char *eventnames[] = { "EV_MISSILE_HIT", "EV_MISSILE_MISS", "EV_MISSILE_MISS_METAL", - "EV_ITEM_EXPLOSION", //TA: human item explosions + "EV_BUILDABLE_EXPLOSION", //TA: human item explosions "EV_RAILTRAIL", "EV_TESLATRAIL", "EV_ALIENZAP", @@ -3565,22 +3529,27 @@ Handles the sequence numbers void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ); -void BG_AddPredictableEventToPlayerstate( int newEvent, int eventParm, playerState_t *ps ) { +void BG_AddPredictableEventToPlayerstate( int newEvent, int eventParm, playerState_t *ps ) +{ #ifdef _DEBUG { - char buf[256]; - trap_Cvar_VariableStringBuffer("showevents", buf, sizeof(buf)); - if ( atof(buf) != 0 ) { + char buf[ 256 ]; + trap_Cvar_VariableStringBuffer( "showevents", buf, sizeof( buf ) ); + + if( atof( buf ) != 0 ) + { #ifdef QAGAME - Com_Printf(" game event svt %5d -> %5d: num = %20s parm %d\n", ps->pmove_framecount/*ps->commandTime*/, ps->eventSequence, eventnames[newEvent], eventParm); + Com_Printf( " game event svt %5d -> %5d: num = %20s parm %d\n", + ps->pmove_framecount/*ps->commandTime*/, ps->eventSequence, eventnames[ newEvent ], eventParm); #else - Com_Printf("Cgame event svt %5d -> %5d: num = %20s parm %d\n", ps->pmove_framecount/*ps->commandTime*/, ps->eventSequence, eventnames[newEvent], eventParm); + Com_Printf( "Cgame event svt %5d -> %5d: num = %20s parm %d\n", + ps->pmove_framecount/*ps->commandTime*/, ps->eventSequence, eventnames[ newEvent ], eventParm); #endif } } #endif - ps->events[ps->eventSequence & (MAX_PS_EVENTS-1)] = newEvent; - ps->eventParms[ps->eventSequence & (MAX_PS_EVENTS-1)] = eventParm; + ps->events[ ps->eventSequence & ( MAX_PS_EVENTS - 1 ) ] = newEvent; + ps->eventParms[ ps->eventSequence & ( MAX_PS_EVENTS - 1 ) ] = eventParm; ps->eventSequence++; } @@ -3590,34 +3559,32 @@ void BG_AddPredictableEventToPlayerstate( int newEvent, int eventParm, playerSta BG_TouchJumpPad ======================== */ -void BG_TouchJumpPad( playerState_t *ps, entityState_t *jumppad ) { +void BG_TouchJumpPad( playerState_t *ps, entityState_t *jumppad ) +{ vec3_t angles; - float p; - int effectNum; + float p; + int effectNum; // spectators don't use jump pads - if ( ps->pm_type != PM_NORMAL ) { + if( ps->pm_type != PM_NORMAL ) return; - } - - // flying characters don't hit bounce pads - if ( ps->powerups[PW_FLIGHT] ) { - return; - } // if we didn't hit this same jumppad the previous frame // then don't play the event sound again if we are in a fat trigger - if ( ps->jumppad_ent != jumppad->number ) { - + if( ps->jumppad_ent != jumppad->number ) + { vectoangles( jumppad->origin2, angles); - p = fabs( AngleNormalize180( angles[PITCH] ) ); - if( p < 45 ) { + + p = fabs( AngleNormalize180( angles[ PITCH ] ) ); + + if( p < 45 ) effectNum = 0; - } else { + else effectNum = 1; - } + BG_AddPredictableEventToPlayerstate( EV_JUMP_PAD, effectNum, ps ); } + // remember hitting this jumppad this frame ps->jumppad_ent = jumppad->number; ps->jumppad_frame = ps->pmove_framecount; @@ -3634,33 +3601,34 @@ This is done after each set of usercmd_t on the server, and after local prediction on the client ======================== */ -void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap ) { - int i; +void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap ) +{ + int i; vec3_t ceilingNormal = { 0, 0, -1 }; - if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE ) { + if( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE ) s->eType = ET_INVISIBLE; - } else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) { + else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) s->eType = ET_INVISIBLE; - } else { + else s->eType = ET_PLAYER; - } s->number = ps->clientNum; s->pos.trType = TR_INTERPOLATE; VectorCopy( ps->origin, s->pos.trBase ); - if ( snap ) { + + if( snap ) SnapVector( s->pos.trBase ); - } + //set the trDelta for flag direction VectorCopy( ps->velocity, s->pos.trDelta ); s->apos.trType = TR_INTERPOLATE; VectorCopy( ps->viewangles, s->apos.trBase ); - if ( snap ) { + + if( snap ) SnapVector( s->apos.trBase ); - } //TA: i need for other things :) //s->angles2[YAW] = ps->movementDir; @@ -3670,22 +3638,24 @@ void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean s->clientNum = ps->clientNum; // ET_PLAYER looks here instead of at number // so corpses can also reference the proper config s->eFlags = ps->eFlags; - if ( ps->stats[STAT_HEALTH] <= 0 ) { + if( ps->stats[STAT_HEALTH] <= 0 ) s->eFlags |= EF_DEAD; - } else { + else s->eFlags &= ~EF_DEAD; - } - if ( ps->externalEvent ) { + if( ps->externalEvent ) + { s->event = ps->externalEvent; s->eventParm = ps->externalEventParm; - } else if ( ps->entityEventSequence < ps->eventSequence ) { + } + else if( ps->entityEventSequence < ps->eventSequence ) + { int seq; - if ( ps->entityEventSequence < ps->eventSequence - MAX_PS_EVENTS) { + if( ps->entityEventSequence < ps->eventSequence - MAX_PS_EVENTS ) ps->entityEventSequence = ps->eventSequence - MAX_PS_EVENTS; - } - seq = ps->entityEventSequence & (MAX_PS_EVENTS-1); + + seq = ps->entityEventSequence & ( MAX_PS_EVENTS - 1 ); s->event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 ); s->eventParm = ps->eventParms[ seq ]; ps->entityEventSequence++; @@ -3729,25 +3699,26 @@ This is done after each set of usercmd_t on the server, and after local prediction on the client ======================== */ -void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s, int time, qboolean snap ) { - int i; +void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s, int time, qboolean snap ) +{ + int i; vec3_t ceilingNormal = { 0, 0, -1 }; - if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE ) { + if( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE ) s->eType = ET_INVISIBLE; - } else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) { + else if( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) s->eType = ET_INVISIBLE; - } else { + else s->eType = ET_PLAYER; - } s->number = ps->clientNum; s->pos.trType = TR_LINEAR_STOP; VectorCopy( ps->origin, s->pos.trBase ); - if ( snap ) { + + if( snap ) SnapVector( s->pos.trBase ); - } + // set the trDelta for flag direction and linear prediction VectorCopy( ps->velocity, s->pos.trDelta ); // set the time for linear prediction @@ -3757,9 +3728,8 @@ void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s s->apos.trType = TR_INTERPOLATE; VectorCopy( ps->viewangles, s->apos.trBase ); - if ( snap ) { + if( snap ) SnapVector( s->apos.trBase ); - } //TA: i need for other things :) //s->angles2[YAW] = ps->movementDir; @@ -3769,22 +3739,25 @@ void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s s->clientNum = ps->clientNum; // ET_PLAYER looks here instead of at number // so corpses can also reference the proper config s->eFlags = ps->eFlags; - if ( ps->stats[STAT_HEALTH] <= 0 ) { + + if( ps->stats[STAT_HEALTH] <= 0 ) s->eFlags |= EF_DEAD; - } else { + else s->eFlags &= ~EF_DEAD; - } - if ( ps->externalEvent ) { + if( ps->externalEvent ) + { s->event = ps->externalEvent; s->eventParm = ps->externalEventParm; - } else if ( ps->entityEventSequence < ps->eventSequence ) { + } + else if( ps->entityEventSequence < ps->eventSequence ) + { int seq; - if ( ps->entityEventSequence < ps->eventSequence - MAX_PS_EVENTS) { + if( ps->entityEventSequence < ps->eventSequence - MAX_PS_EVENTS ) ps->entityEventSequence = ps->eventSequence - MAX_PS_EVENTS; - } - seq = ps->entityEventSequence & (MAX_PS_EVENTS-1); + + seq = ps->entityEventSequence & ( MAX_PS_EVENTS - 1 ); s->event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 ); s->eventParm = ps->eventParms[ seq ]; ps->entityEventSequence++; @@ -3796,6 +3769,7 @@ void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s //store items held and active items in otherEntityNum s->modelindex = 0; s->modelindex2 = 0; + for( i = UP_NONE + 1; i < UP_NUM_UPGRADES; i++ ) { if( BG_gotItem( i, ps->stats ) ) diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c index e79a3a8c..cae5470b 100644 --- a/src/game/bg_pmove.c +++ b/src/game/bg_pmove.c @@ -47,7 +47,8 @@ PM_AddEvent =============== */ -void PM_AddEvent( int newEvent ) { +void PM_AddEvent( int newEvent ) +{ BG_AddPredictableEventToPlayerstate( newEvent, 0, pm->ps ); } @@ -56,25 +57,25 @@ void PM_AddEvent( int newEvent ) { PM_AddTouchEnt =============== */ -void PM_AddTouchEnt( int entityNum ) { +void PM_AddTouchEnt( int entityNum ) +{ int i; - if ( entityNum == ENTITYNUM_WORLD ) { + if( entityNum == ENTITYNUM_WORLD ) return; - } - if ( pm->numtouch == MAXTOUCH ) { + + if( pm->numtouch == MAXTOUCH ) return; - } // see if it is already added - for ( i = 0 ; i < pm->numtouch ; i++ ) { - if ( pm->touchents[ i ] == entityNum ) { + for( i = 0 ; i < pm->numtouch ; i++ ) + { + if( pm->touchents[ i ] == entityNum ) return; - } } // add it - pm->touchents[pm->numtouch] = entityNum; + pm->touchents[ pm->numtouch ] = entityNum; pm->numtouch++; } @@ -83,45 +84,51 @@ void PM_AddTouchEnt( int entityNum ) { PM_StartTorsoAnim =================== */ -static void PM_StartTorsoAnim( int anim ) { - if ( pm->ps->pm_type >= PM_DEAD ) { +static void PM_StartTorsoAnim( int anim ) +{ + if( pm->ps->pm_type >= PM_DEAD ) return; - } + pm->ps->torsoAnim = ( ( pm->ps->torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; } -static void PM_StartLegsAnim( int anim ) { - if ( pm->ps->pm_type >= PM_DEAD ) { + +static void PM_StartLegsAnim( int anim ) +{ + if( pm->ps->pm_type >= PM_DEAD ) return; - } - if ( pm->ps->legsTimer > 0 ) { + + if( pm->ps->legsTimer > 0 ) return; // a high priority animation is running - } + pm->ps->legsAnim = ( ( pm->ps->legsAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; } -static void PM_ContinueLegsAnim( int anim ) { - if ( ( pm->ps->legsAnim & ~ANIM_TOGGLEBIT ) == anim ) { +static void PM_ContinueLegsAnim( int anim ) +{ + if( ( pm->ps->legsAnim & ~ANIM_TOGGLEBIT ) == anim ) return; - } - if ( pm->ps->legsTimer > 0 ) { + + if( pm->ps->legsTimer > 0 ) return; // a high priority animation is running - } + PM_StartLegsAnim( anim ); } -static void PM_ContinueTorsoAnim( int anim ) { - if ( ( pm->ps->torsoAnim & ~ANIM_TOGGLEBIT ) == anim ) { +static void PM_ContinueTorsoAnim( int anim ) +{ + if( ( pm->ps->torsoAnim & ~ANIM_TOGGLEBIT ) == anim ) return; - } - if ( pm->ps->torsoTimer > 0 ) { + + if( pm->ps->torsoTimer > 0 ) return; // a high priority animation is running - } + PM_StartTorsoAnim( anim ); } -static void PM_ForceLegsAnim( int anim ) { +static void PM_ForceLegsAnim( int anim ) +{ pm->ps->legsTimer = 0; PM_StartLegsAnim( anim ); } @@ -134,25 +141,26 @@ PM_ClipVelocity Slide off of the impacting surface ================== */ -void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ) { +void PM_ClipVelocity( vec3_t in, vec3_t normal, vec3_t out, float overbounce ) +{ float backoff; float change; int i; - backoff = DotProduct (in, normal); + backoff = DotProduct( in, normal ); //Com_Printf( "%1.0f ", backoff ); - if ( backoff < 0 ) { + if( backoff < 0 ) backoff *= overbounce; - } else { + else backoff /= overbounce; - } - for ( i=0 ; i<3 ; i++ ) { - change = normal[i]*backoff; + for( i = 0; i < 3; i++ ) + { + change = normal[ i ] * backoff; //Com_Printf( "%1.0f ", change ); - out[i] = in[i] - change; + out[ i ] = in[ i ] - change; } //Com_Printf( " " ); @@ -166,25 +174,27 @@ PM_Friction Handles both ground friction and water friction ================== */ -static void PM_Friction( void ) { +static void PM_Friction( void ) +{ vec3_t vec; - float *vel; - float speed, newspeed, control; - float drop; + float *vel; + float speed, newspeed, control; + float drop; vel = pm->ps->velocity; //TA: make sure vertical velocity is NOT set to zero when wall climbing VectorCopy( vel, vec ); - if ( pml.walking && - !( pm->ps->stats[ STAT_STATE ] & SS_WALLCLIMBING ) ) { + if( pml.walking && + !( pm->ps->stats[ STAT_STATE ] & SS_WALLCLIMBING ) ) vec[2] = 0; // ignore slope movement - } - speed = VectorLength(vec); - if (speed < 1) { - vel[0] = 0; - vel[1] = 0; // allow sinking underwater + speed = VectorLength( vec ); + + if( speed < 1 ) + { + vel[ 0 ] = 0; + vel[ 1 ] = 0; // allow sinking underwater // FIXME: still have z friction underwater? return; } @@ -192,42 +202,42 @@ static void PM_Friction( void ) { drop = 0; // apply ground friction - if ( pm->waterlevel <= 1 ) { - if ( pml.walking && !(pml.groundTrace.surfaceFlags & SURF_SLICK) ) { + if( pm->waterlevel <= 1 ) + { + if( pml.walking && !( pml.groundTrace.surfaceFlags & SURF_SLICK ) ) + { // if getting knocked back, no friction - if ( ! (pm->ps->pm_flags & PMF_TIME_KNOCKBACK) ) + if( !( pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) ) { float sticky = BG_FindStickyForClass( pm->ps->stats[ STAT_PCLASS ] ); - control = speed < pm_stopspeed*sticky ? pm_stopspeed*sticky : speed; + control = speed < pm_stopspeed * sticky ? pm_stopspeed * sticky : speed; drop += control*pm_friction*pml.frametime; } } } // apply water friction even if just wading - if ( pm->waterlevel ) { - drop += speed*pm_waterfriction*pm->waterlevel*pml.frametime; - } + if( pm->waterlevel ) + drop += speed * pm_waterfriction * pm->waterlevel * pml.frametime; // apply flying friction if( BG_gotItem( UP_JETPACK, pm->ps->stats ) && BG_activated( UP_JETPACK, pm->ps->stats ) ) drop += speed * pm_flightfriction * pml.frametime; - if ( pm->ps->pm_type == PM_SPECTATOR ) { - drop += speed*pm_spectatorfriction*pml.frametime; - } + if( pm->ps->pm_type == PM_SPECTATOR ) + drop += speed * pm_spectatorfriction * pml.frametime; // scale the velocity newspeed = speed - drop; - if (newspeed < 0) { + if( newspeed < 0 ) newspeed = 0; - } + newspeed /= speed; - vel[0] = vel[0] * newspeed; - vel[1] = vel[1] * newspeed; - vel[2] = vel[2] * newspeed; + vel[ 0 ] = vel[ 0 ] * newspeed; + vel[ 1 ] = vel[ 1 ] * newspeed; + vel[ 2 ] = vel[ 2 ] * newspeed; } @@ -238,40 +248,38 @@ PM_Accelerate Handles user intended acceleration ============== */ -static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel ) { +static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel ) +{ #if 1 // q2 style int i; float addspeed, accelspeed, currentspeed; - currentspeed = DotProduct (pm->ps->velocity, wishdir); + currentspeed = DotProduct( pm->ps->velocity, wishdir ); addspeed = wishspeed - currentspeed; - if (addspeed <= 0) { + if( addspeed <= 0 ) return; - } - accelspeed = accel*pml.frametime*wishspeed; - if (accelspeed > addspeed) { + + accelspeed = accel * pml.frametime * wishspeed; + if( accelspeed > addspeed ) accelspeed = addspeed; - } - for (i=0 ; i<3 ; i++) { - pm->ps->velocity[i] += accelspeed*wishdir[i]; - } + for( i = 0; i < 3; i++ ) + pm->ps->velocity[ i ] += accelspeed*wishdir[ i ]; #else // proper way (avoids strafe jump maxspeed bug), but feels bad vec3_t wishVelocity; vec3_t pushDir; - float pushLen; - float canPush; + float pushLen; + float canPush; VectorScale( wishdir, wishspeed, wishVelocity ); VectorSubtract( wishVelocity, pm->ps->velocity, pushDir ); pushLen = VectorNormalize( pushDir ); - canPush = accel*pml.frametime*wishspeed; - if (canPush > pushLen) { + canPush = accel * pml.frametime * wishspeed; + if( canPush > pushLen ) canPush = pushLen; - } VectorMA( pm->ps->velocity, canPush, pushDir, pm->ps->velocity ); #endif @@ -288,14 +296,15 @@ This allows the clients to use axial -127 to 127 values for all directions without getting a sqrt(2) distortion in speed. ============ */ -static float PM_CmdScale( usercmd_t *cmd ) { - int max; - float total; - float scale; - float modifier = 1.0f; - static int time; - int dTime; - int aForward, aRight; +static float PM_CmdScale( usercmd_t *cmd ) +{ + int max; + float total; + float scale; + float modifier = 1.0f; + static int time; + int dTime; + int aForward, aRight; dTime = pm->cmd.serverTime - time; time = pm->cmd.serverTime; @@ -336,15 +345,14 @@ static float PM_CmdScale( usercmd_t *cmd ) { cmd->upmove = 0; max = abs( cmd->forwardmove ); - if ( abs( cmd->rightmove ) > max ) { + if( abs( cmd->rightmove ) > max ) max = abs( cmd->rightmove ); - } - if ( abs( cmd->upmove ) > max ) { + + if( abs( cmd->upmove ) > max ) max = abs( cmd->upmove ); - } - if ( !max ) { + + if( !max ) return 0; - } total = sqrt( cmd->forwardmove * cmd->forwardmove + cmd->rightmove * cmd->rightmove + cmd->upmove * cmd->upmove ); @@ -363,34 +371,36 @@ Determine the rotation of the legs reletive to the facing dir ================ */ -static void PM_SetMovementDir( void ) { - if ( pm->cmd.forwardmove || pm->cmd.rightmove ) { - if ( pm->cmd.rightmove == 0 && pm->cmd.forwardmove > 0 ) { +static void PM_SetMovementDir( void ) +{ + if( pm->cmd.forwardmove || pm->cmd.rightmove ) + { + if( pm->cmd.rightmove == 0 && pm->cmd.forwardmove > 0 ) pm->ps->movementDir = 0; - } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove > 0 ) { + else if( pm->cmd.rightmove < 0 && pm->cmd.forwardmove > 0 ) pm->ps->movementDir = 1; - } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove == 0 ) { + else if( pm->cmd.rightmove < 0 && pm->cmd.forwardmove == 0 ) pm->ps->movementDir = 2; - } else if ( pm->cmd.rightmove < 0 && pm->cmd.forwardmove < 0 ) { + else if( pm->cmd.rightmove < 0 && pm->cmd.forwardmove < 0 ) pm->ps->movementDir = 3; - } else if ( pm->cmd.rightmove == 0 && pm->cmd.forwardmove < 0 ) { + else if( pm->cmd.rightmove == 0 && pm->cmd.forwardmove < 0 ) pm->ps->movementDir = 4; - } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove < 0 ) { + else if( pm->cmd.rightmove > 0 && pm->cmd.forwardmove < 0 ) pm->ps->movementDir = 5; - } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove == 0 ) { + else if( pm->cmd.rightmove > 0 && pm->cmd.forwardmove == 0 ) pm->ps->movementDir = 6; - } else if ( pm->cmd.rightmove > 0 && pm->cmd.forwardmove > 0 ) { + else if( pm->cmd.rightmove > 0 && pm->cmd.forwardmove > 0 ) pm->ps->movementDir = 7; - } - } else { + } + else + { // if they aren't actively going directly sideways, // change the animation to the diagonal so they // don't stop too crooked - if ( pm->ps->movementDir == 2 ) { + if( pm->ps->movementDir == 2 ) pm->ps->movementDir = 1; - } else if ( pm->ps->movementDir == 6 ) { + else if( pm->ps->movementDir == 6 ) pm->ps->movementDir = 7; - } } } @@ -453,14 +463,12 @@ static qboolean PM_CheckJump( void ) ( pm->ps->stats[ STAT_STAMINA ] < 0 ) ) return qfalse; - if ( pm->ps->pm_flags & PMF_RESPAWNED ) { + if( pm->ps->pm_flags & PMF_RESPAWNED ) return qfalse; // don't allow jump until all buttons are up - } - if ( pm->cmd.upmove < 10 ) { + if( pm->cmd.upmove < 10 ) // not holding jump return qfalse; - } //can't jump whilst grabbed if( pm->ps->pm_type == PM_GRABBED && pm->ps->pm_type == PM_KNOCKED ) @@ -470,7 +478,8 @@ static qboolean PM_CheckJump( void ) } // must wait for jump to be released - if ( pm->ps->pm_flags & PMF_JUMP_HELD ) { + if( pm->ps->pm_flags & PMF_JUMP_HELD ) + { // clear upmove so cmdscale doesn't lower running speed pm->cmd.upmove = 0; return qfalse; @@ -497,14 +506,17 @@ static qboolean PM_CheckJump( void ) VectorMA( pm->ps->velocity, JUMP_VELOCITY, normal, pm->ps->velocity ); } else - pm->ps->velocity[2] = JUMP_VELOCITY; + pm->ps->velocity[ 2 ] = JUMP_VELOCITY; PM_AddEvent( EV_JUMP ); - if ( pm->cmd.forwardmove >= 0 ) { + if( pm->cmd.forwardmove >= 0 ) + { PM_ForceLegsAnim( LEGS_JUMP ); pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; - } else { + } + else + { PM_ForceLegsAnim( LEGS_JUMPB ); pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; } @@ -517,41 +529,40 @@ static qboolean PM_CheckJump( void ) PM_CheckWaterJump ============= */ -static qboolean PM_CheckWaterJump( void ) { +static qboolean PM_CheckWaterJump( void ) +{ vec3_t spot; - int cont; + int cont; vec3_t flatforward; - if (pm->ps->pm_time) { + if( pm->ps->pm_time ) return qfalse; - } // check for water jump - if ( pm->waterlevel != 2 ) { + if( pm->waterlevel != 2 ) return qfalse; - } - flatforward[0] = pml.forward[0]; - flatforward[1] = pml.forward[1]; - flatforward[2] = 0; - VectorNormalize (flatforward); + flatforward[ 0 ] = pml.forward[ 0 ]; + flatforward[ 1 ] = pml.forward[ 1 ]; + flatforward[ 2 ] = 0; + VectorNormalize( flatforward ); - VectorMA (pm->ps->origin, 30, flatforward, spot); - spot[2] += 4; - cont = pm->pointcontents (spot, pm->ps->clientNum ); - if ( !(cont & CONTENTS_SOLID) ) { + VectorMA( pm->ps->origin, 30, flatforward, spot ); + spot[ 2 ] += 4; + cont = pm->pointcontents( spot, pm->ps->clientNum ); + + if( !( cont & CONTENTS_SOLID ) ) return qfalse; - } - spot[2] += 16; - cont = pm->pointcontents (spot, pm->ps->clientNum ); - if ( cont ) { + spot[ 2 ] += 16; + cont = pm->pointcontents( spot, pm->ps->clientNum ); + + if( cont ) return qfalse; - } // jump out of water - VectorScale (pml.forward, 200, pm->ps->velocity); - pm->ps->velocity[2] = 350; + VectorScale( pml.forward, 200, pm->ps->velocity ); + pm->ps->velocity[ 2 ] = 350; pm->ps->pm_flags |= PMF_TIME_WATERJUMP; pm->ps->pm_time = 2000; @@ -569,13 +580,15 @@ PM_WaterJumpMove Flying out of the water =================== */ -static void PM_WaterJumpMove( void ) { +static void PM_WaterJumpMove( void ) +{ // waterjump has no control, but falls PM_StepSlideMove( qtrue, qfalse ); - pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; - if (pm->ps->velocity[2] < 0) { + pm->ps->velocity[ 2 ] -= pm->ps->gravity * pml.frametime; + if( pm->ps->velocity[ 2 ] < 0 ) + { // cancel as soon as we are falling down again pm->ps->pm_flags &= ~PMF_ALL_TIMES; pm->ps->pm_time = 0; @@ -588,7 +601,8 @@ PM_WaterMove =================== */ -static void PM_WaterMove( void ) { +static void PM_WaterMove( void ) +{ int i; vec3_t wishvel; float wishspeed; @@ -596,7 +610,8 @@ static void PM_WaterMove( void ) { float scale; float vel; - if ( PM_CheckWaterJump() ) { + if( PM_CheckWaterJump( ) ) + { PM_WaterJumpMove(); return; } @@ -614,41 +629,44 @@ static void PM_WaterMove( void ) { } } #endif - PM_Friction (); + PM_Friction( ); scale = PM_CmdScale( &pm->cmd ); // // user intentions // - if ( !scale ) { - wishvel[0] = 0; - wishvel[1] = 0; - wishvel[2] = -60; // sink towards bottom - } else { - for (i=0 ; i<3 ; i++) - wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove; + if( !scale ) + { + wishvel[ 0 ] = 0; + wishvel[ 1 ] = 0; + wishvel[ 2 ] = -60; // sink towards bottom + } + else + { + for( i = 0; i < 3; i++ ) + wishvel[ i ] = scale * pml.forward[ i ] * pm->cmd.forwardmove + scale * pml.right[ i ] * pm->cmd.rightmove; - wishvel[2] += scale * pm->cmd.upmove; + wishvel[ 2 ] += scale * pm->cmd.upmove; } - VectorCopy (wishvel, wishdir); - wishspeed = VectorNormalize(wishdir); + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); - if ( wishspeed > pm->ps->speed * pm_swimScale ) { + if( wishspeed > pm->ps->speed * pm_swimScale ) wishspeed = pm->ps->speed * pm_swimScale; - } - PM_Accelerate (wishdir, wishspeed, pm_wateraccelerate); + PM_Accelerate( wishdir, wishspeed, pm_wateraccelerate ); // make sure we can go up slopes easily under water - if ( pml.groundPlane && DotProduct( pm->ps->velocity, pml.groundTrace.plane.normal ) < 0 ) { - vel = VectorLength(pm->ps->velocity); + if( pml.groundPlane && DotProduct( pm->ps->velocity, pml.groundTrace.plane.normal ) < 0 ) + { + vel = VectorLength( pm->ps->velocity ); // slide along the ground plane - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); - VectorNormalize(pm->ps->velocity); - VectorScale(pm->ps->velocity, vel, pm->ps->velocity); + VectorNormalize( pm->ps->velocity ); + VectorScale( pm->ps->velocity, vel, pm->ps->velocity ); } PM_SlideMove( qfalse ); @@ -661,7 +679,8 @@ PM_JetPackMove Only with the jetpack =================== */ -static void PM_JetPackMove( void ) { +static void PM_JetPackMove( void ) +{ int i; vec3_t wishvel; float wishspeed; @@ -702,36 +721,39 @@ PM_FlyMove Only with the flight powerup =================== */ -static void PM_FlyMove( void ) { - int i; +static void PM_FlyMove( void ) +{ + int i; vec3_t wishvel; - float wishspeed; + float wishspeed; vec3_t wishdir; - float scale; + float scale; // normal slowdown - PM_Friction (); + PM_Friction( ); scale = PM_CmdScale( &pm->cmd ); // // user intentions // - if ( !scale ) { - wishvel[0] = 0; - wishvel[1] = 0; - wishvel[2] = 0; - } else { - for (i=0 ; i<3 ; i++) { - wishvel[i] = scale * pml.forward[i]*pm->cmd.forwardmove + scale * pml.right[i]*pm->cmd.rightmove; - } + if( !scale ) + { + wishvel[ 0 ] = 0; + wishvel[ 1 ] = 0; + wishvel[ 2 ] = 0; + } + else + { + for( i = 0; i < 3; i++ ) + wishvel[ i ] = scale * pml.forward[ i ] * pm->cmd.forwardmove + scale * pml.right[ i ] * pm->cmd.rightmove; - wishvel[2] += scale * pm->cmd.upmove; + wishvel[ 2 ] += scale * pm->cmd.upmove; } - VectorCopy (wishvel, wishdir); - wishspeed = VectorNormalize(wishdir); + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); - PM_Accelerate (wishdir, wishspeed, pm_flyaccelerate); + PM_Accelerate( wishdir, wishspeed, pm_flyaccelerate ); PM_StepSlideMove( qfalse, qfalse ); } @@ -743,16 +765,17 @@ PM_AirMove =================== */ -static void PM_AirMove( void ) { - int i; +static void PM_AirMove( void ) +{ + int i; vec3_t wishvel; - float fmove, smove; + float fmove, smove; vec3_t wishdir; - float wishspeed; - float scale; + float wishspeed; + float scale; usercmd_t cmd; - PM_Friction(); + PM_Friction( ); fmove = pm->cmd.forwardmove; smove = pm->cmd.rightmove; @@ -761,33 +784,32 @@ static void PM_AirMove( void ) { scale = PM_CmdScale( &cmd ); // set the movementDir so clients can rotate the legs for strafing - PM_SetMovementDir(); + PM_SetMovementDir( ); // project moves down to flat plane - pml.forward[2] = 0; - pml.right[2] = 0; - VectorNormalize (pml.forward); - VectorNormalize (pml.right); + pml.forward[ 2 ] = 0; + pml.right[ 2 ] = 0; + VectorNormalize( pml.forward ); + VectorNormalize( pml.right ); - for ( i = 0 ; i < 2 ; i++ ) { - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; - } - wishvel[2] = 0; + for( i = 0; i < 2; i++ ) + wishvel[ i ] = pml.forward[ i ] * fmove + pml.right[ i ] * smove; - VectorCopy (wishvel, wishdir); - wishspeed = VectorNormalize(wishdir); + wishvel[ 2 ] = 0; + + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); wishspeed *= scale; // not on ground, so little effect on velocity - PM_Accelerate (wishdir, wishspeed, pm_airaccelerate); + PM_Accelerate( wishdir, wishspeed, pm_airaccelerate ); // we may have a ground plane that is very steep, even // though we don't have a groundentity // slide along the steep plane - if ( pml.groundPlane ) { - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + if( pml.groundPlane ) + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); - } #if 0 //ZOID: If we are on the grapple, try stair-stepping @@ -799,7 +821,7 @@ static void PM_AirMove( void ) { PM_SlideMove ( qtrue ); #endif - PM_StepSlideMove ( qtrue, qfalse ); + PM_StepSlideMove( qtrue, qfalse ); } /* @@ -808,22 +830,23 @@ PM_GrappleMove =================== */ -static void PM_GrappleMove( void ) { - vec3_t vel, v; - float vlen; - - VectorScale(pml.forward, -16, v); - VectorAdd(pm->ps->grapplePoint, v, v); - VectorSubtract(v, pm->ps->origin, vel); - vlen = VectorLength(vel); +static void PM_GrappleMove( void ) +{ + vec3_t vel, v; + float vlen; + + VectorScale( pml.forward, -16, v ); + VectorAdd( pm->ps->grapplePoint, v, v ); + VectorSubtract( v, pm->ps->origin, vel ); + vlen = VectorLength( vel ); VectorNormalize( vel ); - if (vlen <= 100) - VectorScale(vel, 10 * vlen, vel); + if( vlen <= 100 ) + VectorScale( vel, 10 * vlen, vel ); else - VectorScale(vel, 800, vel); + VectorScale( vel, 800, vel ); - VectorCopy(vel, pm->ps->velocity); + VectorCopy( vel, pm->ps->velocity ); pml.groundPlane = qfalse; } @@ -835,35 +858,38 @@ PM_ClimbMove =================== */ -static void PM_ClimbMove( void ) { - int i; +static void PM_ClimbMove( void ) +{ + int i; vec3_t wishvel; - float fmove, smove; + float fmove, smove; vec3_t wishdir; - float wishspeed; - float scale; + float wishspeed; + float scale; usercmd_t cmd; - float accelerate; - float vel; + float accelerate; + float vel; - if ( pm->waterlevel > 2 && DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 ) { + if( pm->waterlevel > 2 && DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 ) + { // begin swimming - PM_WaterMove(); + PM_WaterMove( ); return; } - if ( PM_CheckJump( ) || PM_CheckPounce( ) ) { + if( PM_CheckJump( ) || PM_CheckPounce( ) ) + { // jumped away - if ( pm->waterlevel > 1 ) { - PM_WaterMove(); - } else { - PM_AirMove(); - } + if( pm->waterlevel > 1 ) + PM_WaterMove( ); + else + PM_AirMove( ); + return; } - PM_Friction (); + PM_Friction( ); fmove = pm->cmd.forwardmove; smove = pm->cmd.rightmove; @@ -872,71 +898,68 @@ static void PM_ClimbMove( void ) { scale = PM_CmdScale( &cmd ); // set the movementDir so clients can rotate the legs for strafing - PM_SetMovementDir(); + PM_SetMovementDir( ); // project the forward and right directions onto the ground plane - PM_ClipVelocity (pml.forward, pml.groundTrace.plane.normal, pml.forward, OVERCLIP ); - PM_ClipVelocity (pml.right, pml.groundTrace.plane.normal, pml.right, OVERCLIP ); + PM_ClipVelocity( pml.forward, pml.groundTrace.plane.normal, pml.forward, OVERCLIP ); + PM_ClipVelocity( pml.right, pml.groundTrace.plane.normal, pml.right, OVERCLIP ); // - VectorNormalize (pml.forward); - VectorNormalize (pml.right); + VectorNormalize( pml.forward ); + VectorNormalize( pml.right ); + + for( i = 0; i < 3; i++ ) + wishvel[ i ] = pml.forward[ i ] * fmove + pml.right[ i ] * smove; - for ( i = 0 ; i < 3 ; i++ ) { - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; - } // when going up or down slopes the wish velocity should Not be zero // wishvel[2] = 0; - VectorCopy (wishvel, wishdir); - wishspeed = VectorNormalize(wishdir); + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); wishspeed *= scale; // clamp the speed lower if ducking - if ( pm->ps->pm_flags & PMF_DUCKED ) { - if ( wishspeed > pm->ps->speed * pm_duckScale ) { + if( pm->ps->pm_flags & PMF_DUCKED ) + { + if( wishspeed > pm->ps->speed * pm_duckScale ) wishspeed = pm->ps->speed * pm_duckScale; - } } // clamp the speed lower if wading or walking on the bottom - if ( pm->waterlevel ) { + if( pm->waterlevel ) + { float waterScale; waterScale = pm->waterlevel / 3.0; waterScale = 1.0 - ( 1.0 - pm_swimScale ) * waterScale; - if ( wishspeed > pm->ps->speed * waterScale ) { + if( wishspeed > pm->ps->speed * waterScale ) wishspeed = pm->ps->speed * waterScale; - } } // when a player gets hit, they temporarily lose // full control, which allows them to be moved a bit - if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) { + if( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) accelerate = pm_airaccelerate; - } else { + else accelerate = pm_accelerate; - } - PM_Accelerate (wishdir, wishspeed, accelerate); + PM_Accelerate( wishdir, wishspeed, accelerate ); - if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) { - pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; - } + if( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) + pm->ps->velocity[ 2 ] -= pm->ps->gravity * pml.frametime; - vel = VectorLength(pm->ps->velocity); + vel = VectorLength( pm->ps->velocity ); // slide along the ground plane - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); // don't decrease velocity when going up or down a slope - VectorNormalize(pm->ps->velocity); - VectorScale(pm->ps->velocity, vel, pm->ps->velocity); + VectorNormalize( pm->ps->velocity ); + VectorScale( pm->ps->velocity, vel, pm->ps->velocity ); // don't do anything if standing still - if (!pm->ps->velocity[0] && !pm->ps->velocity[1] && !pm->ps->velocity[2]) { + if( !pm->ps->velocity[ 0 ] && !pm->ps->velocity[ 1 ] && !pm->ps->velocity[ 2 ] ) return; - } PM_StepSlideMove( qfalse, qfalse ); } @@ -948,35 +971,38 @@ PM_WalkMove =================== */ -static void PM_WalkMove( void ) { - int i; +static void PM_WalkMove( void ) +{ + int i; vec3_t wishvel; - float fmove, smove; + float fmove, smove; vec3_t wishdir; - float wishspeed; - float scale; + float wishspeed; + float scale; usercmd_t cmd; - float accelerate; - float vel; + float accelerate; + float vel; - if ( pm->waterlevel > 2 && DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 ) { + if( pm->waterlevel > 2 && DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 ) + { // begin swimming - PM_WaterMove(); + PM_WaterMove( ); return; } - if( PM_CheckJump( ) || PM_CheckPounce( ) ) { + if( PM_CheckJump( ) || PM_CheckPounce( ) ) + { // jumped away - if ( pm->waterlevel > 1 ) { - PM_WaterMove(); - } else { - PM_AirMove(); - } + if( pm->waterlevel > 1 ) + PM_WaterMove( ); + else + PM_AirMove( ); + return; } - PM_Friction (); + PM_Friction( ); fmove = pm->cmd.forwardmove; smove = pm->cmd.rightmove; @@ -985,81 +1011,80 @@ static void PM_WalkMove( void ) { scale = PM_CmdScale( &cmd ); // set the movementDir so clients can rotate the legs for strafing - PM_SetMovementDir(); + PM_SetMovementDir( ); // project moves down to flat plane - pml.forward[2] = 0; - pml.right[2] = 0; + pml.forward[ 2 ] = 0; + pml.right[ 2 ] = 0; // project the forward and right directions onto the ground plane - PM_ClipVelocity (pml.forward, pml.groundTrace.plane.normal, pml.forward, OVERCLIP ); - PM_ClipVelocity (pml.right, pml.groundTrace.plane.normal, pml.right, OVERCLIP ); + PM_ClipVelocity( pml.forward, pml.groundTrace.plane.normal, pml.forward, OVERCLIP ); + PM_ClipVelocity( pml.right, pml.groundTrace.plane.normal, pml.right, OVERCLIP ); // - VectorNormalize (pml.forward); - VectorNormalize (pml.right); + VectorNormalize( pml.forward ); + VectorNormalize( pml.right ); + + for( i = 0; i < 3; i++ ) + wishvel[ i ] = pml.forward[ i ] * fmove + pml.right[ i ] * smove; - for ( i = 0 ; i < 3 ; i++ ) { - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; - } // when going up or down slopes the wish velocity should Not be zero // wishvel[2] = 0; - VectorCopy (wishvel, wishdir); - wishspeed = VectorNormalize(wishdir); + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); wishspeed *= scale; // clamp the speed lower if ducking - if ( pm->ps->pm_flags & PMF_DUCKED ) { - if ( wishspeed > pm->ps->speed * pm_duckScale ) { + if( pm->ps->pm_flags & PMF_DUCKED ) + { + if( wishspeed > pm->ps->speed * pm_duckScale ) wishspeed = pm->ps->speed * pm_duckScale; - } } // clamp the speed lower if wading or walking on the bottom - if ( pm->waterlevel ) { + if( pm->waterlevel ) + { float waterScale; waterScale = pm->waterlevel / 3.0; waterScale = 1.0 - ( 1.0 - pm_swimScale ) * waterScale; - if ( wishspeed > pm->ps->speed * waterScale ) { + if( wishspeed > pm->ps->speed * waterScale ) wishspeed = pm->ps->speed * waterScale; - } } // when a player gets hit, they temporarily lose // full control, which allows them to be moved a bit - if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) { + if( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) accelerate = pm_airaccelerate; - } else { + else accelerate = pm_accelerate; - } - PM_Accelerate (wishdir, wishspeed, accelerate); + PM_Accelerate( wishdir, wishspeed, accelerate ); //Com_Printf("velocity = %1.1f %1.1f %1.1f\n", pm->ps->velocity[0], pm->ps->velocity[1], pm->ps->velocity[2]); //Com_Printf("velocity1 = %1.1f\n", VectorLength(pm->ps->velocity)); - if ( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) { - pm->ps->velocity[2] -= pm->ps->gravity * pml.frametime; - } else { + if( ( pml.groundTrace.surfaceFlags & SURF_SLICK ) || pm->ps->pm_flags & PMF_TIME_KNOCKBACK ) + pm->ps->velocity[ 2 ] -= pm->ps->gravity * pml.frametime; + else + { // don't reset the z velocity for slopes // pm->ps->velocity[2] = 0; } - vel = VectorLength(pm->ps->velocity); + vel = VectorLength( pm->ps->velocity ); // slide along the ground plane - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, pm->ps->velocity, OVERCLIP ); // don't decrease velocity when going up or down a slope - VectorNormalize(pm->ps->velocity); - VectorScale(pm->ps->velocity, vel, pm->ps->velocity); + VectorNormalize( pm->ps->velocity ); + VectorScale( pm->ps->velocity, vel, pm->ps->velocity ); // don't do anything if standing still - if (!pm->ps->velocity[0] && !pm->ps->velocity[1]) { + if( !pm->ps->velocity[ 0 ] && !pm->ps->velocity[ 1 ] ) return; - } PM_StepSlideMove( qfalse, qfalse ); @@ -1073,22 +1098,24 @@ static void PM_WalkMove( void ) { PM_DeadMove ============== */ -static void PM_DeadMove( void ) { +static void PM_DeadMove( void ) +{ float forward; - if ( !pml.walking ) { + if( !pml.walking ) return; - } // extra friction - forward = VectorLength (pm->ps->velocity); + forward = VectorLength( pm->ps->velocity ); forward -= 20; - if ( forward <= 0 ) { - VectorClear (pm->ps->velocity); - } else { - VectorNormalize (pm->ps->velocity); - VectorScale (pm->ps->velocity, forward, pm->ps->velocity); + + if( forward <= 0 ) + VectorClear( pm->ps->velocity ); + else + { + VectorNormalize( pm->ps->velocity ); + VectorScale( pm->ps->velocity, forward, pm->ps->velocity ); } } @@ -1098,12 +1125,13 @@ static void PM_DeadMove( void ) { PM_NoclipMove =============== */ -static void PM_NoclipMove( void ) { - float speed, drop, friction, control, newspeed; +static void PM_NoclipMove( void ) +{ + float speed, drop, friction, control, newspeed; int i; - vec3_t wishvel; + vec3_t wishvel; float fmove, smove; - vec3_t wishdir; + vec3_t wishdir; float wishspeed; float scale; @@ -1111,26 +1139,29 @@ static void PM_NoclipMove( void ) { // friction - speed = VectorLength (pm->ps->velocity); - if (speed < 1) + speed = VectorLength( pm->ps->velocity ); + + if( speed < 1 ) { - VectorCopy (vec3_origin, pm->ps->velocity); + VectorCopy( vec3_origin, pm->ps->velocity ); } else { drop = 0; - friction = pm_friction*1.5; // extra friction + friction = pm_friction * 1.5; // extra friction control = speed < pm_stopspeed ? pm_stopspeed : speed; - drop += control*friction*pml.frametime; + drop += control * friction * pml.frametime; // scale the velocity newspeed = speed - drop; - if (newspeed < 0) + + if( newspeed < 0 ) newspeed = 0; + newspeed /= speed; - VectorScale (pm->ps->velocity, newspeed, pm->ps->velocity); + VectorScale( pm->ps->velocity, newspeed, pm->ps->velocity ); } // accelerate @@ -1139,18 +1170,19 @@ static void PM_NoclipMove( void ) { fmove = pm->cmd.forwardmove; smove = pm->cmd.rightmove; - for (i=0 ; i<3 ; i++) - wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; - wishvel[2] += pm->cmd.upmove; + for( i = 0; i < 3; i++ ) + wishvel[ i ] = pml.forward[ i ] * fmove + pml.right[ i ] * smove; + + wishvel[ 2 ] += pm->cmd.upmove; - VectorCopy (wishvel, wishdir); - wishspeed = VectorNormalize(wishdir); + VectorCopy( wishvel, wishdir ); + wishspeed = VectorNormalize( wishdir ); wishspeed *= scale; PM_Accelerate( wishdir, wishspeed, pm_accelerate ); // move - VectorMA (pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin); + VectorMA( pm->ps->origin, pml.frametime, pm->ps->velocity, pm->ps->origin ); } //============================================================================ @@ -1185,7 +1217,8 @@ PM_CrashLand Check for hard landings that generate sound events ================= */ -static void PM_CrashLand( void ) { +static void PM_CrashLand( void ) +{ float delta; float dist; float vel, acc; @@ -1193,17 +1226,16 @@ static void PM_CrashLand( void ) { float a, b, c, den; // decide which landing animation to use - if ( pm->ps->pm_flags & PMF_BACKWARDS_JUMP ) { + if( pm->ps->pm_flags & PMF_BACKWARDS_JUMP ) PM_ForceLegsAnim( LEGS_LANDB ); - } else { + else PM_ForceLegsAnim( LEGS_LAND ); - } pm->ps->legsTimer = TIMER_LAND; // calculate the exact velocity on landing - dist = pm->ps->origin[2] - pml.previous_origin[2]; - vel = pml.previous_velocity[2]; + dist = pm->ps->origin[ 2 ] - pml.previous_origin[ 2 ]; + vel = pml.previous_velocity[ 2 ]; acc = -pm->ps->gravity; a = acc / 2; @@ -1211,53 +1243,52 @@ static void PM_CrashLand( void ) { c = -dist; den = b * b - 4 * a * c; - if ( den < 0 ) { + if( den < 0 ) return; - } + t = (-b - sqrt( den ) ) / ( 2 * a ); delta = vel + t * acc; delta = delta*delta * 0.0001; // ducking while falling doubles damage - if ( pm->ps->pm_flags & PMF_DUCKED ) { + if( pm->ps->pm_flags & PMF_DUCKED ) delta *= 2; - } // never take falling damage if completely underwater - if ( pm->waterlevel == 3 ) { + if( pm->waterlevel == 3 ) return; - } // reduce falling damage if there is standing water - if ( pm->waterlevel == 2 ) { + if( pm->waterlevel == 2 ) delta *= 0.25; - } - if ( pm->waterlevel == 1 ) { + + if( pm->waterlevel == 1 ) delta *= 0.5; - } - if ( delta < 1 ) { + if( delta < 1 ) return; - } // create a local entity event to play the sound // SURF_NODAMAGE is used for bounce pads where you don't ever // want to take damage or play a crunch sound - if ( !(pml.groundTrace.surfaceFlags & SURF_NODAMAGE) ) { - if ( delta > 60 ) { + if( !( pml.groundTrace.surfaceFlags & SURF_NODAMAGE ) ) + { + if( delta > 60 ) + { PM_AddEvent( EV_FALL_FAR ); - } else if ( delta > 40 ) { + } + else if( delta > 40 ) + { // this is a pain grunt, so don't play it if dead - if ( pm->ps->stats[STAT_HEALTH] > 0 ) { + if( pm->ps->stats[STAT_HEALTH] > 0 ) PM_AddEvent( EV_FALL_MEDIUM ); - } - } else if ( delta > 7 ) { - PM_AddEvent( EV_FALL_SHORT ); - } else { - PM_AddEvent( PM_FootstepForSurface() ); } + else if( delta > 7 ) + PM_AddEvent( EV_FALL_SHORT ); + else + PM_AddEvent( PM_FootstepForSurface( ) ); } // start footstep cycle over @@ -1270,29 +1301,34 @@ static void PM_CrashLand( void ) { PM_CorrectAllSolid ============= */ -static int PM_CorrectAllSolid( trace_t *trace ) { - int i, j, k; +static int PM_CorrectAllSolid( trace_t *trace ) +{ + int i, j, k; vec3_t point; - if ( pm->debugLevel ) { + if( pm->debugLevel ) Com_Printf("%i:allsolid\n", c_pmove); - } // jitter around - for (i = -1; i <= 1; i++) { - for (j = -1; j <= 1; j++) { - for (k = -1; k <= 1; k++) { - VectorCopy(pm->ps->origin, point); - point[0] += (float) i; - point[1] += (float) j; - point[2] += (float) k; - pm->trace (trace, point, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask); - if ( !trace->allsolid ) { - point[0] = pm->ps->origin[0]; - point[1] = pm->ps->origin[1]; - point[2] = pm->ps->origin[2] - 0.25; - - pm->trace (trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask); + for( i = -1; i <= 1; i++ ) + { + for( j = -1; j <= 1; j++ ) + { + for( k = -1; k <= 1; k++ ) + { + VectorCopy( pm->ps->origin, point ); + point[ 0 ] += (float)i; + point[ 1 ] += (float)j; + point[ 2 ] += (float)k; + pm->trace( trace, point, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask ); + + if( !trace->allsolid ) + { + point[ 0 ] = pm->ps->origin[ 0 ]; + point[ 1 ] = pm->ps->origin[ 1 ]; + point[ 2 ] = pm->ps->origin[ 2 ] - 0.25; + + pm->trace( trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask ); pml.groundTrace = *trace; return qtrue; } @@ -1315,27 +1351,32 @@ PM_GroundTraceMissed The ground trace didn't hit a surface, so we are in freefall ============= */ -static void PM_GroundTraceMissed( void ) { +static void PM_GroundTraceMissed( void ) +{ trace_t trace; vec3_t point; - if ( pm->ps->groundEntityNum != ENTITYNUM_NONE ) { + if( pm->ps->groundEntityNum != ENTITYNUM_NONE ) + { // we just transitioned into freefall - if ( pm->debugLevel ) { - Com_Printf("%i:lift\n", c_pmove); - } + if( pm->debugLevel ) + Com_Printf( "%i:lift\n", c_pmove ); // if they aren't in a jumping animation and the ground is a ways away, force into it // if we didn't do the trace, the player would be backflipping down staircases VectorCopy( pm->ps->origin, point ); - point[2] -= 64; + point[ 2 ] -= 64; - pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask); - if ( trace.fraction == 1.0 ) { - if ( pm->cmd.forwardmove >= 0 ) { + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask ); + if( trace.fraction == 1.0 ) + { + if( pm->cmd.forwardmove >= 0 ) + { PM_ForceLegsAnim( LEGS_JUMP ); pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; - } else { + } + else + { PM_ForceLegsAnim( LEGS_JUMPB ); pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; } @@ -1639,7 +1680,8 @@ static void PM_GroundClimbTrace( void ) PM_GroundTrace ============= */ -static void PM_GroundTrace( void ) { +static void PM_GroundTrace( void ) +{ vec3_t point, forward, srotAxis; vec3_t refNormal = { 0.0f, 0.0f, 1.0f }; trace_t trace; @@ -1678,26 +1720,27 @@ static void PM_GroundTrace( void ) { if( BG_ClassHasAbility( pm->ps->stats[ STAT_PCLASS ], SCA_WALLCLIMBER ) ) VectorCopy( refNormal, pm->ps->grapplePoint ); - point[0] = pm->ps->origin[0]; - point[1] = pm->ps->origin[1]; - point[2] = pm->ps->origin[2] - 0.25; + point[ 0 ] = pm->ps->origin[ 0 ]; + point[ 1 ] = pm->ps->origin[ 1 ]; + point[ 2 ] = pm->ps->origin[ 2 ] - 0.25; //FIXME: hack until i find out where CONTENTS_BODY is getting unset for uhm.. bodies. if( pm->ps->pm_type == PM_DEAD ) - pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, MASK_PLAYERSOLID ); + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, MASK_PLAYERSOLID ); else - pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask); + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask ); + pml.groundTrace = trace; // do something corrective if the trace starts in a solid... if( trace.allsolid ) - if( !PM_CorrectAllSolid(&trace) ) + if( !PM_CorrectAllSolid( &trace ) ) return; // if the trace didn't hit anything, we are in free fall if( trace.fraction == 1.0 ) { - PM_GroundTraceMissed(); + PM_GroundTraceMissed( ); pml.groundPlane = qfalse; pml.walking = qfalse; @@ -1705,15 +1748,19 @@ static void PM_GroundTrace( void ) { } // check if getting thrown off the ground - if ( pm->ps->velocity[2] > 0 && DotProduct( pm->ps->velocity, trace.plane.normal ) > 10 ) { - if ( pm->debugLevel ) { - Com_Printf("%i:kickoff\n", c_pmove); - } + if( pm->ps->velocity[ 2 ] > 0 && DotProduct( pm->ps->velocity, trace.plane.normal ) > 10 ) + { + if( pm->debugLevel ) + Com_Printf( "%i:kickoff\n", c_pmove ); + // go into jump animation - if ( pm->cmd.forwardmove >= 0 ) { + if( pm->cmd.forwardmove >= 0 ) + { PM_ForceLegsAnim( LEGS_JUMP ); pm->ps->pm_flags &= ~PMF_BACKWARDS_JUMP; - } else { + } + else + { PM_ForceLegsAnim( LEGS_JUMPB ); pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; } @@ -1725,10 +1772,11 @@ static void PM_GroundTrace( void ) { } // slopes that are too steep will not be considered onground - if ( trace.plane.normal[2] < MIN_WALK_NORMAL ) { - if ( pm->debugLevel ) { - Com_Printf("%i:steep\n", c_pmove); - } + if( trace.plane.normal[ 2 ] < MIN_WALK_NORMAL ) + { + if( pm->debugLevel ) + Com_Printf( "%i:steep\n", c_pmove ); + // FIXME: if they can't slide down the slope, let them // walk (sharp crevices) pm->ps->groundEntityNum = ENTITYNUM_NONE; @@ -1741,23 +1789,24 @@ static void PM_GroundTrace( void ) { pml.walking = qtrue; // hitting solid ground will end a waterjump - if (pm->ps->pm_flags & PMF_TIME_WATERJUMP) + if( pm->ps->pm_flags & PMF_TIME_WATERJUMP ) { - pm->ps->pm_flags &= ~(PMF_TIME_WATERJUMP | PMF_TIME_LAND); + pm->ps->pm_flags &= ~( PMF_TIME_WATERJUMP | PMF_TIME_LAND ); pm->ps->pm_time = 0; } - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) { + if( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + { // just hit the ground - if ( pm->debugLevel ) { - Com_Printf("%i:Land\n", c_pmove); - } + if( pm->debugLevel ) + Com_Printf( "%i:Land\n", c_pmove ); if( BG_ClassHasAbility( pm->ps->stats[ STAT_PCLASS ], SCA_TAKESFALLDAMAGE ) ) - PM_CrashLand(); + PM_CrashLand( ); // don't do landing time if we were just going down a slope - if ( pml.previous_velocity[2] < -200 ) { + if( pml.previous_velocity[ 2 ] < -200 ) + { // don't allow another jump for a little while pm->ps->pm_flags |= PMF_TIME_LAND; pm->ps->pm_time = 250; @@ -1778,8 +1827,9 @@ static void PM_GroundTrace( void ) { PM_SetWaterLevel FIXME: avoid this twice? certainly if not moving ============= */ -static void PM_SetWaterLevel( void ) { - vec3_t point; +static void PM_SetWaterLevel( void ) +{ + vec3_t point; int cont; int sample1; int sample2; @@ -1790,29 +1840,31 @@ static void PM_SetWaterLevel( void ) { pm->waterlevel = 0; pm->watertype = 0; - point[0] = pm->ps->origin[0]; - point[1] = pm->ps->origin[1]; - point[2] = pm->ps->origin[2] + MINS_Z + 1; + point[ 0 ] = pm->ps->origin[ 0 ]; + point[ 1 ] = pm->ps->origin[ 1 ]; + point[ 2 ] = pm->ps->origin[ 2 ] + MINS_Z + 1; cont = pm->pointcontents( point, pm->ps->clientNum ); - if ( cont & MASK_WATER ) { + if( cont & MASK_WATER ) + { sample2 = pm->ps->viewheight - MINS_Z; sample1 = sample2 / 2; pm->watertype = cont; pm->waterlevel = 1; - point[2] = pm->ps->origin[2] + MINS_Z + sample1; - cont = pm->pointcontents (point, pm->ps->clientNum ); - if ( cont & MASK_WATER ) { + point[ 2 ] = pm->ps->origin[ 2 ] + MINS_Z + sample1; + cont = pm->pointcontents( point, pm->ps->clientNum ); + + if( cont & MASK_WATER ) + { pm->waterlevel = 2; - point[2] = pm->ps->origin[2] + MINS_Z + sample2; - cont = pm->pointcontents (point, pm->ps->clientNum ); - if ( cont & MASK_WATER ){ + point[ 2 ] = pm->ps->origin[ 2 ] + MINS_Z + sample2; + cont = pm->pointcontents( point, pm->ps->clientNum ); + + if( cont & MASK_WATER ) pm->waterlevel = 3; - } } } - } @@ -1837,13 +1889,13 @@ static void PM_CheckDuck (void) if( pm->ps->persistant[ PERS_TEAM ] == TEAM_SPECTATOR ) PCcvh = PCvh; - pm->mins[0] = PCmins[0]; - pm->mins[1] = PCmins[1]; + pm->mins[ 0 ] = PCmins[ 0 ]; + pm->mins[ 1 ] = PCmins[ 1 ]; - pm->maxs[0] = PCmaxs[0]; - pm->maxs[1] = PCmaxs[1]; + pm->maxs[ 0 ] = PCmaxs[ 0 ]; + pm->maxs[ 1 ] = PCmaxs[ 1 ]; - pm->mins[2] = PCmins[2]; + pm->mins[ 2 ] = PCmins[ 2 ]; if (pm->ps->pm_type == PM_DEAD) { @@ -1863,21 +1915,21 @@ static void PM_CheckDuck (void) if (pm->ps->pm_flags & PMF_DUCKED) { // try to stand up - pm->maxs[2] = PCmaxs[2]; - pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask ); - if (!trace.allsolid) + pm->maxs[ 2 ] = PCmaxs[ 2 ]; + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, pm->ps->origin, pm->ps->clientNum, pm->tracemask ); + if( !trace.allsolid ) pm->ps->pm_flags &= ~PMF_DUCKED; } } - if (pm->ps->pm_flags & PMF_DUCKED) + if( pm->ps->pm_flags & PMF_DUCKED ) { - pm->maxs[2] = PCcmaxs[2]; + pm->maxs[ 2 ] = PCcmaxs[ 2 ]; pm->ps->viewheight = PCcvh; } else { - pm->maxs[2] = PCmaxs[2]; + pm->maxs[ 2 ] = PCmaxs[ 2 ]; pm->ps->viewheight = PCvh; } } @@ -1892,9 +1944,10 @@ static void PM_CheckDuck (void) PM_Footsteps =============== */ -static void PM_Footsteps( void ) { - float bobmove; - int old; +static void PM_Footsteps( void ) +{ + float bobmove; + int old; qboolean footstep; // @@ -1904,31 +1957,33 @@ static void PM_Footsteps( void ) { if( BG_ClassHasAbility( pm->ps->stats[ STAT_PCLASS ], SCA_WALLCLIMBER ) && ( pml.groundPlane ) ) { //TA: FIXME: yes yes i know this is wrong - pm->xyspeed = sqrt( pm->ps->velocity[0] * pm->ps->velocity[0] - + pm->ps->velocity[1] * pm->ps->velocity[1] - + pm->ps->velocity[2] * pm->ps->velocity[2] ); + pm->xyspeed = sqrt( pm->ps->velocity[ 0 ] * pm->ps->velocity[ 0 ] + + pm->ps->velocity[ 1 ] * pm->ps->velocity[ 1 ] + + pm->ps->velocity[ 2 ] * pm->ps->velocity[ 2 ] ); } else - pm->xyspeed = sqrt( pm->ps->velocity[0] * pm->ps->velocity[0] - + pm->ps->velocity[1] * pm->ps->velocity[1] ); + pm->xyspeed = sqrt( pm->ps->velocity[ 0 ] * pm->ps->velocity[ 0 ] + + pm->ps->velocity[ 1 ] * pm->ps->velocity[ 1 ] ); - if ( pm->ps->groundEntityNum == ENTITYNUM_NONE ) { + if( pm->ps->groundEntityNum == ENTITYNUM_NONE ) + { // airborne leaves position in cycle intact, but doesn't advance - if ( pm->waterlevel > 1 ) { + if( pm->waterlevel > 1 ) PM_ContinueLegsAnim( LEGS_SWIM ); - } + return; } // if not trying to move - if ( !pm->cmd.forwardmove && !pm->cmd.rightmove ) { - if ( pm->xyspeed < 5 ) { + if( !pm->cmd.forwardmove && !pm->cmd.rightmove ) + { + if( pm->xyspeed < 5 ) + { pm->ps->bobCycle = 0; // start at beginning of cycle again - if ( pm->ps->pm_flags & PMF_DUCKED ) { + if( pm->ps->pm_flags & PMF_DUCKED ) PM_ContinueLegsAnim( LEGS_IDLECR ); - } else { + else PM_ContinueLegsAnim( LEGS_IDLE ); - } } return; } @@ -1936,14 +1991,15 @@ static void PM_Footsteps( void ) { footstep = qfalse; - if ( pm->ps->pm_flags & PMF_DUCKED ) { + if( pm->ps->pm_flags & PMF_DUCKED ) + { bobmove = 0.5; // ducked characters bob much faster - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { + + if( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) PM_ContinueLegsAnim( LEGS_BACKCR ); - } - else { + else PM_ContinueLegsAnim( LEGS_WALKCR ); - } + // ducked characters never play footsteps /* } else if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { @@ -1955,26 +2011,28 @@ static void PM_Footsteps( void ) { } PM_ContinueLegsAnim( LEGS_BACK ); */ - } else { + } + else + { //TA: switch walking/running anims based on speed //if ( !( pm->cmd.buttons & BUTTON_WALKING ) ) { - if ( pm->xyspeed > 160 ) { + if( pm->xyspeed > 160 ) + { bobmove = 0.4f; // faster speeds bob faster - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { + if( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) PM_ContinueLegsAnim( LEGS_BACK ); - } - else { + else PM_ContinueLegsAnim( LEGS_RUN ); - } + footstep = qtrue; - } else { + } + else + { bobmove = 0.3f; // walking bobs slow - if ( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) { + if( pm->ps->pm_flags & PMF_BACKWARDS_RUN ) PM_ContinueLegsAnim( LEGS_BACKWALK ); - } - else { + else PM_ContinueLegsAnim( LEGS_WALK ); - } } } @@ -1983,21 +2041,27 @@ static void PM_Footsteps( void ) { pm->ps->bobCycle = (int)( old + bobmove * pml.msec ) & 255; // if we just crossed a cycle boundary, play an apropriate footstep event - if ( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) { - if ( pm->waterlevel == 0 ) { + if( ( ( old + 64 ) ^ ( pm->ps->bobCycle + 64 ) ) & 128 ) + { + if( pm->waterlevel == 0 ) + { // on ground will only play sounds if running - if ( footstep && !pm->noFootsteps ) { - PM_AddEvent( PM_FootstepForSurface() ); - } - } else if ( pm->waterlevel == 1 ) { + if( footstep && !pm->noFootsteps ) + PM_AddEvent( PM_FootstepForSurface( ) ); + } + else if( pm->waterlevel == 1 ) + { // splashing PM_AddEvent( EV_FOOTSPLASH ); - } else if ( pm->waterlevel == 2 ) { + } + else if( pm->waterlevel == 2 ) + { // wading / swimming at surface PM_AddEvent( EV_SWIM ); - } else if ( pm->waterlevel == 3 ) { + } + else if( pm->waterlevel == 3 ) + { // no sound when completely underwater - } } } @@ -2009,34 +2073,32 @@ PM_WaterEvents Generate sound events for entering and leaving water ============== */ -static void PM_WaterEvents( void ) { // FIXME? +static void PM_WaterEvents( void ) +{ + // FIXME? // // if just entered a water volume, play a sound // - if (!pml.previous_waterlevel && pm->waterlevel) { + if( !pml.previous_waterlevel && pm->waterlevel ) PM_AddEvent( EV_WATER_TOUCH ); - } // // if just completely exited a water volume, play a sound // - if (pml.previous_waterlevel && !pm->waterlevel) { + if( pml.previous_waterlevel && !pm->waterlevel ) PM_AddEvent( EV_WATER_LEAVE ); - } // // check for head just going under water // - if (pml.previous_waterlevel != 3 && pm->waterlevel == 3) { + if( pml.previous_waterlevel != 3 && pm->waterlevel == 3 ) PM_AddEvent( EV_WATER_UNDER ); - } // // check for head just coming out of water // - if (pml.previous_waterlevel == 3 && pm->waterlevel != 3) { + if( pml.previous_waterlevel == 3 && pm->waterlevel != 3 ) PM_AddEvent( EV_WATER_CLEAR ); - } } @@ -2045,18 +2107,16 @@ static void PM_WaterEvents( void ) { // FIXME? PM_BeginWeaponChange =============== */ -static void PM_BeginWeaponChange( int weapon ) { - if ( weapon < WP_NONE || weapon >= WP_NUM_WEAPONS ) { +static void PM_BeginWeaponChange( int weapon ) +{ + if( weapon < WP_NONE || weapon >= WP_NUM_WEAPONS ) return; - } - if ( !BG_gotWeapon( weapon, pm->ps->stats ) && weapon != WP_NONE ) { + if( !BG_gotWeapon( weapon, pm->ps->stats ) && weapon != WP_NONE ) return; - } - if ( pm->ps->weaponstate == WEAPON_DROPPING ) { + if( pm->ps->weaponstate == WEAPON_DROPPING ) return; - } PM_AddEvent( EV_CHANGE_WEAPON ); pm->ps->weaponstate = WEAPON_DROPPING; @@ -2070,17 +2130,16 @@ static void PM_BeginWeaponChange( int weapon ) { PM_FinishWeaponChange =============== */ -static void PM_FinishWeaponChange( void ) { +static void PM_FinishWeaponChange( void ) +{ int weapon; weapon = pm->cmd.weapon; - if ( weapon < WP_NONE || weapon >= WP_NUM_WEAPONS ) { + if( weapon < WP_NONE || weapon >= WP_NUM_WEAPONS ) weapon = WP_NONE; - } - if ( !BG_gotWeapon( weapon, pm->ps->stats ) ) { + if( !BG_gotWeapon( weapon, pm->ps->stats ) ) weapon = WP_NONE; - } pm->ps->weapon = weapon; pm->ps->weaponstate = WEAPON_RAISING; @@ -2097,7 +2156,7 @@ PM_TorsoAnimation */ static void PM_TorsoAnimation( void ) { - if ( pm->ps->weaponstate == WEAPON_READY ) + if( pm->ps->weaponstate == WEAPON_READY ) PM_ContinueTorsoAnim( TORSO_STAND ); } @@ -2139,11 +2198,11 @@ static void PM_Weapon( void ) qboolean attack3 = qfalse; // don't allow attack until all buttons are up - if ( pm->ps->pm_flags & PMF_RESPAWNED ) + if( pm->ps->pm_flags & PMF_RESPAWNED ) return; // ignore if spectator - if ( pm->ps->persistant[PERS_TEAM] == TEAM_SPECTATOR ) + if( pm->ps->persistant[ PERS_TEAM ] == TEAM_SPECTATOR ) return; if( pm->ps->stats[ STAT_STATE ] & SS_INFESTING ) @@ -2156,16 +2215,15 @@ static void PM_Weapon( void ) return; // check for dead player - if ( pm->ps->stats[STAT_HEALTH] <= 0 ) + if( pm->ps->stats[ STAT_HEALTH ] <= 0 ) { pm->ps->weapon = WP_NONE; return; } // make weapon function - if ( pm->ps->weaponTime > 0 ) { + if( pm->ps->weaponTime > 0 ) pm->ps->weaponTime -= pml.msec; - } //TA: if we haven't got the weapon if( !BG_gotWeapon( pm->ps->weapon, pm->ps->stats ) && pm->ps->weapon != WP_NONE ) @@ -2433,9 +2491,12 @@ static void PM_Weapon( void ) PM_Animate ================ */ -static void PM_Animate( void ) { - if ( pm->cmd.buttons & BUTTON_GESTURE ) { - if ( pm->ps->torsoTimer == 0 ) { +static void PM_Animate( void ) +{ + if( pm->cmd.buttons & BUTTON_GESTURE ) + { + if( pm->ps->torsoTimer == 0 ) + { PM_StartTorsoAnim( TORSO_GESTURE ); pm->ps->torsoTimer = TIMER_GESTURE; PM_AddEvent( EV_TAUNT ); @@ -2449,30 +2510,35 @@ static void PM_Animate( void ) { PM_DropTimers ================ */ -static void PM_DropTimers( void ) { +static void PM_DropTimers( void ) +{ // drop misc timing counter - if ( pm->ps->pm_time ) { - if ( pml.msec >= pm->ps->pm_time ) { + if( pm->ps->pm_time ) + { + if( pml.msec >= pm->ps->pm_time ) + { pm->ps->pm_flags &= ~PMF_ALL_TIMES; pm->ps->pm_time = 0; - } else { - pm->ps->pm_time -= pml.msec; } + else + pm->ps->pm_time -= pml.msec; } // drop animation counter - if ( pm->ps->legsTimer > 0 ) { + if( pm->ps->legsTimer > 0 ) + { pm->ps->legsTimer -= pml.msec; - if ( pm->ps->legsTimer < 0 ) { + + if( pm->ps->legsTimer < 0 ) pm->ps->legsTimer = 0; - } } - if ( pm->ps->torsoTimer > 0 ) { + if( pm->ps->torsoTimer > 0 ) + { pm->ps->torsoTimer -= pml.msec; - if ( pm->ps->torsoTimer < 0 ) { + + if( pm->ps->torsoTimer < 0 ) pm->ps->torsoTimer = 0; - } } } @@ -2616,44 +2682,42 @@ void PmoveSingle (pmove_t *pmove) // make sure walking button is clear if they are running, to avoid // proxy no-footsteps cheats - if ( abs( pm->cmd.forwardmove ) > 64 || abs( pm->cmd.rightmove ) > 64 ) { + if( abs( pm->cmd.forwardmove ) > 64 || abs( pm->cmd.rightmove ) > 64 ) pm->cmd.buttons &= ~BUTTON_WALKING; - } // set the talk balloon flag - if ( pm->cmd.buttons & BUTTON_TALK ) { + if( pm->cmd.buttons & BUTTON_TALK ) pm->ps->eFlags |= EF_TALK; - } else { + else pm->ps->eFlags &= ~EF_TALK; - } // set the firing flag for continuous beam weapons - if ( !(pm->ps->pm_flags & PMF_RESPAWNED) && pm->ps->pm_type != PM_INTERMISSION - && ( pm->cmd.buttons & BUTTON_ATTACK ) - && ( ( ammo > 0 || clips > 0 ) || BG_FindInfinteAmmoForWeapon( pm->ps->weapon ) ) ) + if( !(pm->ps->pm_flags & PMF_RESPAWNED) && pm->ps->pm_type != PM_INTERMISSION && + ( pm->cmd.buttons & BUTTON_ATTACK ) && + ( ( ammo > 0 || clips > 0 ) || BG_FindInfinteAmmoForWeapon( pm->ps->weapon ) ) ) pm->ps->eFlags |= EF_FIRING; else pm->ps->eFlags &= ~EF_FIRING; // set the firing flag for continuous beam weapons - if ( !(pm->ps->pm_flags & PMF_RESPAWNED) && pm->ps->pm_type != PM_INTERMISSION - && ( pm->cmd.buttons & BUTTON_ATTACK2 ) - && ( ( ammo > 0 || clips > 0 ) || BG_FindInfinteAmmoForWeapon( pm->ps->weapon ) ) ) + if( !(pm->ps->pm_flags & PMF_RESPAWNED) && pm->ps->pm_type != PM_INTERMISSION && + ( pm->cmd.buttons & BUTTON_ATTACK2 ) && + ( ( ammo > 0 || clips > 0 ) || BG_FindInfinteAmmoForWeapon( pm->ps->weapon ) ) ) pm->ps->eFlags |= EF_FIRING2; else pm->ps->eFlags &= ~EF_FIRING2; // clear the respawned flag if attack and use are cleared - if ( pm->ps->stats[STAT_HEALTH] > 0 && - !( pm->cmd.buttons & (BUTTON_ATTACK | BUTTON_USE_HOLDABLE) ) ) { + if( pm->ps->stats[STAT_HEALTH] > 0 && + !( pm->cmd.buttons & ( BUTTON_ATTACK | BUTTON_USE_HOLDABLE ) ) ) pm->ps->pm_flags &= ~PMF_RESPAWNED; - } // if talk button is down, dissallow all other input // this is to prevent any possible intercept proxy from // adding fake talk balloons - if ( pmove->cmd.buttons & BUTTON_TALK ) { + if( pmove->cmd.buttons & BUTTON_TALK ) + { pmove->cmd.buttons = BUTTON_TALK; pmove->cmd.forwardmove = 0; pmove->cmd.rightmove = 0; @@ -2661,38 +2725,39 @@ void PmoveSingle (pmove_t *pmove) } // clear all pmove local vars - memset (&pml, 0, sizeof(pml)); + memset( &pml, 0, sizeof( pml ) ); // determine the time pml.msec = pmove->cmd.serverTime - pm->ps->commandTime; - if ( pml.msec < 1 ) { + + if( pml.msec < 1 ) pml.msec = 1; - } else if ( pml.msec > 200 ) { + else if( pml.msec > 200 ) pml.msec = 200; - } + pm->ps->commandTime = pmove->cmd.serverTime; // save old org in case we get stuck - VectorCopy (pm->ps->origin, pml.previous_origin); + VectorCopy( pm->ps->origin, pml.previous_origin ); // save old velocity for crashlanding - VectorCopy (pm->ps->velocity, pml.previous_velocity); + VectorCopy( pm->ps->velocity, pml.previous_velocity ); pml.frametime = pml.msec * 0.001; AngleVectors( pm->ps->viewangles, pml.forward, pml.right, pml.up ); - if ( pm->cmd.upmove < 10 ) { + if( pm->cmd.upmove < 10 ) + { // not holding jump pm->ps->pm_flags &= ~PMF_JUMP_HELD; } // decide if backpedaling animations should be used - if ( pm->cmd.forwardmove < 0 ) { + if( pm->cmd.forwardmove < 0 ) pm->ps->pm_flags |= PMF_BACKWARDS_RUN; - } else if ( pm->cmd.forwardmove > 0 || ( pm->cmd.forwardmove == 0 && pm->cmd.rightmove ) ) { + else if( pm->cmd.forwardmove > 0 || ( pm->cmd.forwardmove == 0 && pm->cmd.rightmove ) ) pm->ps->pm_flags &= ~PMF_BACKWARDS_RUN; - } if ( pm->ps->pm_type >= PM_DEAD ) { @@ -2701,38 +2766,38 @@ void PmoveSingle (pmove_t *pmove) pm->cmd.upmove = 0; } - if ( pm->ps->pm_type == PM_SPECTATOR ) { + if( pm->ps->pm_type == PM_SPECTATOR ) + { // update the viewangles PM_UpdateViewAngles( pm->ps, &pm->cmd ); - PM_CheckDuck (); - PM_FlyMove (); - PM_DropTimers (); + PM_CheckDuck( ); + PM_FlyMove( ); + PM_DropTimers( ); return; } - if ( pm->ps->pm_type == PM_NOCLIP ) { - PM_NoclipMove (); - PM_DropTimers (); + if( pm->ps->pm_type == PM_NOCLIP ) + { + PM_NoclipMove( ); + PM_DropTimers( ); return; } - if (pm->ps->pm_type == PM_FREEZE) { + if( pm->ps->pm_type == PM_FREEZE) return; // no movement at all - } - if ( pm->ps->pm_type == PM_INTERMISSION || pm->ps->pm_type == PM_SPINTERMISSION ) { + if( pm->ps->pm_type == PM_INTERMISSION || pm->ps->pm_type == PM_SPINTERMISSION ) return; // no movement at all - } // set watertype, and waterlevel - PM_SetWaterLevel(); + PM_SetWaterLevel( ); pml.previous_waterlevel = pmove->waterlevel; // set mins, maxs, and viewheight - PM_CheckDuck (); + PM_CheckDuck( ); // set groundentity - PM_GroundTrace(); + PM_GroundTrace( ); // update the viewangles PM_UpdateViewAngles( pm->ps, &pm->cmd ); @@ -2798,46 +2863,44 @@ Pmove Can be called by either the server or the client ================ */ -void Pmove (pmove_t *pmove) { - int finalTime; +void Pmove( pmove_t *pmove ) +{ + int finalTime; finalTime = pmove->cmd.serverTime; - if ( finalTime < pmove->ps->commandTime ) { + if( finalTime < pmove->ps->commandTime ) return; // should not happen - } - if ( finalTime > pmove->ps->commandTime + 1000 ) { + if( finalTime > pmove->ps->commandTime + 1000 ) pmove->ps->commandTime = finalTime - 1000; - } - pmove->ps->pmove_framecount = (pmove->ps->pmove_framecount+1) & ((1<ps->pmove_framecount = ( pmove->ps->pmove_framecount + 1 ) & ( ( 1 << PS_PMOVEFRAMECOUNTBITS ) - 1 ); // chop the move up if it is too long, to prevent framerate // dependent behavior - while ( pmove->ps->commandTime != finalTime ) { + while( pmove->ps->commandTime != finalTime ) + { int msec; msec = finalTime - pmove->ps->commandTime; - if ( pmove->pmove_fixed ) { - if ( msec > pmove->pmove_msec ) { + if( pmove->pmove_fixed ) + { + if( msec > pmove->pmove_msec ) msec = pmove->pmove_msec; - } } - else { - if ( msec > 66 ) { + else + { + if( msec > 66 ) msec = 66; - } } pmove->cmd.serverTime = pmove->ps->commandTime + msec; PmoveSingle( pmove ); - if ( pmove->ps->pm_flags & PMF_JUMP_HELD ) { + if( pmove->ps->pm_flags & PMF_JUMP_HELD ) pmove->cmd.upmove = 20; - } } - } diff --git a/src/game/bg_public.h b/src/game/bg_public.h index 97def1db..c8341ce1 100644 --- a/src/game/bg_public.h +++ b/src/game/bg_public.h @@ -103,7 +103,12 @@ #error overflow: (CS_MAX) > MAX_CONFIGSTRINGS #endif -typedef enum { GENDER_MALE, GENDER_FEMALE, GENDER_NEUTER } gender_t; +typedef enum +{ + GENDER_MALE, + GENDER_FEMALE, + GENDER_NEUTER +} gender_t; /* =================================================================================== @@ -116,7 +121,8 @@ movement on the server game. =================================================================================== */ -typedef enum { +typedef enum +{ PM_NORMAL, // can accelerate and turn PM_NOCLIP, // noclip movement PM_SPECTATOR, // still run into walls @@ -128,7 +134,8 @@ typedef enum { PM_SPINTERMISSION // no movement or status bar } pmtype_t; -typedef enum { +typedef enum +{ WEAPON_READY, WEAPON_RAISING, WEAPON_DROPPING, @@ -157,52 +164,55 @@ typedef enum { #define PMF_ALL_TIMES (PMF_TIME_WATERJUMP|PMF_TIME_LAND|PMF_TIME_KNOCKBACK) #define MAXTOUCH 32 -typedef struct { +typedef struct +{ // state (in / out) playerState_t *ps; // command (in) - usercmd_t cmd; - int tracemask; // collide against these types of surfaces - int debugLevel; // if set, diagnostic output will be printed - qboolean noFootsteps; // if the game is setup for no footsteps by the server - qboolean autoWeaponHit[ 32 ]; //FIXME: TA: remind myself later this might be a problem + usercmd_t cmd; + int tracemask; // collide against these types of surfaces + int debugLevel; // if set, diagnostic output will be printed + qboolean noFootsteps; // if the game is setup for no footsteps by the server + qboolean autoWeaponHit[ 32 ]; //FIXME: TA: remind myself later this might be a problem - int framecount; + int framecount; // results (out) - int numtouch; - int touchents[MAXTOUCH]; + int numtouch; + int touchents[ MAXTOUCH ]; - vec3_t mins, maxs; // bounding box size + vec3_t mins, maxs; // bounding box size - int watertype; - int waterlevel; + int watertype; + int waterlevel; - float xyspeed; + float xyspeed; // for fixed msec Pmove - int pmove_fixed; - int pmove_msec; + int pmove_fixed; + int pmove_msec; // callbacks to test the world // these will be different functions during game and cgame /*void (*trace)( trace_t *results, const vec3_t start, vec3_t mins, vec3_t maxs, const vec3_t end, int passEntityNum, int contentMask );*/ - void (*trace)( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentMask ); + void (*trace)( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, + const vec3_t end, int passEntityNum, int contentMask ); - int (*pointcontents)( const vec3_t point, int passEntityNum ); + int (*pointcontents)( const vec3_t point, int passEntityNum ); } pmove_t; // if a full pmove isn't done on the client, you can just update the angles void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd ); -void Pmove (pmove_t *pmove); +void Pmove( pmove_t *pmove ); //=================================================================================== // player_state->stats[] indexes -typedef enum { +typedef enum +{ STAT_HEALTH, STAT_ITEMS, STAT_SLOTS, //TA: tracks the amount of stuff human players are carrying @@ -248,14 +258,13 @@ typedef enum { // player_state->persistant[] indexes // these fields are the only part of player_state that isn't // cleared on respawn -typedef enum { +typedef enum +{ PERS_SCORE, // !!! MUST NOT CHANGE, SERVER AND GAME BOTH REFERENCE !!! PERS_HITS, // total points damage inflicted so damage beeps can sound on change PERS_RANK, PERS_TEAM, PERS_SPAWN_COUNT, // incremented every respawn - PERS_PLAYEREVENTS, // 16 bits that can be flipped for events - PERS_REWARD, // a reward_t PERS_ATTACKER, // clientnum of last damage inflicter PERS_KILLED, // count of the number of times you died @@ -286,7 +295,8 @@ typedef enum { #define EF_OVERDRAW_OFF 0x00008000 // TA: disable overdraw protection on sprites #define EF_REAL_LIGHT 0x00010000 // TA: light sprites according to ambient light -typedef enum { +typedef enum +{ PW_NONE, PW_QUAD, @@ -303,7 +313,8 @@ typedef enum { PW_NUM_POWERUPS } powerup_t; -typedef enum { +typedef enum +{ HI_NONE, HI_TELEPORTER, @@ -334,7 +345,6 @@ typedef enum WP_MACHINEGUN, WP_CHAINGUN, WP_FLAMER, - WP_PLASMAGUN, WP_MASS_DRIVER, WP_PULSE_RIFLE, WP_LUCIFER_CANON, @@ -384,14 +394,14 @@ typedef enum } WUTeam_t; //TA: bitmasks for upgrade slots -#define SLOT_NONE 0 -#define SLOT_HEAD 1 -#define SLOT_TORSO 2 -#define SLOT_ARMS 4 -#define SLOT_LEGS 8 -#define SLOT_BACKPACK 16 -#define SLOT_WEAPON 32 -#define SLOT_SIDEARM 64 +#define SLOT_NONE 0x00000000 +#define SLOT_HEAD 0x00000001 +#define SLOT_TORSO 0x00000002 +#define SLOT_ARMS 0x00000004 +#define SLOT_LEGS 0x00000008 +#define SLOT_BACKPACK 0x00000010 +#define SLOT_WEAPON 0x00000020 +#define SLOT_SIDEARM 0x00000040 typedef enum { @@ -410,9 +420,8 @@ typedef enum BA_H_SPAWN, - BA_H_DEF1, - BA_H_DEF2, - BA_H_DEF3, + BA_H_MGTURRET, + BA_H_TESLAGEN, BA_H_MCU, BA_H_DCC, @@ -443,9 +452,9 @@ typedef enum // reward sounds (stored in ps->persistant[PERS_PLAYEREVENTS]) -#define PLAYEREVENT_DENIEDREWARD 0x0001 +#define PLAYEREVENT_DENIEDREWARD 0x0001 #define PLAYEREVENT_GAUNTLETREWARD 0x0002 -#define PLAYEREVENT_HOLYSHIT 0x0004 +#define PLAYEREVENT_HOLYSHIT 0x0004 // entityState_t->event values // entity events are for effects that take place reletive @@ -462,7 +471,8 @@ typedef enum #define EVENT_VALID_MSEC 300 -typedef enum { +typedef enum +{ EV_NONE, EV_FOOTSTEP, @@ -541,7 +551,7 @@ typedef enum { EV_MISSILE_HIT, EV_MISSILE_MISS, EV_MISSILE_MISS_METAL, - EV_ITEM_EXPLOSION, //TA: human item explosions + EV_BUILDABLE_EXPLOSION, //TA: human item explosions EV_RAILTRAIL, EV_TESLATRAIL, EV_ALIENZAP, @@ -614,12 +624,12 @@ typedef enum MN_H_NOSLOTS, MN_H_NOFUNDS, MN_H_NODCC, - MN_H_ITEMHELD - + MN_H_ITEMHELD } dynMenu_t; // animations -typedef enum { +typedef enum +{ BOTH_DEATH1, BOTH_DEAD1, BOTH_DEATH2, @@ -701,7 +711,8 @@ typedef enum MAX_BUILDABLE_ANIMATIONS } buildableAnimNumber_t; -typedef struct animation_s { +typedef struct animation_s +{ int firstFrame; int numFrames; int loopFrames; // 0 to numFrames @@ -717,7 +728,8 @@ typedef struct animation_s { #define ANIM_TOGGLEBIT 128 -typedef enum { +typedef enum +{ TEAM_FREE, TEAM_SPECTATOR, @@ -757,7 +769,8 @@ typedef enum //TA: player teams -typedef enum { +typedef enum +{ PTE_NONE, PTE_ALIENS, PTE_HUMANS, @@ -767,7 +780,8 @@ typedef enum { // means of death -typedef enum { +typedef enum +{ MOD_UNKNOWN, MOD_SHOTGUN, MOD_GAUNTLET, @@ -802,7 +816,8 @@ typedef enum { //--------------------------------------------------------- // gitem_t->type -typedef enum { +typedef enum +{ IT_BAD, IT_WEAPON, // EFX: rotate + upscale + minlight IT_BUILDABLE, //TA: gitem_t->type for buildable items (spawns etc.) @@ -819,7 +834,8 @@ typedef enum { #define MAX_ITEM_MODELS 4 -typedef struct gitem_s { +typedef struct gitem_s +{ char *classname; // spawning name char *pickup_sound; char *world_model[MAX_ITEM_MODELS]; @@ -1115,7 +1131,8 @@ WUTeam_t BG_FindTeamForUpgrade( int upgrade ); // // entityState_t->eType // -typedef enum { +typedef enum +{ ET_GENERAL, ET_PLAYER, ET_ITEM, diff --git a/src/game/bg_slidemove.c b/src/game/bg_slidemove.c index b3ee8fa7..4abd5ddf 100644 --- a/src/game/bg_slidemove.c +++ b/src/game/bg_slidemove.c @@ -34,187 +34,193 @@ PM_SlideMove Returns qtrue if the velocity was clipped in some way ================== */ -#define MAX_CLIP_PLANES 5 -qboolean PM_SlideMove( qboolean gravity ) { - int bumpcount, numbumps; - vec3_t dir; - float d; - int numplanes; - vec3_t planes[MAX_CLIP_PLANES]; - vec3_t primal_velocity; - vec3_t clipVelocity; - int i, j, k; - trace_t trace; - vec3_t end; - float time_left; - float into; - vec3_t endVelocity; - vec3_t endClipVelocity; - - numbumps = 4; - - VectorCopy (pm->ps->velocity, primal_velocity); - - if ( gravity ) { - VectorCopy( pm->ps->velocity, endVelocity ); - endVelocity[2] -= pm->ps->gravity * pml.frametime; - pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5; - primal_velocity[2] = endVelocity[2]; - if ( pml.groundPlane ) { - // slide along the ground plane - PM_ClipVelocity (pm->ps->velocity, pml.groundTrace.plane.normal, - pm->ps->velocity, OVERCLIP ); - } - } - - time_left = pml.frametime; - - // never turn against the ground plane - if ( pml.groundPlane ) { - numplanes = 1; - VectorCopy( pml.groundTrace.plane.normal, planes[0] ); - } else { - numplanes = 0; - } - - // never turn against original velocity - VectorNormalize2( pm->ps->velocity, planes[numplanes] ); - numplanes++; - - for ( bumpcount=0 ; bumpcount < numbumps ; bumpcount++ ) { - - // calculate position we are trying to move to - VectorMA( pm->ps->origin, time_left, pm->ps->velocity, end ); - - // see if we can make it there - pm->trace ( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask); - - if (trace.allsolid) { - // entity is completely trapped in another solid - pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration - return qtrue; - } - - if (trace.fraction > 0) { - // actually covered some distance - VectorCopy (trace.endpos, pm->ps->origin); - } - - if (trace.fraction == 1) { - break; // moved the entire distance - } - - // save entity for contact - PM_AddTouchEnt( trace.entityNum ); - - time_left -= time_left * trace.fraction; - - if (numplanes >= MAX_CLIP_PLANES) { - // this shouldn't really happen - VectorClear( pm->ps->velocity ); - return qtrue; - } - - // - // if this is the same plane we hit before, nudge velocity - // out along it, which fixes some epsilon issues with - // non-axial planes - // - for ( i = 0 ; i < numplanes ; i++ ) { - if ( DotProduct( trace.plane.normal, planes[i] ) > 0.99 ) { - VectorAdd( trace.plane.normal, pm->ps->velocity, pm->ps->velocity ); - break; - } - } - if ( i < numplanes ) { - continue; - } - VectorCopy (trace.plane.normal, planes[numplanes]); - numplanes++; - - // - // modify velocity so it parallels all of the clip planes - // - - // find a plane that it enters - for ( i = 0 ; i < numplanes ; i++ ) { - into = DotProduct( pm->ps->velocity, planes[i] ); - if ( into >= 0.1 ) { - continue; // move doesn't interact with the plane - } - - // see how hard we are hitting things - if ( -into > pml.impactSpeed ) { - pml.impactSpeed = -into; - } - - // slide along the plane - PM_ClipVelocity (pm->ps->velocity, planes[i], clipVelocity, OVERCLIP ); - - // slide along the plane - PM_ClipVelocity (endVelocity, planes[i], endClipVelocity, OVERCLIP ); - - // see if there is a second plane that the new move enters - for ( j = 0 ; j < numplanes ; j++ ) { - if ( j == i ) { - continue; - } - if ( DotProduct( clipVelocity, planes[j] ) >= 0.1 ) { - continue; // move doesn't interact with the plane - } - - // try clipping the move to the plane - PM_ClipVelocity( clipVelocity, planes[j], clipVelocity, OVERCLIP ); - PM_ClipVelocity( endClipVelocity, planes[j], endClipVelocity, OVERCLIP ); - - // see if it goes back into the first clip plane - if ( DotProduct( clipVelocity, planes[i] ) >= 0 ) { - continue; - } - - // slide the original velocity along the crease - CrossProduct (planes[i], planes[j], dir); - VectorNormalize( dir ); - d = DotProduct( dir, pm->ps->velocity ); - VectorScale( dir, d, clipVelocity ); - - CrossProduct (planes[i], planes[j], dir); - VectorNormalize( dir ); - d = DotProduct( dir, endVelocity ); - VectorScale( dir, d, endClipVelocity ); - - // see if there is a third plane the the new move enters - for ( k = 0 ; k < numplanes ; k++ ) { - if ( k == i || k == j ) { - continue; - } - if ( DotProduct( clipVelocity, planes[k] ) >= 0.1 ) { - continue; // move doesn't interact with the plane - } - - // stop dead at a tripple plane interaction - VectorClear( pm->ps->velocity ); - return qtrue; - } - } - - // if we have fixed all interactions, try another move - VectorCopy( clipVelocity, pm->ps->velocity ); - VectorCopy( endClipVelocity, endVelocity ); - break; - } - } - - if ( gravity ) { - VectorCopy( endVelocity, pm->ps->velocity ); - } - - // don't change velocity if in a timer (FIXME: is this correct?) - if ( pm->ps->pm_time ) { - VectorCopy( primal_velocity, pm->ps->velocity ); - } - - return ( bumpcount != 0 ); +#define MAX_CLIP_PLANES 5 +qboolean PM_SlideMove( qboolean gravity ) +{ + int bumpcount, numbumps; + vec3_t dir; + float d; + int numplanes; + vec3_t planes[MAX_CLIP_PLANES]; + vec3_t primal_velocity; + vec3_t clipVelocity; + int i, j, k; + trace_t trace; + vec3_t end; + float time_left; + float into; + vec3_t endVelocity; + vec3_t endClipVelocity; + + numbumps = 4; + + VectorCopy( pm->ps->velocity, primal_velocity ); + + if( gravity ) + { + VectorCopy( pm->ps->velocity, endVelocity ); + endVelocity[ 2 ] -= pm->ps->gravity * pml.frametime; + pm->ps->velocity[ 2 ] = ( pm->ps->velocity[ 2 ] + endVelocity[ 2 ] ) * 0.5; + primal_velocity[ 2 ] = endVelocity[ 2 ]; + + if( pml.groundPlane ) + { + // slide along the ground plane + PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal, + pm->ps->velocity, OVERCLIP ); + } + } + + time_left = pml.frametime; + + // never turn against the ground plane + if( pml.groundPlane ) + { + numplanes = 1; + VectorCopy( pml.groundTrace.plane.normal, planes[ 0 ] ); + } + else + numplanes = 0; + + // never turn against original velocity + VectorNormalize2( pm->ps->velocity, planes[ numplanes ] ); + numplanes++; + + for( bumpcount = 0; bumpcount < numbumps; bumpcount++ ) + { + // calculate position we are trying to move to + VectorMA( pm->ps->origin, time_left, pm->ps->velocity, end ); + + // see if we can make it there + pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask ); + + if( trace.allsolid ) + { + // entity is completely trapped in another solid + pm->ps->velocity[ 2 ] = 0; // don't build up falling damage, but allow sideways acceleration + return qtrue; + } + + if( trace.fraction > 0 ) + { + // actually covered some distance + VectorCopy( trace.endpos, pm->ps->origin ); + } + + if( trace.fraction == 1 ) + break; // moved the entire distance + + // save entity for contact + PM_AddTouchEnt( trace.entityNum ); + + time_left -= time_left * trace.fraction; + + if( numplanes >= MAX_CLIP_PLANES ) + { + // this shouldn't really happen + VectorClear( pm->ps->velocity ); + return qtrue; + } + + // + // if this is the same plane we hit before, nudge velocity + // out along it, which fixes some epsilon issues with + // non-axial planes + // + for( i = 0 ; i < numplanes ; i++ ) + { + if( DotProduct( trace.plane.normal, planes[i] ) > 0.99 ) + { + VectorAdd( trace.plane.normal, pm->ps->velocity, pm->ps->velocity ); + break; + } + } + + if( i < numplanes ) + continue; + + VectorCopy( trace.plane.normal, planes[ numplanes ] ); + numplanes++; + + // + // modify velocity so it parallels all of the clip planes + // + + // find a plane that it enters + for( i = 0; i < numplanes; i++ ) + { + into = DotProduct( pm->ps->velocity, planes[ i ] ); + if( into >= 0.1 ) + continue; // move doesn't interact with the plane + + // see how hard we are hitting things + if( -into > pml.impactSpeed ) + pml.impactSpeed = -into; + + // slide along the plane + PM_ClipVelocity( pm->ps->velocity, planes[ i ], clipVelocity, OVERCLIP ); + + // slide along the plane + PM_ClipVelocity( endVelocity, planes[ i ], endClipVelocity, OVERCLIP ); + + // see if there is a second plane that the new move enters + for( j = 0; j < numplanes; j++ ) + { + if( j == i ) + continue; + + if( DotProduct( clipVelocity, planes[ j ] ) >= 0.1 ) + continue; // move doesn't interact with the plane + + // try clipping the move to the plane + PM_ClipVelocity( clipVelocity, planes[ j ], clipVelocity, OVERCLIP ); + PM_ClipVelocity( endClipVelocity, planes[ j ], endClipVelocity, OVERCLIP ); + + // see if it goes back into the first clip plane + if( DotProduct( clipVelocity, planes[ i ] ) >= 0 ) + continue; + + // slide the original velocity along the crease + CrossProduct( planes[ i ], planes[ j ], dir ); + VectorNormalize( dir ); + d = DotProduct( dir, pm->ps->velocity ); + VectorScale( dir, d, clipVelocity ); + + CrossProduct( planes[ i ], planes[ j ], dir); + VectorNormalize( dir ); + d = DotProduct( dir, endVelocity ); + VectorScale( dir, d, endClipVelocity ); + + // see if there is a third plane the the new move enters + for( k = 0; k < numplanes; k++ ) + { + if( k == i || k == j ) + continue; + + if( DotProduct( clipVelocity, planes[ k ] ) >= 0.1 ) + continue; // move doesn't interact with the plane + + // stop dead at a tripple plane interaction + VectorClear( pm->ps->velocity ); + return qtrue; + } + } + + // if we have fixed all interactions, try another move + VectorCopy( clipVelocity, pm->ps->velocity ); + VectorCopy( endClipVelocity, endVelocity ); + break; + } + } + + if( gravity ) + VectorCopy( endVelocity, pm->ps->velocity ); + + // don't change velocity if in a timer (FIXME: is this correct?) + if( pm->ps->pm_time ) + VectorCopy( primal_velocity, pm->ps->velocity ); + + return ( bumpcount != 0 ); } /* @@ -275,9 +281,9 @@ PM_StepSlideMove */ qboolean PM_StepSlideMove( qboolean gravity, qboolean predictive ) { - vec3_t start_o, start_v; - vec3_t down_o, down_v; - trace_t trace; + vec3_t start_o, start_v; + vec3_t down_o, down_v; + trace_t trace; vec3_t normal; vec3_t step_v, step_vNormal; vec3_t up, down; @@ -294,8 +300,8 @@ qboolean PM_StepSlideMove( qboolean gravity, qboolean predictive ) else VectorSet( normal, 0.0f, 0.0f, 1.0f ); - VectorCopy( pm->ps->origin, start_o ); - VectorCopy( pm->ps->velocity, start_v ); + VectorCopy( pm->ps->origin, start_o ); + VectorCopy( pm->ps->velocity, start_v ); if( PM_SlideMove( gravity ) == 0 ) { @@ -384,7 +390,7 @@ qboolean PM_StepSlideMove( qboolean gravity, qboolean predictive ) PM_PredictStepMove ================== */ -qboolean PM_PredictStepMove( ) +qboolean PM_PredictStepMove( void ) { vec3_t velocity, origin; float impactSpeed; diff --git a/src/game/g_active.c b/src/game/g_active.c index cef172a5..63e4c0e8 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -26,43 +26,45 @@ damage values to that client for pain blends and kicks, and global pain sound events for all clients. =============== */ -void P_DamageFeedback( gentity_t *player ) { +void P_DamageFeedback( gentity_t *player ) +{ gclient_t *client; - float count; - vec3_t angles; + float count; + vec3_t angles; client = player->client; - if ( client->ps.pm_type == PM_DEAD ) { + if( client->ps.pm_type == PM_DEAD ) return; - } // total points of damage shot at the player this frame count = client->damage_blood + client->damage_armor; - if ( count == 0 ) { + if( count == 0 ) return; // didn't take any damage - } - if ( count > 255 ) { + if( count > 255 ) count = 255; - } // send the information to the client // world damage (falling, slime, etc) uses a special code // to make the blend blob centered instead of positional - if ( client->damage_fromWorld ) { + if( client->damage_fromWorld ) + { client->ps.damagePitch = 255; client->ps.damageYaw = 255; client->damage_fromWorld = qfalse; - } else { + } + else + { vectoangles( client->damage_from, angles ); - client->ps.damagePitch = angles[PITCH]/360.0 * 256; - client->ps.damageYaw = angles[YAW]/360.0 * 256; + client->ps.damagePitch = angles[ PITCH ] / 360.0 * 256; + client->ps.damageYaw = angles[ YAW ] / 360.0 * 256; } // play an apropriate pain sound - if ( (level.time > player->pain_debounce_time) && !(player->flags & FL_GODMODE) ) { + if( ( level.time > player->pain_debounce_time ) && !( player->flags & FL_GODMODE ) ) + { player->pain_debounce_time = level.time + 700; G_AddEvent( player, EV_PAIN, player->health ); client->ps.damageEvent++; @@ -88,55 +90,53 @@ P_WorldEffects Check for lava / slime contents and drowning ============= */ -void P_WorldEffects( gentity_t *ent ) { - qboolean envirosuit; - int waterlevel; +void P_WorldEffects( gentity_t *ent ) +{ + int waterlevel; - if ( ent->client->noclip ) { + if( ent->client->noclip ) + { ent->client->airOutTime = level.time + 12000; // don't need air return; } waterlevel = ent->waterlevel; - envirosuit = /*ent->client->ps.powerups[PW_BATTLESUIT]*/ 0 > level.time; - // // check for drowning // - if ( waterlevel == 3 ) { - // envirosuit give air - if ( envirosuit ) { - ent->client->airOutTime = level.time + 10000; - } - + if( waterlevel == 3 ) + { // if out of air, start drowning - if ( ent->client->airOutTime < level.time) { + if( ent->client->airOutTime < level.time) + { // drown! ent->client->airOutTime += 1000; - if ( ent->health > 0 ) { + if( ent->health > 0 ) + { // take more damage the longer underwater ent->damage += 2; - if (ent->damage > 15) + if( ent->damage > 15 ) ent->damage = 15; // play a gurp sound instead of a normal pain sound - if (ent->health <= ent->damage) { - G_Sound(ent, CHAN_VOICE, G_SoundIndex("*drown.wav")); - } else if (rand()&1) { - G_Sound(ent, CHAN_VOICE, G_SoundIndex("sound/player/gurp1.wav")); - } else { - G_Sound(ent, CHAN_VOICE, G_SoundIndex("sound/player/gurp2.wav")); - } + if( ent->health <= ent->damage ) + G_Sound( ent, CHAN_VOICE, G_SoundIndex( "*drown.wav" ) ); + else if( rand( ) & 1 ) + G_Sound( ent, CHAN_VOICE, G_SoundIndex( "sound/player/gurp1.wav" ) ); + else + G_Sound( ent, CHAN_VOICE, G_SoundIndex( "sound/player/gurp2.wav" ) ); // don't play a normal pain sound ent->pain_debounce_time = level.time + 200; - G_Damage (ent, NULL, NULL, NULL, NULL, - ent->damage, DAMAGE_NO_ARMOR, MOD_WATER); + G_Damage( ent, NULL, NULL, NULL, NULL, + ent->damage, DAMAGE_NO_ARMOR, MOD_WATER ); } } - } else { + } + else + { ent->client->airOutTime = level.time + 12000; ent->damage = 2; } @@ -144,23 +144,22 @@ void P_WorldEffects( gentity_t *ent ) { // // check for sizzle damage (move to pmove?) // - if (waterlevel && - (ent->watertype&(CONTENTS_LAVA|CONTENTS_SLIME)) ) { - if (ent->health > 0 - && ent->pain_debounce_time <= level.time ) { - - if ( envirosuit ) { - G_AddEvent( ent, EV_POWERUP_BATTLESUIT, 0 ); - } else { - if (ent->watertype & CONTENTS_LAVA) { - G_Damage (ent, NULL, NULL, NULL, NULL, - 30*waterlevel, 0, MOD_LAVA); - } + if( waterlevel && + ( ent->watertype & ( CONTENTS_LAVA | CONTENTS_SLIME ) ) ) + { + if( ent->health > 0 && + ent->pain_debounce_time <= level.time ) + { + if( ent->watertype & CONTENTS_LAVA ) + { + G_Damage( ent, NULL, NULL, NULL, NULL, + 30 * waterlevel, 0, MOD_LAVA ); + } - if (ent->watertype & CONTENTS_SLIME) { - G_Damage (ent, NULL, NULL, NULL, NULL, - 10*waterlevel, 0, MOD_SLIME); - } + if( ent->watertype & CONTENTS_SLIME ) + { + G_Damage( ent, NULL, NULL, NULL, NULL, + 10 * waterlevel, 0, MOD_SLIME ); } } } @@ -173,12 +172,12 @@ void P_WorldEffects( gentity_t *ent ) { G_SetClientSound =============== */ -void G_SetClientSound( gentity_t *ent ) { - if (ent->waterlevel && (ent->watertype&(CONTENTS_LAVA|CONTENTS_SLIME)) ) { +void G_SetClientSound( gentity_t *ent ) +{ + if( ent->waterlevel && ( ent->watertype & ( CONTENTS_LAVA | CONTENTS_SLIME ) ) ) ent->client->ps.loopSound = level.snd_fry; - } else { + else ent->client->ps.loopSound = 0; - } } @@ -190,34 +189,35 @@ void G_SetClientSound( gentity_t *ent ) { ClientImpacts ============== */ -void ClientImpacts( gentity_t *ent, pmove_t *pm ) { - int i, j; - trace_t trace; +void ClientImpacts( gentity_t *ent, pmove_t *pm ) +{ + int i, j; + trace_t trace; gentity_t *other; memset( &trace, 0, sizeof( trace ) ); - for (i=0 ; inumtouch ; i++) { - for (j=0 ; jtouchents[j] == pm->touchents[i] ) { + + for( i = 0; i < pm->numtouch; i++ ) + { + for( j = 0; j < i; j++ ) + { + if( pm->touchents[ j ] == pm->touchents[ i ] ) break; - } } - if (j != i) { + + if( j != i ) continue; // duplicated - } - other = &g_entities[ pm->touchents[i] ]; + + other = &g_entities[ pm->touchents[ i ] ]; - if ( ( ent->r.svFlags & SVF_BOT ) && ( ent->touch ) ) { + if( ( ent->r.svFlags & SVF_BOT ) && ( ent->touch ) ) ent->touch( ent, other, &trace ); - } - if ( !other->touch ) { + if( !other->touch ) continue; - } other->touch( other, ent, &trace ); } - } /* @@ -228,22 +228,21 @@ Find all trigger entities that ent's current position touches. Spectators will only interact with teleporters. ============ */ -void G_TouchTriggers( gentity_t *ent ) { - int i, num; - int touch[MAX_GENTITIES]; +void G_TouchTriggers( gentity_t *ent ) +{ + int i, num; + int touch[MAX_GENTITIES]; gentity_t *hit; trace_t trace; vec3_t mins, maxs; - static vec3_t range = { 40, 40, 52 }; + static vec3_t range = { 40, 40, 52 }; - if ( !ent->client ) { + if( !ent->client ) return; - } // dead clients don't activate triggers! - if ( ent->client->ps.stats[STAT_HEALTH] <= 0 ) { + if( ent->client->ps.stats[ STAT_HEALTH ] <= 0 ) return; - } VectorSubtract( ent->client->ps.origin, range, mins ); VectorAdd( ent->client->ps.origin, range, maxs ); @@ -254,53 +253,43 @@ void G_TouchTriggers( gentity_t *ent ) { VectorAdd( ent->client->ps.origin, ent->r.mins, mins ); VectorAdd( ent->client->ps.origin, ent->r.maxs, maxs ); - for ( i=0 ; itouch && !ent->touch ) { + if( !hit->touch && !ent->touch ) continue; - } - if ( !( hit->r.contents & CONTENTS_TRIGGER ) ) { + + if( !( hit->r.contents & CONTENTS_TRIGGER ) ) continue; - } // ignore most entities if a spectator if( ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) || ( ent->client->ps.stats[ STAT_STATE ] & SS_INFESTING ) || - ( ent->client->ps.stats[ STAT_STATE ] & SS_HOVELING ) ) { - if ( hit->s.eType != ET_TELEPORT_TRIGGER && - // this is ugly but adding a new ET_? type will - // most likely cause network incompatibilities - hit->touch != Touch_DoorTrigger) { + ( ent->client->ps.stats[ STAT_STATE ] & SS_HOVELING ) ) + { + if( hit->s.eType != ET_TELEPORT_TRIGGER && + // this is ugly but adding a new ET_? type will + // most likely cause network incompatibilities + hit->touch != Touch_DoorTrigger ) continue; - } } - // use seperate code for determining if an item is picked up - // so you don't have to actually contact its bounding box -/* if ( hit->s.eType == ET_ITEM || hit->s.eType == ET_BUILDABLE ) { - if ( !BG_PlayerTouchesItem( &ent->client->ps, &hit->s, level.time ) ) { - continue; - } - } else {*/ - if ( !trap_EntityContact( mins, maxs, hit ) ) { - continue; - } - /*}*/ + if( !trap_EntityContact( mins, maxs, hit ) ) + continue; - memset( &trace, 0, sizeof(trace) ); + memset( &trace, 0, sizeof( trace ) ); - if ( hit->touch ) { - hit->touch (hit, ent, &trace); - } + if( hit->touch ) + hit->touch( hit, ent, &trace ); - if ( ( ent->r.svFlags & SVF_BOT ) && ( ent->touch ) ) { + if( ( ent->r.svFlags & SVF_BOT ) && ( ent->touch ) ) ent->touch( ent, hit, &trace ); - } } // if we didn't touch a jump pad this pmove frame - if ( ent->client->ps.jumppad_frame != ent->client->ps.pmove_framecount ) { + if( ent->client->ps.jumppad_frame != ent->client->ps.pmove_framecount ) + { ent->client->ps.jumppad_frame = 0; ent->client->ps.jumppad_ent = 0; } @@ -311,14 +300,15 @@ void G_TouchTriggers( gentity_t *ent ) { SpectatorThink ================= */ -void SpectatorThink( gentity_t *ent, usercmd_t *ucmd ) { +void SpectatorThink( gentity_t *ent, usercmd_t *ucmd ) +{ pmove_t pm; gclient_t *client; client = ent->client; - if ( client->sess.spectatorState != SPECTATOR_FOLLOW ) { - + if( client->sess.spectatorState != SPECTATOR_FOLLOW ) + { if( client->sess.spectatorState == SPECTATOR_LOCKED ) client->ps.pm_type = PM_FREEZE; else @@ -327,7 +317,7 @@ void SpectatorThink( gentity_t *ent, usercmd_t *ucmd ) { client->ps.speed = 400; // faster than normal // set up for pmove - memset (&pm, 0, sizeof(pm)); + memset( &pm, 0, sizeof( pm ) ); pm.ps = &client->ps; pm.cmd = *ucmd; pm.tracemask = MASK_PLAYERSOLID & ~CONTENTS_BODY; // spectators can fly through bodies @@ -335,7 +325,7 @@ void SpectatorThink( gentity_t *ent, usercmd_t *ucmd ) { pm.pointcontents = trap_PointContents; // perform a pmove - Pmove (&pm); + Pmove( &pm ); // save results of pmove VectorCopy( client->ps.origin, ent->s.origin ); @@ -374,28 +364,38 @@ ClientInactivityTimer Returns qfalse if the client is dropped ================= */ -qboolean ClientInactivityTimer( gclient_t *client ) { - if ( ! g_inactivity.integer ) { +qboolean ClientInactivityTimer( gclient_t *client ) +{ + if( ! g_inactivity.integer ) + { // give everyone some time, so if the operator sets g_inactivity during // gameplay, everyone isn't kicked client->inactivityTime = level.time + 60 * 1000; client->inactivityWarning = qfalse; - } else if ( client->pers.cmd.forwardmove || - client->pers.cmd.rightmove || - client->pers.cmd.upmove || - (client->pers.cmd.buttons & BUTTON_ATTACK) ) { + } + else if( client->pers.cmd.forwardmove || + client->pers.cmd.rightmove || + client->pers.cmd.upmove || + ( client->pers.cmd.buttons & BUTTON_ATTACK ) ) + { client->inactivityTime = level.time + g_inactivity.integer * 1000; client->inactivityWarning = qfalse; - } else if ( !client->pers.localClient ) { - if ( level.time > client->inactivityTime ) { + } + else if( !client->pers.localClient ) + { + if( level.time > client->inactivityTime ) + { trap_DropClient( client - level.clients, "Dropped due to inactivity" ); return qfalse; } - if ( level.time > client->inactivityTime - 10000 && !client->inactivityWarning ) { + + if( level.time > client->inactivityTime - 10000 && !client->inactivityWarning ) + { client->inactivityWarning = qtrue; trap_SendServerCommand( client - level.clients, "cp \"Ten seconds until inactivity drop!\n\"" ); } } + return qtrue; } @@ -589,7 +589,8 @@ void ClientTimerActions( gentity_t *ent, int msec ) ClientIntermissionThink ==================== */ -void ClientIntermissionThink( gclient_t *client ) { +void ClientIntermissionThink( gclient_t *client ) +{ client->ps.eFlags &= ~EF_TALK; client->ps.eFlags &= ~EF_FIRING; client->ps.eFlags &= ~EF_FIRING2; @@ -599,9 +600,8 @@ void ClientIntermissionThink( gclient_t *client ) { // swap and latch button actions client->oldbuttons = client->buttons; client->buttons = client->pers.cmd.buttons; - if ( client->buttons & ( BUTTON_ATTACK | BUTTON_USE_HOLDABLE ) & ( client->oldbuttons ^ client->buttons ) ) { + if( client->buttons & ( BUTTON_ATTACK | BUTTON_USE_HOLDABLE ) & ( client->oldbuttons ^ client->buttons ) ) client->readyToExit = 1; - } } @@ -613,61 +613,63 @@ Events will be passed on to the clients for presentation, but any server game effects are handled here ================ */ -void ClientEvents( gentity_t *ent, int oldEventSequence ) { - int i, j; - int event; +void ClientEvents( gentity_t *ent, int oldEventSequence ) +{ + int i, j; + int event; gclient_t *client; - int damage; - vec3_t dir; - vec3_t origin, angles; + int damage; + vec3_t dir; + vec3_t origin, angles; // qboolean fired; - gitem_t *item; + gitem_t *item; gentity_t *drop; client = ent->client; - if ( oldEventSequence < client->ps.eventSequence - MAX_PS_EVENTS ) { + if( oldEventSequence < client->ps.eventSequence - MAX_PS_EVENTS ) oldEventSequence = client->ps.eventSequence - MAX_PS_EVENTS; - } - for ( i = oldEventSequence ; i < client->ps.eventSequence ; i++ ) { - event = client->ps.events[ i & (MAX_PS_EVENTS-1) ]; - - switch ( event ) { - case EV_FALL_MEDIUM: - case EV_FALL_FAR: - if ( ent->s.eType != ET_PLAYER ) { - break; // not in the player model - } - if ( g_dmflags.integer & DF_NO_FALLING ) { + + for( i = oldEventSequence; i < client->ps.eventSequence; i++ ) + { + event = client->ps.events[ i & ( MAX_PS_EVENTS - 1 ) ]; + + switch( event ) + { + case EV_FALL_MEDIUM: + case EV_FALL_FAR: + if( ent->s.eType != ET_PLAYER ) + break; // not in the player model + + if( g_dmflags.integer & DF_NO_FALLING ) + break; + + if( event == EV_FALL_FAR ) + damage = 10; + else + damage = 5; + + VectorSet( dir, 0, 0, 1 ); + ent->pain_debounce_time = level.time + 200; // no normal pain sound + G_Damage( ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING ); break; - } - if ( event == EV_FALL_FAR ) { - damage = 10; - } else { - damage = 5; - } - VectorSet (dir, 0, 0, 1); - ent->pain_debounce_time = level.time + 200; // no normal pain sound - G_Damage (ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING); - break; - case EV_FIRE_WEAPON: - FireWeapon( ent ); - break; + case EV_FIRE_WEAPON: + FireWeapon( ent ); + break; - case EV_FIRE_WEAPON2: - FireWeapon2( ent ); - break; + case EV_FIRE_WEAPON2: + FireWeapon2( ent ); + break; - case EV_FIRE_WEAPON3: - FireWeapon3( ent ); - break; + case EV_FIRE_WEAPON3: + FireWeapon3( ent ); + break; - default: - break; + default: + break; } } - } /* @@ -675,39 +677,49 @@ void ClientEvents( gentity_t *ent, int oldEventSequence ) { StuckInOtherClient ============== */ -static int StuckInOtherClient(gentity_t *ent) { - int i; +static int StuckInOtherClient( gentity_t *ent ) +{ + int i; gentity_t *ent2; - ent2 = &g_entities[0]; - for ( i = 0; i < MAX_CLIENTS; i++, ent2++ ) { - if ( ent2 == ent ) { + ent2 = &g_entities[ 0 ]; + + for( i = 0; i < MAX_CLIENTS; i++, ent2++ ) + { + if( ent2 == ent ) continue; - } - if ( !ent2->inuse ) { + + if( !ent2->inuse ) continue; - } - if ( !ent2->client ) { + + if( !ent2->client ) continue; - } - if ( ent2->health <= 0 ) { + + if( ent2->health <= 0 ) continue; - } + // - if (ent2->r.absmin[0] > ent->r.absmax[0]) + if( ent2->r.absmin[ 0 ] > ent->r.absmax[ 0 ] ) continue; - if (ent2->r.absmin[1] > ent->r.absmax[1]) + + if( ent2->r.absmin[ 1 ] > ent->r.absmax[ 1 ] ) continue; - if (ent2->r.absmin[2] > ent->r.absmax[2]) + + if( ent2->r.absmin[ 2 ] > ent->r.absmax[ 2 ] ) continue; - if (ent2->r.absmax[0] < ent->r.absmin[0]) + + if( ent2->r.absmax[ 0 ] < ent->r.absmin[ 0 ] ) continue; - if (ent2->r.absmax[1] < ent->r.absmin[1]) + + if( ent2->r.absmax[ 1 ] < ent->r.absmin[ 1 ] ) continue; - if (ent2->r.absmax[2] < ent->r.absmin[2]) + + if( ent2->r.absmax[ 2 ] < ent->r.absmin[ 2 ] ) continue; + return qtrue; - } + } + return qfalse; } @@ -716,16 +728,18 @@ static int StuckInOtherClient(gentity_t *ent) { SendPendingPredictableEvents ============== */ -void SendPendingPredictableEvents( playerState_t *ps ) { +void SendPendingPredictableEvents( playerState_t *ps ) +{ gentity_t *t; - int event, seq; - int extEvent, number; + int event, seq; + int extEvent, number; // if there are still events pending - if ( ps->entityEventSequence < ps->eventSequence ) { + if( ps->entityEventSequence < ps->eventSequence ) + { // create a temporary entity for this event which is sent to everyone // except the client who generated the event - seq = ps->entityEventSequence & (MAX_PS_EVENTS-1); + seq = ps->entityEventSequence & ( MAX_PS_EVENTS - 1 ); event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 ); // set external event to zero before calling BG_PlayerStateToEntityState extEvent = ps->externalEvent; @@ -757,13 +771,14 @@ If "g_synchronousClients 1" is set, this will be called exactly once for each server frame, which makes for smooth demo recording. ============== */ -void ClientThink_real( gentity_t *ent ) { +void ClientThink_real( gentity_t *ent ) +{ gclient_t *client; pmove_t pm; - int oldEventSequence; - int msec; + int oldEventSequence; + int msec; usercmd_t *ucmd; - float speed; + float speed; //TA: creep variables gentity_t *creepNode; @@ -774,19 +789,21 @@ void ClientThink_real( gentity_t *ent ) { client = ent->client; // don't think if the client is not yet connected (and thus not yet spawned in) - if (client->pers.connected != CON_CONNECTED) { + if( client->pers.connected != CON_CONNECTED ) return; - } // mark the time, so the connection sprite can be removed ucmd = &ent->client->pers.cmd; // sanity check the command time to prevent speedup cheating - if ( ucmd->serverTime > level.time + 200 ) { + if( ucmd->serverTime > level.time + 200 ) + { ucmd->serverTime = level.time + 200; // G_Printf("serverTime <<<<<\n" ); } - if ( ucmd->serverTime < level.time - 1000 ) { + + if( ucmd->serverTime < level.time - 1000 ) + { ucmd->serverTime = level.time - 1000; // G_Printf("serverTime >>>>>\n" ); } @@ -794,22 +811,20 @@ void ClientThink_real( gentity_t *ent ) { msec = ucmd->serverTime - client->ps.commandTime; // following others may result in bad times, but we still want // to check for follow toggles - if ( msec < 1 && client->sess.spectatorState != SPECTATOR_FOLLOW ) { + if( msec < 1 && client->sess.spectatorState != SPECTATOR_FOLLOW ) return; - } - if ( msec > 200 ) { + + if( msec > 200 ) msec = 200; - } - if ( pmove_msec.integer < 8 ) { - trap_Cvar_Set("pmove_msec", "8"); - } - else if (pmove_msec.integer > 33) { - trap_Cvar_Set("pmove_msec", "33"); - } + if( pmove_msec.integer < 8 ) + trap_Cvar_Set( "pmove_msec", "8" ); + else if( pmove_msec.integer > 33 ) + trap_Cvar_Set( "pmove_msec", "33" ); - if ( pmove_fixed.integer || client->pers.pmoveFixed ) { - ucmd->serverTime = ((ucmd->serverTime + pmove_msec.integer-1) / pmove_msec.integer) * pmove_msec.integer; + if( pmove_fixed.integer || client->pers.pmoveFixed ) + { + ucmd->serverTime = ( ( ucmd->serverTime + pmove_msec.integer - 1 ) / pmove_msec.integer ) * pmove_msec.integer; //if (ucmd->serverTime - client->ps.commandTime <= 0) // return; } @@ -817,24 +832,25 @@ void ClientThink_real( gentity_t *ent ) { // // check for exiting intermission // - if ( level.intermissiontime ) { + if( level.intermissiontime ) + { ClientIntermissionThink( client ); return; } // spectators don't do much - if ( client->sess.sessionTeam == TEAM_SPECTATOR ) { - if ( client->sess.spectatorState == SPECTATOR_SCOREBOARD ) { + if( client->sess.sessionTeam == TEAM_SPECTATOR ) + { + if( client->sess.spectatorState == SPECTATOR_SCOREBOARD ) return; - } + SpectatorThink( ent, ucmd ); return; } // check for inactivity timer, but never drop the local client of a non-dedicated server - if ( !ClientInactivityTimer( client ) ) { + if( !ClientInactivityTimer( client ) ) return; - } if( client->noclip ) client->ps.pm_type = PM_NOCLIP; @@ -943,16 +959,6 @@ void ClientThink_real( gentity_t *ent ) { if( !cSlowed ) client->ps.stats[ STAT_STATE ] &= ~SS_CREEPSLOWED; - /*if ( client->ps.powerups[PW_HASTE] ) { - client->ps.speed *= 1.3; - }*/ - - // Let go of the hook if we aren't firing -/* if ( client->ps.weapon == WP_GRAPPLING_HOOK && - client->hook && !( ucmd->buttons & BUTTON_ATTACK ) ) { - Weapon_HookFree(client->hook); - }*/ - // set up for pmove oldEventSequence = client->ps.eventSequence; @@ -969,8 +975,7 @@ void ClientThink_real( gentity_t *ent ) { case WP_GRAB_CLAW: case WP_GRAB_CLAW_UPG: - /*if( client->ps.weaponTime <= 0 )*/ //FIXME: correct decision? - CheckGrabAttack( ent ); + CheckGrabAttack( ent ); break; case WP_POUNCE: @@ -984,26 +989,24 @@ void ClientThink_real( gentity_t *ent ) { } } - if ( ent->flags & FL_FORCE_GESTURE ) { + if( ent->flags & FL_FORCE_GESTURE ) + { ent->flags &= ~FL_FORCE_GESTURE; ent->client->pers.cmd.buttons |= BUTTON_GESTURE; } pm.ps = &client->ps; pm.cmd = *ucmd; - if ( pm.ps->pm_type == PM_DEAD ) { + + if( pm.ps->pm_type == PM_DEAD ) pm.tracemask = MASK_PLAYERSOLID; // & ~CONTENTS_BODY; - } + if( pm.ps->stats[ STAT_STATE ] & SS_INFESTING || pm.ps->stats[ STAT_STATE ] & SS_HOVELING ) pm.tracemask = MASK_PLAYERSOLID & ~CONTENTS_BODY; - - else if ( ent->r.svFlags & SVF_BOT ) { - pm.tracemask = MASK_PLAYERSOLID | CONTENTS_BOTCLIP; - } - else { + else pm.tracemask = MASK_PLAYERSOLID; - } + pm.trace = trap_Trace; pm.pointcontents = trap_PointContents; pm.debugLevel = g_debugMove.integer; @@ -1014,18 +1017,17 @@ void ClientThink_real( gentity_t *ent ) { VectorCopy( client->ps.origin, client->oldOrigin ); - Pmove (&pm); + Pmove( &pm); // save results of pmove - if ( ent->client->ps.eventSequence != oldEventSequence ) { + if( ent->client->ps.eventSequence != oldEventSequence ) ent->eventTime = level.time; - } - if (g_smoothClients.integer) { + + if( g_smoothClients.integer ) BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue ); - } - else { + else BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue ); - } + SendPendingPredictableEvents( &ent->client->ps ); if( !( ent->client->ps.eFlags & EF_FIRING ) ) @@ -1036,8 +1038,8 @@ void ClientThink_real( gentity_t *ent ) { // use the snapped origin for linking so it matches client predicted versions VectorCopy( ent->s.pos.trBase, ent->r.currentOrigin ); - VectorCopy (pm.mins, ent->r.mins); - VectorCopy (pm.maxs, ent->r.maxs); + VectorCopy( pm.mins, ent->r.mins ); + VectorCopy( pm.maxs, ent->r.maxs ); ent->waterlevel = pm.waterlevel; ent->watertype = pm.watertype; @@ -1046,10 +1048,10 @@ void ClientThink_real( gentity_t *ent ) { ClientEvents( ent, oldEventSequence ); // link entity now, after any personal teleporters have been used - trap_LinkEntity (ent); - if ( !ent->client->noclip ) { + trap_LinkEntity( ent ); + + if( !ent->client->noclip ) G_TouchTriggers( ent ); - } // NOTE: now copy the exact origin over otherwise clients can be snapped into solid VectorCopy( ent->client->ps.origin, ent->r.currentOrigin ); @@ -1058,9 +1060,8 @@ void ClientThink_real( gentity_t *ent ) { ClientImpacts( ent, &pm ); // save results of triggers and client events - if (ent->client->ps.eventSequence != oldEventSequence) { + if( ent->client->ps.eventSequence != oldEventSequence ) ent->eventTime = level.time; - } // swap and latch button actions client->oldbuttons = client->buttons; @@ -1171,7 +1172,8 @@ ClientThink A new command has arrived from the client ================== */ -void ClientThink( int clientNum ) { +void ClientThink( int clientNum ) +{ gentity_t *ent; ent = g_entities + clientNum; @@ -1181,16 +1183,16 @@ void ClientThink( int clientNum ) { // phone jack if they don't get any for a while ent->client->lastCmdTime = level.time; - if ( !(ent->r.svFlags & SVF_BOT) && !g_synchronousClients.integer ) { + if( !(ent->r.svFlags & SVF_BOT) && !g_synchronousClients.integer ) ClientThink_real( ent ); - } } -void G_RunClient( gentity_t *ent ) { - if ( !(ent->r.svFlags & SVF_BOT) && !g_synchronousClients.integer ) { +void G_RunClient( gentity_t *ent ) +{ + if( !( ent->r.svFlags & SVF_BOT ) && !g_synchronousClients.integer ) return; - } + ent->client->pers.cmd.serverTime = level.time; ClientThink_real( ent ); } @@ -1202,32 +1204,40 @@ SpectatorClientEndFrame ================== */ -void SpectatorClientEndFrame( gentity_t *ent ) { +void SpectatorClientEndFrame( gentity_t *ent ) +{ gclient_t *cl; // if we are doing a chase cam or a remote view, grab the latest info - if ( ent->client->sess.spectatorState == SPECTATOR_FOLLOW ) { + if( ent->client->sess.spectatorState == SPECTATOR_FOLLOW ) + { int clientNum, flags; clientNum = ent->client->sess.spectatorClient; // team follow1 and team follow2 go to whatever clients are playing - if ( clientNum == -1 ) { + if( clientNum == -1 ) clientNum = level.follow1; - } else if ( clientNum == -2 ) { + else if( clientNum == -2 ) clientNum = level.follow2; - } - if ( clientNum >= 0 ) { + + if( clientNum >= 0 ) + { cl = &level.clients[ clientNum ]; - if ( cl->pers.connected == CON_CONNECTED && cl->sess.sessionTeam != TEAM_SPECTATOR ) { - flags = (cl->ps.eFlags & ~(EF_VOTED | EF_TEAMVOTED)) | (ent->client->ps.eFlags & (EF_VOTED | EF_TEAMVOTED)); + + if( cl->pers.connected == CON_CONNECTED && cl->sess.sessionTeam != TEAM_SPECTATOR ) + { + flags = ( cl->ps.eFlags & ~( EF_VOTED | EF_TEAMVOTED ) ) | ( ent->client->ps.eFlags & ( EF_VOTED | EF_TEAMVOTED ) ); ent->client->ps = cl->ps; ent->client->ps.pm_flags |= PMF_FOLLOW; ent->client->ps.eFlags = flags; return; - } else { + } + else + { // drop them to free spectators unless they are dedicated camera followers - if ( ent->client->sess.spectatorClient >= 0 ) { + if( ent->client->sess.spectatorClient >= 0 ) + { ent->client->sess.spectatorState = SPECTATOR_FREE; ClientBegin( ent->client - level.clients ); } @@ -1235,11 +1245,10 @@ void SpectatorClientEndFrame( gentity_t *ent ) { } } - if ( ent->client->sess.spectatorState == SPECTATOR_SCOREBOARD ) { + if( ent->client->sess.spectatorState == SPECTATOR_SCOREBOARD ) ent->client->ps.pm_flags |= PMF_SCOREBOARD; - } else { + else ent->client->ps.pm_flags &= ~PMF_SCOREBOARD; - } } /* @@ -1251,69 +1260,49 @@ A fast client will have multiple ClientThink for each ClientEdFrame, while a slow client may have multiple ClientEndFrame between ClientThink. ============== */ -void ClientEndFrame( gentity_t *ent ) { - int i; +void ClientEndFrame( gentity_t *ent ) +{ + int i; clientPersistant_t *pers; - if ( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) { + if( ent->client->sess.sessionTeam == TEAM_SPECTATOR ) + { SpectatorClientEndFrame( ent ); return; } pers = &ent->client->pers; - // turn off any expired powerups -/* for ( i = 0 ; i < MAX_POWERUPS ; i++ ) { - if ( ent->client->ps.powerups[ i ] < level.time ) { - ent->client->ps.powerups[ i ] = 0; - } - }*/ - - // save network bandwidth -#if 0 - if ( !g_synchronousClients->integer && ent->client->ps.pm_type == PM_NORMAL ) { - // FIXME: this must change eventually for non-sync demo recording - VectorClear( ent->client->ps.viewangles ); - } -#endif - // // If the end of unit layout is displayed, don't give // the player any normal movement attributes // - if ( level.intermissiontime ) { + if( level.intermissiontime ) return; - } // burn from lava, etc - P_WorldEffects (ent); + P_WorldEffects( ent ); // apply all the damage taken this frame - P_DamageFeedback (ent); + P_DamageFeedback( ent ); // add the EF_CONNECTION flag if we haven't gotten commands recently - if ( level.time - ent->client->lastCmdTime > 1000 ) { + if( level.time - ent->client->lastCmdTime > 1000 ) ent->s.eFlags |= EF_CONNECTION; - } else { + else ent->s.eFlags &= ~EF_CONNECTION; - } - ent->client->ps.stats[STAT_HEALTH] = ent->health; // FIXME: get rid of ent->health... + ent->client->ps.stats[ STAT_HEALTH ] = ent->health; // FIXME: get rid of ent->health... - G_SetClientSound (ent); + G_SetClientSound( ent ); // set the latest infor - if (g_smoothClients.integer) { + if( g_smoothClients.integer ) BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue ); - } - else { + else BG_PlayerStateToEntityState( &ent->client->ps, &ent->s, qtrue ); - } + SendPendingPredictableEvents( &ent->client->ps ); - - // set the bit for the reachability area the client is currently in - // i = trap_AAS_PointReachabilityAreaIndex( ent->client->ps.origin ); - // ent->client->areabits[i >> 3] |= 1 << (i & 7); } diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index 93d5619d..43690497 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -1334,7 +1334,7 @@ void HFM_Die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int da //pretty events and item cleanup self->s.modelindex = 0; //don't draw the model once its destroyed - G_AddEvent( self, EV_ITEM_EXPLOSION, DirToByte( dir ) ); + G_AddEvent( self, EV_BUILDABLE_EXPLOSION, DirToByte( dir ) ); self->r.contents = CONTENTS_TRIGGER; self->timestamp = level.time; @@ -1366,130 +1366,18 @@ void HFM_Think( gentity_t *self ) //================================================================================== - - - -//TA: the following defense turret code was written by -// "fuzzysteve" (fuzzysteve@quakefiles.com) and -// Anthony "inolen" Pesch (www.inolen.com) -//with (heavy) modifications by me of course :) - -#define HDEF1_ANGULARSPEED 10 //degrees/think ~= 200deg/sec -#define HDEF1_ACCURACYTOLERANCE HDEF1_ANGULARSPEED / 2 //angular difference for turret to fire -#define HDEF1_VERTICALCAP 90 //+/- maximum pitch -#define HDEF1_PROJSPEED 2000.0f //speed of projectile (used in prediction) - -/* -================ -hdef1_trackenemy - -Used by HDef1_Think to track enemy location -================ -*/ -qboolean hdef1_trackenemy( gentity_t *self ) -{ - vec3_t dirToTarget, dttAdjusted, angleToTarget, angularDiff, xNormal; - vec3_t refNormal = { 0.0f, 0.0f, 1.0f }; - float temp, rotAngle; - float distanceToTarget = BG_FindRangeForBuildable( self->s.modelindex ); - float timeTilImpact; - vec3_t halfAcceleration; - vec3_t thirdJerk; - int i; - - VectorSubtract( self->enemy->s.pos.trBase, self->s.pos.trBase, dirToTarget ); - -//lead targets -#if 0 - distanceToTarget = VectorLength( dirToTarget ); - timeTilImpact = distanceToTarget / 2000.0f; - VectorMA( self->enemy->s.pos.trBase, timeTilImpact, self->enemy->s.pos.trDelta, dirToTarget ); - VectorSubtract( dirToTarget, self->s.pos.trBase, dirToTarget ); -#endif - - //better, but more expensive method - if( self->dcced ) - { - VectorScale( self->enemy->acceleration, 1.0f / 2.0f, halfAcceleration ); - VectorScale( self->enemy->jerk, 1.0f / 3.0f, thirdJerk ); - - //O( time ) - worst case O( time ) = 250 iterations - for( i = 0; ( i * HDEF1_PROJSPEED ) / 1000.0f < distanceToTarget; i++ ) - { - float time = (float)i / 1000.0f; - - VectorMA( self->enemy->s.pos.trBase, time, self->enemy->s.pos.trDelta, dirToTarget ); - VectorMA( dirToTarget, time * time, halfAcceleration, dirToTarget ); - VectorMA( dirToTarget, time * time * time, thirdJerk, dirToTarget ); - VectorSubtract( dirToTarget, self->s.pos.trBase, dirToTarget ); - distanceToTarget = VectorLength( dirToTarget ); - - distanceToTarget -= self->enemy->r.maxs[ 0 ]; - } - } - - VectorNormalize( dirToTarget ); - - CrossProduct( self->s.origin2, refNormal, xNormal ); - VectorNormalize( xNormal ); - rotAngle = RAD2DEG( acos( DotProduct( self->s.origin2, refNormal ) ) ); - RotatePointAroundVector( dttAdjusted, xNormal, dirToTarget, rotAngle ); - - vectoangles( dttAdjusted, angleToTarget ); - - angularDiff[ PITCH ] = AngleSubtract( self->s.angles2[ PITCH ], angleToTarget[ PITCH ] ); - angularDiff[ YAW ] = AngleSubtract( self->s.angles2[ YAW ], angleToTarget[ YAW ] ); - - //if not pointing at our target then move accordingly - if( angularDiff[ PITCH ] < -HDEF1_ACCURACYTOLERANCE ) - self->s.angles2[ PITCH ] += HDEF1_ANGULARSPEED; - else if( angularDiff[ PITCH ] > HDEF1_ACCURACYTOLERANCE ) - self->s.angles2[ PITCH ] -= HDEF1_ANGULARSPEED; - else - self->s.angles2[ PITCH ] = angleToTarget[ PITCH ]; - - //disallow vertical movement past a certain limit - temp = fabs( self->s.angles2[ PITCH ] ); - if( temp > 180 ) - temp -= 360; - - if( temp < -HDEF1_VERTICALCAP ) - self->s.angles2[ PITCH ] = (-360)+HDEF1_VERTICALCAP; - else if( temp > HDEF1_VERTICALCAP ) - self->s.angles2[ PITCH ] = -HDEF1_VERTICALCAP; - - //if not pointing at our target then move accordingly - if( angularDiff[ YAW ] < -HDEF1_ACCURACYTOLERANCE ) - self->s.angles2[ YAW ] += HDEF1_ANGULARSPEED; - else if( angularDiff[ YAW ] > HDEF1_ACCURACYTOLERANCE ) - self->s.angles2[ YAW ] -= HDEF1_ANGULARSPEED; - else - self->s.angles2[ YAW ] = angleToTarget[ YAW ]; - - AngleVectors( self->s.angles2, dttAdjusted, NULL, NULL ); - RotatePointAroundVector( dirToTarget, xNormal, dttAdjusted, -rotAngle ); - vectoangles( dirToTarget, self->turretAim ); - - //if pointing at our target return true - if( abs( angleToTarget[ YAW ] - self->s.angles2[ YAW ] ) <= HDEF1_ACCURACYTOLERANCE && - abs( angleToTarget[ PITCH ] - self->s.angles2[ PITCH ] ) <= HDEF1_ACCURACYTOLERANCE ) - return qtrue; - - return qfalse; -} - -#define HDEF2_ANGULARSPEED 20 //degrees/think ~= 200deg/sec -#define HDEF2_ACCURACYTOLERANCE HDEF2_ANGULARSPEED / 2 //angular difference for turret to fire -#define HDEF2_VERTICALCAP 30 //- maximum pitch +#define HMGTURRET_ANGULARSPEED 20 //degrees/think ~= 200deg/sec +#define HMGTURRET_ACCURACYTOLERANCE HMGTURRET_ANGULARSPEED / 2 //angular difference for turret to fire +#define HMGTURRET_VERTICALCAP 30 //- maximum pitch /* ================ -hdef2_trackenemy +HMGTurret_TrackEnemy -Used by HDef1_Think to track enemy location +Used by HDef_Think to track enemy location ================ */ -qboolean hdef2_trackenemy( gentity_t *self ) +qboolean HMGTurret_TrackEnemy( gentity_t *self ) { vec3_t dirToTarget, dttAdjusted, angleToTarget, angularDiff, xNormal; vec3_t refNormal = { 0.0f, 0.0f, 1.0f }; @@ -1510,10 +1398,10 @@ qboolean hdef2_trackenemy( gentity_t *self ) angularDiff[ YAW ] = AngleSubtract( self->s.angles2[ YAW ], angleToTarget[ YAW ] ); //if not pointing at our target then move accordingly - if( angularDiff[ PITCH ] < -HDEF2_ACCURACYTOLERANCE ) - self->s.angles2[ PITCH ] += HDEF2_ANGULARSPEED; - else if( angularDiff[ PITCH ] > HDEF2_ACCURACYTOLERANCE ) - self->s.angles2[ PITCH ] -= HDEF2_ANGULARSPEED; + if( angularDiff[ PITCH ] < -HMGTURRET_ACCURACYTOLERANCE ) + self->s.angles2[ PITCH ] += HMGTURRET_ANGULARSPEED; + else if( angularDiff[ PITCH ] > HMGTURRET_ACCURACYTOLERANCE ) + self->s.angles2[ PITCH ] -= HMGTURRET_ANGULARSPEED; else self->s.angles2[ PITCH ] = angleToTarget[ PITCH ]; @@ -1522,14 +1410,14 @@ qboolean hdef2_trackenemy( gentity_t *self ) if( temp > 180 ) temp -= 360; - if( temp < -HDEF2_VERTICALCAP ) - self->s.angles2[ PITCH ] = (-360)+HDEF2_VERTICALCAP; + if( temp < -HMGTURRET_VERTICALCAP ) + self->s.angles2[ PITCH ] = (-360)+HMGTURRET_VERTICALCAP; //if not pointing at our target then move accordingly - if( angularDiff[ YAW ] < -HDEF2_ACCURACYTOLERANCE ) - self->s.angles2[ YAW ] += HDEF2_ANGULARSPEED; - else if( angularDiff[ YAW ] > HDEF2_ACCURACYTOLERANCE ) - self->s.angles2[ YAW ] -= HDEF2_ANGULARSPEED; + if( angularDiff[ YAW ] < -HMGTURRET_ACCURACYTOLERANCE ) + self->s.angles2[ YAW ] += HMGTURRET_ANGULARSPEED; + else if( angularDiff[ YAW ] > HMGTURRET_ACCURACYTOLERANCE ) + self->s.angles2[ YAW ] -= HMGTURRET_ANGULARSPEED; else self->s.angles2[ YAW ] = angleToTarget[ YAW ]; @@ -1538,8 +1426,8 @@ qboolean hdef2_trackenemy( gentity_t *self ) vectoangles( dirToTarget, self->turretAim ); //if pointing at our target return true - if( abs( angleToTarget[ YAW ] - self->s.angles2[ YAW ] ) <= HDEF2_ACCURACYTOLERANCE && - abs( angleToTarget[ PITCH ] - self->s.angles2[ PITCH ] ) <= HDEF2_ACCURACYTOLERANCE ) + if( abs( angleToTarget[ YAW ] - self->s.angles2[ YAW ] ) <= HMGTURRET_ACCURACYTOLERANCE && + abs( angleToTarget[ PITCH ] - self->s.angles2[ PITCH ] ) <= HMGTURRET_ACCURACYTOLERANCE ) return qtrue; return qfalse; @@ -1547,12 +1435,12 @@ qboolean hdef2_trackenemy( gentity_t *self ) /* ================ -hdef3_fireonemeny +HTeslaGen_FireOnEnemy Used by HDef_Think to fire at enemy ================ */ -void hdef3_fireonenemy( gentity_t *self, int firespeed ) +void HTeslaGen_FireOnEnemy( gentity_t *self, int firespeed ) { vec3_t dirToTarget; @@ -1572,12 +1460,12 @@ void hdef3_fireonenemy( gentity_t *self, int firespeed ) /* ================ -hdef_fireonemeny +HMGTurret_FireOnEnemy Used by HDef_Think to fire at enemy ================ */ -void hdef_fireonenemy( gentity_t *self, int firespeed ) +void HMGTurret_FireOnEnemy( gentity_t *self, int firespeed ) { //fire at target FireWeapon( self ); @@ -1587,12 +1475,12 @@ void hdef_fireonenemy( gentity_t *self, int firespeed ) /* ================ -hdef_checktarget +HDef_CheckTarget Used by HDef_Think to check enemies for validity ================ */ -qboolean hdef_checktarget( gentity_t *self, gentity_t *target, int range ) +qboolean HDef_CheckTarget( gentity_t *self, gentity_t *target, int range ) { vec3_t distance; trace_t trace; @@ -1632,12 +1520,12 @@ qboolean hdef_checktarget( gentity_t *self, gentity_t *target, int range ) /* ================ -hdef_findenemy +HDef_FindEnemy Used by HDef_Think to locate enemy gentities ================ */ -void hdef_findenemy( gentity_t *ent, int range ) +void HDef_FindEnemy( gentity_t *ent, int range ) { gentity_t *target; @@ -1645,7 +1533,7 @@ void hdef_findenemy( gentity_t *ent, int range ) for( target = g_entities; target < &g_entities[ level.num_entities ]; target++ ) { //if target is not valid keep searching - if( !hdef_checktarget( ent, target, range ) ) + if( !HDef_CheckTarget( ent, target, range ) ) continue; //we found a target @@ -1683,12 +1571,12 @@ void HDef_Think( gentity_t *self ) self->dcced = findDCC( self ); //if the current target is not valid find a new one - if( !hdef_checktarget( self, self->enemy, range ) ) + if( !HDef_CheckTarget( self, self->enemy, range ) ) { if( self->enemy ) self->enemy->targeted = NULL; - hdef_findenemy( self, range ); + HDef_FindEnemy( self, range ); } //if a new target cannot be found don't do anything @@ -1700,19 +1588,14 @@ void HDef_Think( gentity_t *self ) //if we are pointing at our target and we can fire shoot it switch( self->s.modelindex ) { - case BA_H_DEF1: - if( hdef1_trackenemy( self ) && ( self->count < level.time ) ) - hdef_fireonenemy( self, firespeed ); - break; - - case BA_H_DEF2: - if( hdef2_trackenemy( self ) && ( self->count < level.time ) ) - hdef_fireonenemy( self, firespeed ); + case BA_H_MGTURRET: + if( HMGTurret_TrackEnemy( self ) && ( self->count < level.time ) ) + HMGTurret_FireOnEnemy( self, firespeed ); break; - case BA_H_DEF3: + case BA_H_TESLAGEN: if( self->count < level.time ) - hdef3_fireonenemy( self, firespeed ); + HTeslaGen_FireOnEnemy( self, firespeed ); break; default: @@ -1746,7 +1629,7 @@ void HSpawn_Blast( gentity_t *self ) dir[2] = 1; self->s.modelindex = 0; //don't draw the model once its destroyed - G_AddEvent( self, EV_ITEM_EXPLOSION, DirToByte( dir ) ); + G_AddEvent( self, EV_BUILDABLE_EXPLOSION, DirToByte( dir ) ); self->r.contents = CONTENTS_TRIGGER; self->timestamp = level.time; @@ -2096,9 +1979,8 @@ gentity_t *G_buildItem( gentity_t *builder, buildable_t buildable, vec3_t origin built->think = HSpawn_Think; break; - case BA_H_DEF1: - case BA_H_DEF2: - case BA_H_DEF3: + case BA_H_MGTURRET: + case BA_H_TESLAGEN: built->die = HSpawn_Die; built->think = HDef_Think; break; diff --git a/src/game/g_client.c b/src/game/g_client.c index fc469041..b880d352 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -28,23 +28,25 @@ Targets will be fired when someone spawns in on them. "nobots" will prevent bots from using this spot. "nohumans" will prevent non-bots from using this spot. */ -void SP_info_player_deathmatch( gentity_t *ent ) { +void SP_info_player_deathmatch( gentity_t *ent ) +{ int i; G_SpawnInt( "nobots", "0", &i); - if ( i ) { + + if( i ) ent->flags |= FL_NO_BOTS; - } + G_SpawnInt( "nohumans", "0", &i ); - if ( i ) { + if( i ) ent->flags |= FL_NO_HUMANS; - } } /*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 32) equivelant to info_player_deathmatch */ -void SP_info_player_start(gentity_t *ent) { +void SP_info_player_start( gentity_t *ent ) +{ ent->classname = "info_player_deathmatch"; SP_info_player_deathmatch( ent ); } @@ -52,22 +54,22 @@ void SP_info_player_start(gentity_t *ent) { /*QUAKED info_player_intermission (1 0 1) (-16 -16 -24) (16 16 32) The intermission will be viewed from this point. Target an info_notnull for the view direction. */ -void SP_info_player_intermission( gentity_t *ent ) { - +void SP_info_player_intermission( gentity_t *ent ) +{ } /*QUAKED info_alien_intermission (1 0 1) (-16 -16 -24) (16 16 32) The intermission will be viewed from this point. Target an info_notnull for the view direction. */ -void SP_info_alien_intermission( gentity_t *ent ) { - +void SP_info_alien_intermission( gentity_t *ent ) +{ } /*QUAKED info_human_intermission (1 0 1) (-16 -16 -24) (16 16 32) The intermission will be viewed from this point. Target an info_notnull for the view direction. */ -void SP_info_human_intermission( gentity_t *ent ) { - +void SP_info_human_intermission( gentity_t *ent ) +{ } @@ -86,9 +88,10 @@ SpotWouldTelefrag ================ */ -qboolean SpotWouldTelefrag( gentity_t *spot ) { - int i, num; - int touch[MAX_GENTITIES]; +qboolean SpotWouldTelefrag( gentity_t *spot ) +{ + int i, num; + int touch[ MAX_GENTITIES ]; gentity_t *hit; vec3_t mins, maxs; @@ -96,13 +99,12 @@ qboolean SpotWouldTelefrag( gentity_t *spot ) { VectorAdd( spot->s.origin, playerMaxs, maxs ); num = trap_EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); - for (i=0 ; iclient && hit->client->ps.stats[STAT_HEALTH] > 0 ) { - if( hit->client ) { + if( hit->client ) return qtrue; - } - } return qfalse; @@ -116,21 +118,24 @@ Find the spot that we DON'T want to use ================ */ #define MAX_SPAWN_POINTS 128 -gentity_t *SelectNearestDeathmatchSpawnPoint( vec3_t from ) { +gentity_t *SelectNearestDeathmatchSpawnPoint( vec3_t from ) +{ gentity_t *spot; vec3_t delta; - float dist, nearestDist; + float dist, nearestDist; gentity_t *nearestSpot; nearestDist = 999999; nearestSpot = NULL; spot = NULL; - while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { - + while( (spot = G_Find( spot, FOFS( classname ), "info_player_deathmatch" ) ) != NULL ) + { VectorSubtract( spot->s.origin, from, delta ); dist = VectorLength( delta ); - if ( dist < nearestDist ) { + + if( dist < nearestDist ) + { nearestDist = dist; nearestSpot = spot; } @@ -148,28 +153,29 @@ go to a random point that doesn't telefrag ================ */ #define MAX_SPAWN_POINTS 128 -gentity_t *SelectRandomDeathmatchSpawnPoint( void ) { +gentity_t *SelectRandomDeathmatchSpawnPoint( void ) +{ gentity_t *spot; - int count; - int selection; - gentity_t *spots[MAX_SPAWN_POINTS]; + int count; + int selection; + gentity_t *spots[ MAX_SPAWN_POINTS ]; count = 0; spot = NULL; - while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { - if ( SpotWouldTelefrag( spot ) ) { + while( ( spot = G_Find( spot, FOFS( classname ), "info_player_deathmatch" ) ) != NULL ) + { + if( SpotWouldTelefrag( spot ) ) continue; - } + spots[ count ] = spot; count++; } - if ( !count ) { // no spots that won't telefrag - return G_Find( NULL, FOFS(classname), "info_player_deathmatch"); - } + if( !count ) // no spots that won't telefrag + return G_Find( NULL, FOFS( classname ), "info_player_deathmatch" ); - selection = rand() % count; + selection = rand( ) % count; return spots[ selection ]; } @@ -181,63 +187,79 @@ SelectRandomFurthestSpawnPoint Chooses a player start, deathmatch start, etc ============ */ -gentity_t *SelectRandomFurthestSpawnPoint ( vec3_t avoidPoint, vec3_t origin, vec3_t angles ) { +gentity_t *SelectRandomFurthestSpawnPoint ( vec3_t avoidPoint, vec3_t origin, vec3_t angles ) +{ gentity_t *spot; vec3_t delta; - float dist; - float list_dist[64]; - gentity_t *list_spot[64]; - int numSpots, rnd, i, j; + float dist; + float list_dist[ 64 ]; + gentity_t *list_spot[ 64 ]; + int numSpots, rnd, i, j; numSpots = 0; spot = NULL; - while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { - if ( SpotWouldTelefrag( spot ) ) { + while( ( spot = G_Find( spot, FOFS( classname ), "info_player_deathmatch" ) ) != NULL ) + { + if( SpotWouldTelefrag( spot ) ) continue; - } + VectorSubtract( spot->s.origin, avoidPoint, delta ); dist = VectorLength( delta ); - for (i = 0; i < numSpots; i++) { - if ( dist > list_dist[i] ) { - if ( numSpots >= 64 ) - numSpots = 64-1; - for (j = numSpots; j > i; j--) { - list_dist[j] = list_dist[j-1]; - list_spot[j] = list_spot[j-1]; + + for( i = 0; i < numSpots; i++ ) + { + if( dist > list_dist[ i ] ) + { + if( numSpots >= 64 ) + numSpots = 64 - 1; + + for( j = numSpots; j > i; j-- ) + { + list_dist[ j ] = list_dist[ j - 1 ]; + list_spot[ j ] = list_spot[ j - 1 ]; } - list_dist[i] = dist; - list_spot[i] = spot; + + list_dist[ i ] = dist; + list_spot[ i ] = spot; numSpots++; - if (numSpots > 64) + + if( numSpots > 64 ) numSpots = 64; + break; } } - if (i >= numSpots && numSpots < 64) { - list_dist[numSpots] = dist; - list_spot[numSpots] = spot; + + if( i >= numSpots && numSpots < 64 ) + { + list_dist[ numSpots ] = dist; + list_spot[ numSpots ] = spot; numSpots++; } } - if (!numSpots) { - spot = G_Find( NULL, FOFS(classname), "info_player_deathmatch"); - if (!spot) + + if( !numSpots ) + { + spot = G_Find( NULL, FOFS( classname ), "info_player_deathmatch" ); + + if( !spot ) G_Error( "Couldn't find a spawn point" ); - VectorCopy (spot->s.origin, origin); - origin[2] += 9; - VectorCopy (spot->s.angles, angles); + + VectorCopy( spot->s.origin, origin ); + origin[ 2 ] += 9; + VectorCopy( spot->s.angles, angles ); return spot; } // select a random spot from the spawn points furthest away - rnd = random() * (numSpots / 2); + rnd = random( ) * ( numSpots / 2 ); - VectorCopy (list_spot[rnd]->s.origin, origin); - origin[2] += 9; - VectorCopy (list_spot[rnd]->s.angles, angles); + VectorCopy( list_spot[ rnd ]->s.origin, origin ); + origin[ 2 ] += 9; + VectorCopy( list_spot[ rnd ]->s.angles, angles ); - return list_spot[rnd]; + return list_spot[ rnd ]; } @@ -313,7 +335,8 @@ SelectHumanSpawnPoint go to a random point that doesn't telefrag ================ */ -gentity_t *SelectHumanSpawnPoint( void ) { +gentity_t *SelectHumanSpawnPoint( void ) +{ gentity_t *spot; int count; int selection; @@ -374,7 +397,8 @@ SelectSpawnPoint Chooses a player start, deathmatch start, etc ============ */ -gentity_t *SelectSpawnPoint ( vec3_t avoidPoint, vec3_t origin, vec3_t angles ) { +gentity_t *SelectSpawnPoint( vec3_t avoidPoint, vec3_t origin, vec3_t angles ) +{ return SelectRandomFurthestSpawnPoint( avoidPoint, origin, angles ); /* @@ -465,23 +489,25 @@ Try to find a spawn point marked 'initial', otherwise use normal spawn selection. ============ */ -gentity_t *SelectInitialSpawnPoint( vec3_t origin, vec3_t angles ) { +gentity_t *SelectInitialSpawnPoint( vec3_t origin, vec3_t angles ) +{ gentity_t *spot; spot = NULL; - while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) { - if ( spot->spawnflags & 1 ) { + while( ( spot = G_Find( spot, FOFS( classname ), "info_player_deathmatch" ) ) != NULL ) + { + if( spot->spawnflags & 1 ) break; - } } - if ( !spot || SpotWouldTelefrag( spot ) ) { + if( !spot || SpotWouldTelefrag( spot ) ) + { return SelectSpawnPoint( vec3_origin, origin, angles ); } - VectorCopy (spot->s.origin, origin); - origin[2] += 9; - VectorCopy (spot->s.angles, angles); + VectorCopy( spot->s.origin, origin ); + origin[ 2 ] += 9; + VectorCopy( spot->s.angles, angles ); return spot; } @@ -492,8 +518,9 @@ SelectSpectatorSpawnPoint ============ */ -gentity_t *SelectSpectatorSpawnPoint( vec3_t origin, vec3_t angles ) { - FindIntermissionPoint(); +gentity_t *SelectSpectatorSpawnPoint( vec3_t origin, vec3_t angles ) +{ + FindIntermissionPoint( ); VectorCopy( level.intermission_origin, origin ); VectorCopy( level.intermission_angle, angles ); @@ -510,18 +537,18 @@ Try to find a spawn point for alien intermission otherwise use normal intermission spawn. ============ */ -gentity_t *SelectAlienLockSpawnPoint( vec3_t origin, vec3_t angles ) { +gentity_t *SelectAlienLockSpawnPoint( vec3_t origin, vec3_t angles ) +{ gentity_t *spot; spot = NULL; - spot = G_Find (spot, FOFS(classname), "info_alien_intermission"); + spot = G_Find( spot, FOFS( classname ), "info_alien_intermission" ); - if ( !spot ) { + if( !spot ) return SelectSpectatorSpawnPoint( origin, angles ); - } - VectorCopy (spot->s.origin, origin); - VectorCopy (spot->s.angles, angles); + VectorCopy( spot->s.origin, origin ); + VectorCopy( spot->s.angles, angles ); return spot; } @@ -535,18 +562,18 @@ Try to find a spawn point for human intermission otherwise use normal intermission spawn. ============ */ -gentity_t *SelectHumanLockSpawnPoint( vec3_t origin, vec3_t angles ) { +gentity_t *SelectHumanLockSpawnPoint( vec3_t origin, vec3_t angles ) +{ gentity_t *spot; spot = NULL; - spot = G_Find (spot, FOFS(classname), "info_human_intermission"); + spot = G_Find( spot, FOFS( classname ), "info_human_intermission" ); - if ( !spot ) { + if( !spot ) return SelectSpectatorSpawnPoint( origin, angles ); - } - VectorCopy (spot->s.origin, origin); - VectorCopy (spot->s.angles, angles); + VectorCopy( spot->s.origin, origin ); + VectorCopy( spot->s.angles, angles ); return spot; } @@ -774,18 +801,21 @@ SetClientViewAngle ================== */ -void SetClientViewAngle( gentity_t *ent, vec3_t angle ) { +void SetClientViewAngle( gentity_t *ent, vec3_t angle ) +{ int i; // set the delta angle - for (i=0 ; i<3 ; i++) { + for( i = 0; i < 3; i++ ) + { int cmdAngle; - cmdAngle = ANGLE2SHORT(angle[i]); - ent->client->ps.delta_angles[i] = cmdAngle - ent->client->pers.cmd.angles[i]; + cmdAngle = ANGLE2SHORT( angle[ i ] ); + ent->client->ps.delta_angles[ i ] = cmdAngle - ent->client->pers.cmd.angles[ i ]; } + VectorCopy( angle, ent->s.angles ); - VectorCopy (ent->s.angles, ent->client->ps.viewangles); + VectorCopy( ent->s.angles, ent->client->ps.viewangles ); } /* @@ -793,7 +823,8 @@ void SetClientViewAngle( gentity_t *ent, vec3_t angle ) { respawn ================ */ -void respawn( gentity_t *ent ) { +void respawn( gentity_t *ent ) +{ gentity_t *tent; SpawnCorpse( ent ); @@ -815,55 +846,34 @@ TeamCount Returns number of players on a team ================ */ -team_t TeamCount( int ignoreClientNum, int team ) { +team_t TeamCount( int ignoreClientNum, int team ) +{ int i; int count = 0; - for ( i = 0 ; i < level.maxclients ; i++ ) { - if ( i == ignoreClientNum ) { + for( i = 0 ; i < level.maxclients ; i++ ) + { + if( i == ignoreClientNum ) continue; - } - if ( level.clients[i].pers.connected == CON_DISCONNECTED ) { + + if( level.clients[ i ].pers.connected == CON_DISCONNECTED ) continue; - } - if ( level.clients[i].sess.sessionTeam == team ) { + + if( level.clients[ i ].sess.sessionTeam == team ) count++; - } } return count; } -/* -================ -TeamLeader - -Returns the client number of the team leader -================ -*/ -int TeamLeader( int team ) { - int i; - - for ( i = 0 ; i < level.maxclients ; i++ ) { - if ( level.clients[i].pers.connected == CON_DISCONNECTED ) { - continue; - } - if ( level.clients[i].sess.sessionTeam == team ) { - if ( level.clients[i].sess.teamLeader ) - return i; - } - } - - return -1; -} - /* =========== ClientCheckName ============ */ -static void ClientCleanName( const char *in, char *out, int outSize ) { +static void ClientCleanName( const char *in, char *out, int outSize ) +{ int len, colorlessLen; char ch; char *p; @@ -878,34 +888,33 @@ static void ClientCleanName( const char *in, char *out, int outSize ) { *p = 0; spaces = 0; - while( 1 ) { + while( 1 ) + { ch = *in++; - if( !ch ) { + if( !ch ) break; - } // don't allow leading spaces - if( !*p && ch == ' ' ) { + if( !*p && ch == ' ' ) continue; - } // check colors - if( ch == Q_COLOR_ESCAPE ) { + if( ch == Q_COLOR_ESCAPE ) + { // solo trailing carat is not a color prefix - if( !*in ) { + if( !*in ) break; - } // don't allow black in a name, period - if( ColorIndex(*in) == 0 ) { + if( ColorIndex( *in ) == 0 ) + { in++; continue; } // make sure room in dest for both chars - if( len > outSize - 2 ) { + if( len > outSize - 2 ) break; - } *out++ = ch; *out++ = *in++; @@ -914,30 +923,28 @@ static void ClientCleanName( const char *in, char *out, int outSize ) { } // don't allow too many consecutive spaces - if( ch == ' ' ) { + if( ch == ' ' ) + { spaces++; - if( spaces > 3 ) { + if( spaces > 3 ) continue; - } } - else { + else spaces = 0; - } - if( len > outSize - 1 ) { + if( len > outSize - 1 ) break; - } *out++ = ch; colorlessLen++; len++; } + *out = 0; // don't allow empty names - if( *p == 0 || colorlessLen == 0 ) { + if( *p == 0 || colorlessLen == 0 ) Q_strncpyz( p, "UnnamedPlayer", outSize ); - } } @@ -952,19 +959,20 @@ The game can override any of the settings and call trap_SetUserinfo if desired. ============ */ -void ClientUserinfoChanged( int clientNum ) { +void ClientUserinfoChanged( int clientNum ) +{ gentity_t *ent; - int teamTask, teamLeader, team, health; - char *s; - char model[MAX_QPATH]; - char buffer[ MAX_QPATH ]; - char oldname[MAX_STRING_CHARS]; + int teamTask, teamLeader, team, health; + char *s; + char model[ MAX_QPATH ]; + char buffer[ MAX_QPATH ]; + char oldname[ MAX_STRING_CHARS ]; gclient_t *client; - char c1[MAX_INFO_STRING]; - char c2[MAX_INFO_STRING]; - char redTeam[MAX_INFO_STRING]; - char blueTeam[MAX_INFO_STRING]; - char userinfo[MAX_INFO_STRING]; + char c1[ MAX_INFO_STRING ]; + char c2[ MAX_INFO_STRING ]; + char redTeam[ MAX_INFO_STRING ]; + char blueTeam[ MAX_INFO_STRING ]; + char userinfo[ MAX_INFO_STRING ]; ent = g_entities + clientNum; client = ent->client; @@ -972,48 +980,49 @@ void ClientUserinfoChanged( int clientNum ) { trap_GetUserinfo( clientNum, userinfo, sizeof( userinfo ) ); // check for malformed or illegal info strings - if ( !Info_Validate(userinfo) ) { - strcpy (userinfo, "\\name\\badinfo"); - } + if( !Info_Validate(userinfo) ) + strcpy( userinfo, "\\name\\badinfo" ); // check for local client s = Info_ValueForKey( userinfo, "ip" ); - if ( !strcmp( s, "localhost" ) ) { + + if( !strcmp( s, "localhost" ) ) client->pers.localClient = qtrue; - } // check the item prediction s = Info_ValueForKey( userinfo, "cg_predictItems" ); - if ( !atoi( s ) ) { + + if( !atoi( s ) ) client->pers.predictItemPickup = qfalse; - } else { + else client->pers.predictItemPickup = qtrue; - } // set name - Q_strncpyz ( oldname, client->pers.netname, sizeof( oldname ) ); - s = Info_ValueForKey (userinfo, "name"); - ClientCleanName( s, client->pers.netname, sizeof(client->pers.netname) ); + Q_strncpyz( oldname, client->pers.netname, sizeof( oldname ) ); + s = Info_ValueForKey( userinfo, "name" ); + ClientCleanName( s, client->pers.netname, sizeof( client->pers.netname ) ); - if ( client->sess.sessionTeam == TEAM_SPECTATOR ) { - if ( client->sess.spectatorState == SPECTATOR_SCOREBOARD ) { - Q_strncpyz( client->pers.netname, "scoreboard", sizeof(client->pers.netname) ); - } + if( client->sess.sessionTeam == TEAM_SPECTATOR ) + { + if( client->sess.spectatorState == SPECTATOR_SCOREBOARD ) + Q_strncpyz( client->pers.netname, "scoreboard", sizeof( client->pers.netname ) ); } - if ( client->pers.connected == CON_CONNECTED ) { - if ( strcmp( oldname, client->pers.netname ) ) { - trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " renamed to %s\n\"", oldname, - client->pers.netname) ); + if( client->pers.connected == CON_CONNECTED ) + { + if( strcmp( oldname, client->pers.netname ) ) + { + trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " renamed to %s\n\"", oldname, + client->pers.netname ) ); } } // set max health health = atoi( Info_ValueForKey( userinfo, "handicap" ) ); client->pers.maxHealth = health; - if ( client->pers.maxHealth < 1 || client->pers.maxHealth > 100 ) { + + if( client->pers.maxHealth < 1 || client->pers.maxHealth > 100 ) client->pers.maxHealth = 100; - } //hack to force a client update if the config string does not change between spawning if( client->pers.pclass == PCL_NONE ) @@ -1026,6 +1035,7 @@ void ClientUserinfoChanged( int clientNum ) { // wallwalk follow s = Info_ValueForKey( userinfo, "cg_wwFollow" ); + if( atoi( s ) ) client->ps.persistant[ PERS_STATE ] |= PS_WALLCLIMBINGFOLLOW; else @@ -1033,37 +1043,30 @@ void ClientUserinfoChanged( int clientNum ) { // teamInfo s = Info_ValueForKey( userinfo, "teamoverlay" ); - if ( ! *s || atoi( s ) != 0 ) { + + if( ! *s || atoi( s ) != 0 ) client->pers.teamInfo = qtrue; - } else { + else client->pers.teamInfo = qfalse; - } // team task (0 = none, 1 = offence, 2 = defence) - teamTask = atoi(Info_ValueForKey(userinfo, "teamtask")); + teamTask = atoi( Info_ValueForKey( userinfo, "teamtask" ) ); // team Leader (1 = leader, 0 is normal player) teamLeader = client->sess.teamLeader; // colors - strcpy(c1, Info_ValueForKey( userinfo, "color1" )); - strcpy(c2, Info_ValueForKey( userinfo, "color2" )); - strcpy(redTeam, "humans"); - strcpy(blueTeam, "aliens"); + strcpy( c1, Info_ValueForKey( userinfo, "color1" ) ); + strcpy( c2, Info_ValueForKey( userinfo, "color2" ) ); + strcpy( redTeam, "humans" ); + strcpy( blueTeam, "aliens" ); // send over a subset of the userinfo keys so other clients can // print scoreboards, display models, and play custom sounds - if ( ent->r.svFlags & SVF_BOT ) { - s = va("n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\skill\\%s\\tt\\%d\\tl\\%d", - client->pers.netname, client->ps.stats[ STAT_PTEAM ], model, model, c1, c2, - client->pers.maxHealth, client->sess.wins, client->sess.losses, - Info_ValueForKey( userinfo, "skill" ), teamTask, teamLeader ); - } else { - s = va("n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\g_redteam\\%s\\g_blueteam\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\tt\\%d\\tl\\%d", - client->pers.netname, client->ps.stats[ STAT_PTEAM ], model, model, redTeam, blueTeam, c1, c2, - client->pers.maxHealth, client->sess.wins, client->sess.losses, teamTask, teamLeader); - } + s = va( "n\\%s\\t\\%i\\model\\%s\\hmodel\\%s\\g_redteam\\%s\\g_blueteam\\%s\\c1\\%s\\c2\\%s\\hc\\%i\\w\\%i\\l\\%i\\tt\\%d\\tl\\%d", + client->pers.netname, client->ps.stats[ STAT_PTEAM ], model, model, redTeam, blueTeam, c1, c2, + client->pers.maxHealth, client->sess.wins, client->sess.losses, teamTask, teamLeader); - trap_SetConfigstring( CS_PLAYERS+clientNum, s ); + trap_SetConfigstring( CS_PLAYERS + clientNum, s ); G_LogPrintf( "ClientUserinfoChanged: %i %s\n", clientNum, s ); } @@ -1089,10 +1092,11 @@ to the server machine, but qfalse on map changes and tournement restarts. ============ */ -char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot ) { - char *value; +char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot ) +{ + char *value; gclient_t *client; - char userinfo[MAX_INFO_STRING]; + char userinfo[ MAX_INFO_STRING ]; gentity_t *ent; ent = &g_entities[ clientNum ]; @@ -1100,17 +1104,16 @@ char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot ) { trap_GetUserinfo( clientNum, userinfo, sizeof( userinfo ) ); // check to see if they are on the banned IP list - value = Info_ValueForKey (userinfo, "ip"); - if ( G_FilterPacket( value ) ) { + value = Info_ValueForKey( userinfo, "ip" ); + if( G_FilterPacket( value ) ) return "Banned."; - } // check for a password - value = Info_ValueForKey (userinfo, "password"); - if ( g_password.string[0] && Q_stricmp( g_password.string, "none" ) && - strcmp( g_password.string, value) != 0) { + value = Info_ValueForKey( userinfo, "password" ); + + if( g_password.string[ 0 ] && Q_stricmp( g_password.string, "none" ) && + strcmp( g_password.string, value ) != 0 ) return "Invalid password"; - } // they can connect ent->client = level.clients + clientNum; @@ -1121,9 +1124,9 @@ char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot ) { client->pers.connected = CON_CONNECTING; // read or initialize the session data - if ( firstTime || level.newSession ) { + if( firstTime || level.newSession ) G_InitSessionData( client, userinfo ); - } + G_ReadSessionData( client ); // get and distribute relevent paramters @@ -1131,12 +1134,11 @@ char *ClientConnect( int clientNum, qboolean firstTime, qboolean isBot ) { ClientUserinfoChanged( clientNum ); // don't do the "xxx connected" messages if they were caried over from previous level - if ( firstTime ) { - trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " connected\n\"", client->pers.netname) ); - } + if( firstTime ) + trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " connected\n\"", client->pers.netname ) ); // count current clients and rank for scoreboard - CalculateRanks(); + CalculateRanks( ); return NULL; } @@ -1150,19 +1152,20 @@ to be placed into the level. This will happen every level load, and on transition between teams, but doesn't happen on respawns ============ */ -void ClientBegin( int clientNum ) { +void ClientBegin( int clientNum ) +{ gentity_t *ent; gclient_t *client; gentity_t *tent; - int flags; + int flags; ent = g_entities + clientNum; client = level.clients + clientNum; - if ( ent->r.linked ) { + if( ent->r.linked ) trap_UnlinkEntity( ent ); - } + G_InitGentity( ent ); ent->touch = 0; ent->pain = 0; @@ -1185,17 +1188,19 @@ void ClientBegin( int clientNum ) { ClientSpawn( ent, NULL ); - if ( client->sess.sessionTeam != TEAM_SPECTATOR ) { + if( client->sess.sessionTeam != TEAM_SPECTATOR ) + { // send event tent = G_TempEntity( ent->client->ps.origin, EV_PLAYER_TELEPORT_IN ); tent->s.clientNum = ent->s.clientNum; - trap_SendServerCommand( -1, va("print \"%s" S_COLOR_WHITE " entered the game\n\"", client->pers.netname) ); + trap_SendServerCommand( -1, va( "print \"%s" S_COLOR_WHITE " entered the game\n\"", client->pers.netname ) ); } + G_LogPrintf( "ClientBegin: %i\n", clientNum ); // count current clients and rank for scoreboard - CalculateRanks(); + CalculateRanks( ); } /* @@ -1302,11 +1307,12 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn ) savedPing = client->ps.ping; accuracy_hits = client->accuracy_hits; accuracy_shots = client->accuracy_shots; - for ( i = 0 ; i < MAX_PERSISTANT ; i++ ) { - persistant[i] = client->ps.persistant[i]; - } + + for( i = 0; i < MAX_PERSISTANT; i++ ) + persistant[ i ] = client->ps.persistant[ i ]; + eventSequence = client->ps.eventSequence; - memset (client, 0, sizeof(*client)); + memset( client, 0, sizeof( *client ) ); client->pers = saved; client->sess = savedSess; @@ -1314,9 +1320,10 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn ) client->accuracy_hits = accuracy_hits; client->accuracy_shots = accuracy_shots; client->lastkilled_client = -1; - for ( i = 0 ; i < MAX_PERSISTANT ; i++ ) { - client->ps.persistant[i] = persistant[i]; - } + + for( i = 0; i < MAX_PERSISTANT; i++ ) + client->ps.persistant[ i ] = persistant[ i ]; + client->ps.eventSequence = eventSequence; if( client->sess.sessionTeam == TEAM_SPECTATOR ) @@ -1328,18 +1335,18 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn ) } // increment the spawncount so the client will detect the respawn - client->ps.persistant[PERS_SPAWN_COUNT]++; - client->ps.persistant[PERS_TEAM] = client->sess.sessionTeam; + client->ps.persistant[ PERS_SPAWN_COUNT ]++; + client->ps.persistant[ PERS_TEAM ] = client->sess.sessionTeam; client->airOutTime = level.time + 12000; - trap_GetUserinfo( index, userinfo, sizeof(userinfo) ); + trap_GetUserinfo( index, userinfo, sizeof( userinfo ) ); client->ps.eFlags = flags; //Com_Printf( "ent->client->pers->pclass = %i\n", ent->client->pers.pclass ); ent->s.groundEntityNum = ENTITYNUM_NONE; - ent->client = &level.clients[index]; + ent->client = &level.clients[ index ]; ent->takedamage = qtrue; ent->inuse = qtrue; ent->classname = "player"; @@ -1386,7 +1393,7 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn ) VectorSet( ent->client->ps.grapplePoint, 0.0f, 0.0f, 1.0f ); // health will count down towards max_health - ent->health = client->ps.stats[STAT_HEALTH] = client->ps.stats[STAT_MAX_HEALTH]; //* 1.25; + ent->health = client->ps.stats[ STAT_HEALTH ] = client->ps.stats[ STAT_MAX_HEALTH ]; //* 1.25; G_SetOrigin( ent, spawn_origin ); VectorCopy( spawn_origin, client->ps.origin ); @@ -1416,11 +1423,10 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn ) trap_GetUsercmd( client - level.clients, &ent->client->pers.cmd ); SetClientViewAngle( ent, spawn_angles ); - if ( client->sess.sessionTeam == TEAM_SPECTATOR ) { - - } else { + if( !( client->sess.sessionTeam == TEAM_SPECTATOR ) ) + { G_KillBox( ent ); - trap_LinkEntity (ent); + trap_LinkEntity( ent ); // force the base weapon up client->ps.weapon = WP_NONE; @@ -1443,9 +1449,10 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn ) client->ps.torsoAnim = TORSO_STAND; client->ps.legsAnim = LEGS_IDLE; - if ( level.intermissiontime ) { + if( level.intermissiontime ) MoveClientToIntermission( ent ); - } else { + else + { // fire the targets of the spawn point if( !spawn ) G_UseTargets( spawnPoint, ent ); @@ -1453,8 +1460,11 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn ) // select the highest weapon number available, after any // spawn given items have fired client->ps.weapon = 1; - for ( i = WP_NUM_WEAPONS - 1 ; i > 0 ; i-- ) { - if ( BG_gotWeapon( i, client->ps.stats ) ) { + + for( i = WP_NUM_WEAPONS - 1; i > 0 ; i-- ) + { + if( BG_gotWeapon( i, client->ps.stats ) ) + { client->ps.weapon = i; break; } @@ -1468,14 +1478,15 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn ) ClientThink( ent-g_entities ); // positively link the client, even if the command times are weird - if ( client->sess.sessionTeam != TEAM_SPECTATOR ) { + if( client->sess.sessionTeam != TEAM_SPECTATOR ) + { BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue ); VectorCopy( ent->client->ps.origin, ent->r.currentOrigin ); trap_LinkEntity( ent ); } //TA: must do this here so the number of active clients is calculated - CalculateRanks(); + CalculateRanks( ); // run the presend to set anything else ClientEndFrame( ent ); @@ -1497,38 +1508,36 @@ call trap_DropClient(), which will call this and do server system housekeeping. ============ */ -void ClientDisconnect( int clientNum ) { +void ClientDisconnect( int clientNum ) +{ gentity_t *ent; gentity_t *tent; - int i; + int i; ent = g_entities + clientNum; - if ( !ent->client ) { + + if( !ent->client ) return; - } // send effect if they were completely connected - if ( ent->client->pers.connected == CON_CONNECTED - && ent->client->sess.sessionTeam != TEAM_SPECTATOR ) { + if( ent->client->pers.connected == CON_CONNECTED && + ent->client->sess.sessionTeam != TEAM_SPECTATOR ) + { tent = G_TempEntity( ent->client->ps.origin, EV_PLAYER_TELEPORT_OUT ); tent->s.clientNum = ent->s.clientNum; - - // They don't get to take powerups with them! - // Especially important for stuff like CTF flags - TossClientItems ( ent ); } G_LogPrintf( "ClientDisconnect: %i\n", clientNum ); - trap_UnlinkEntity (ent); + trap_UnlinkEntity( ent ); ent->s.modelindex = 0; ent->inuse = qfalse; ent->classname = "disconnected"; ent->client->pers.connected = CON_DISCONNECTED; - ent->client->ps.persistant[PERS_TEAM] = TEAM_FREE; + ent->client->ps.persistant[ PERS_TEAM ] = TEAM_FREE; ent->client->sess.sessionTeam = TEAM_FREE; trap_SetConfigstring( CS_PLAYERS + clientNum, ""); - CalculateRanks(); + CalculateRanks( ); } diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 37cc866e..1b2e0156 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -87,15 +87,20 @@ void Cmd_Score_f( gentity_t *ent ) CheatsOk ================== */ -qboolean CheatsOk( gentity_t *ent ) { - if ( !g_cheats.integer ) { - trap_SendServerCommand( ent-g_entities, va("print \"Cheats are not enabled on this server.\n\"")); +qboolean CheatsOk( gentity_t *ent ) +{ + if( !g_cheats.integer ) + { + trap_SendServerCommand( ent-g_entities, va( "print \"Cheats are not enabled on this server.\n\"" ) ); return qfalse; } - if ( ent->health <= 0 ) { - trap_SendServerCommand( ent-g_entities, va("print \"You must be alive to use this command.\n\"")); - return qfalse; + + if( ent->health <= 0 ) + { + trap_SendServerCommand( ent-g_entities, va( "print \"You must be alive to use this command.\n\"" ) ); + return qfalse; } + return qtrue; } @@ -138,74 +143,6 @@ char *ConcatArgs( int start ) return line; } -/* -================== -SanitizeString - -Remove case and control characters -================== -*/ -void SanitizeString( char *in, char *out ) { - while ( *in ) { - if ( *in == 27 ) { - in += 2; // skip color code - continue; - } - if ( *in < 32 ) { - in++; - continue; - } - *out++ = tolower( *in++ ); - } - - *out = 0; -} - -/* -================== -ClientNumberFromString - -Returns a player number for either a number or name string -Returns -1 if invalid -================== -*/ -int ClientNumberFromString( gentity_t *to, char *s ) { - gclient_t *cl; - int idnum; - char s2[MAX_STRING_CHARS]; - char n2[MAX_STRING_CHARS]; - - // numeric values are just slot numbers - if (s[0] >= '0' && s[0] <= '9') { - idnum = atoi( s ); - if ( idnum < 0 || idnum >= level.maxclients ) { - trap_SendServerCommand( to-g_entities, va("print \"Bad client slot: %i\n\"", idnum)); - return -1; - } - - cl = &level.clients[idnum]; - if ( cl->pers.connected != CON_CONNECTED ) { - trap_SendServerCommand( to-g_entities, va("print \"Client %i is not active\n\"", idnum)); - return -1; - } - return idnum; - } - - // check for a name match - SanitizeString( s, s2 ); - for ( idnum=0,cl=level.clients ; idnum < level.maxclients ; idnum++,cl++ ) { - if ( cl->pers.connected != CON_CONNECTED ) { - continue; - } - SanitizeString( cl->pers.netname, n2 ); - if ( !strcmp( n2, s2 ) ) { - return idnum; - } - } - - trap_SendServerCommand( to-g_entities, va("print \"User %s is not on the server\n\"", s)); - return -1; -} /* ================== @@ -214,46 +151,46 @@ Cmd_Give_f Give items to a client ================== */ -void Cmd_Give_f (gentity_t *ent) +void Cmd_Give_f( gentity_t *ent ) { - char *name; + char *name; gitem_t *it; - int i; + int i; qboolean give_all; - gentity_t *it_ent; + gentity_t *it_ent; trace_t trace; - if ( !CheatsOk( ent ) ) { + if( !CheatsOk( ent ) ) return; - } name = ConcatArgs( 1 ); - if (Q_stricmp(name, "all") == 0) + if( Q_stricmp( name, "all" ) == 0 ) give_all = qtrue; else give_all = qfalse; - if (give_all || Q_stricmp( name, "health") == 0) + if( give_all || Q_stricmp( name, "health" ) == 0 ) { - ent->health = ent->client->ps.stats[STAT_MAX_HEALTH]; - if (!give_all) + ent->health = ent->client->ps.stats[ STAT_MAX_HEALTH ]; + if( !give_all ) return; } - if (give_all || Q_stricmp(name, "weapons") == 0) + if( give_all || Q_stricmp( name, "weapons" ) == 0 ) { - BG_packWeapon( (1 << WP_NUM_WEAPONS) - 1 - ( 1 << WP_NONE ), ent->client->ps.stats ); - if (!give_all) + BG_packWeapon( ( 1 << WP_NUM_WEAPONS ) - 1 - ( 1 << WP_NONE ), ent->client->ps.stats ); + + if( !give_all ) return; } - if (give_all || Q_stricmp(name, "ammo") == 0) + if( give_all || Q_stricmp( name, "ammo" ) == 0 ) { - for ( i = 0 ; i < MAX_WEAPONS ; i++ ) { + for( i = 0; i < MAX_WEAPONS; i++ ) BG_packAmmoArray( i, ent->client->ps.ammo, ent->client->ps.powerups, 999, 0, 0 ); - } - if (!give_all) + + if( !give_all ) return; } @@ -264,25 +201,6 @@ void Cmd_Give_f (gentity_t *ent) if( !give_all ) return; } - - // spawn a specific item right on the player -/* if ( !give_all ) { - it = BG_FindItem (name); - if (!it) { - return; - } - - it_ent = G_Spawn(); - VectorCopy( ent->r.currentOrigin, it_ent->s.origin ); - it_ent->classname = it->classname; - G_SpawnItem (it_ent, it); - FinishSpawningItem(it_ent ); - memset( &trace, 0, sizeof( trace ) ); - Touch_Item (it_ent, ent, &trace); - if (it_ent->inuse) { - G_FreeEntity( it_ent ); - } - }*/ } @@ -295,21 +213,21 @@ Sets client to godmode argv(0) god ================== */ -void Cmd_God_f (gentity_t *ent) +void Cmd_God_f( gentity_t *ent ) { char *msg; - if ( !CheatsOk( ent ) ) { + if( !CheatsOk( ent ) ) return; - } ent->flags ^= FL_GODMODE; - if (!(ent->flags & FL_GODMODE) ) + + if( !( ent->flags & FL_GODMODE ) ) msg = "godmode OFF\n"; else msg = "godmode ON\n"; - trap_SendServerCommand( ent-g_entities, va("print \"%s\"", msg)); + trap_SendServerCommand( ent - g_entities, va( "print \"%s\"", msg ) ); } @@ -322,20 +240,21 @@ Sets client to notarget argv(0) notarget ================== */ -void Cmd_Notarget_f( gentity_t *ent ) { +void Cmd_Notarget_f( gentity_t *ent ) +{ char *msg; - if ( !CheatsOk( ent ) ) { + if( !CheatsOk( ent ) ) return; - } ent->flags ^= FL_NOTARGET; - if (!(ent->flags & FL_NOTARGET) ) + + if( !( ent->flags & FL_NOTARGET ) ) msg = "notarget OFF\n"; else msg = "notarget ON\n"; - trap_SendServerCommand( ent-g_entities, va("print \"%s\"", msg)); + trap_SendServerCommand( ent - g_entities, va( "print \"%s\"", msg ) ); } @@ -346,21 +265,21 @@ Cmd_Noclip_f argv(0) noclip ================== */ -void Cmd_Noclip_f( gentity_t *ent ) { +void Cmd_Noclip_f( gentity_t *ent ) +{ char *msg; - if ( !CheatsOk( ent ) ) { + if( !CheatsOk( ent ) ) return; - } - if ( ent->client->noclip ) { + if( ent->client->noclip ) msg = "noclip OFF\n"; - } else { + else msg = "noclip ON\n"; - } + ent->client->noclip = !ent->client->noclip; - trap_SendServerCommand( ent-g_entities, va("print \"%s\"", msg)); + trap_SendServerCommand( ent - g_entities, va( "print \"%s\"", msg ) ); } @@ -380,29 +299,9 @@ void Cmd_LevelShot_f( gentity_t *ent ) return; BeginIntermission( ); - trap_SendServerCommand( ent-g_entities, "clientLevelShot" ); + trap_SendServerCommand( ent - g_entities, "clientLevelShot" ); } - -void Cmd_TeamTask_f( gentity_t *ent ) { - char userinfo[MAX_INFO_STRING]; - char arg[MAX_TOKEN_CHARS]; - int task; - int client = ent->client - level.clients; - - if ( trap_Argc() != 2 ) { - return; - } - trap_Argv( 1, arg, sizeof( arg ) ); - task = atoi( arg ); - - trap_GetUserinfo(client, userinfo, sizeof(userinfo)); - Info_SetValueForKey(userinfo, "teamtask", va("%d", task)); - trap_SetUserinfo(client, userinfo); - ClientUserinfoChanged(client); -} - - /* ================= Cmd_Kill_f @@ -628,21 +527,11 @@ static void Cmd_Tell_f( gentity_t *ent ) Cmd_Where_f ================== */ -void Cmd_Where_f( gentity_t *ent ) { - trap_SendServerCommand( ent-g_entities, va("print \"%s\n\"", vtos( ent->s.origin ) ) ); +void Cmd_Where_f( gentity_t *ent ) +{ + trap_SendServerCommand( ent-g_entities, va( "print \"%s\n\"", vtos( ent->s.origin ) ) ); } -static const char *gameNames[] = { - "Free For All", - "Tournament", - "Single Player", - "Team Deathmatch", - "Capture the Flag", - "One Flag CTF", - "Overload", - "Harvester" -}; - /* ================== Cmd_CallVote_f @@ -1021,28 +910,34 @@ void Cmd_TeamVote_f( gentity_t *ent ) Cmd_SetViewpos_f ================= */ -void Cmd_SetViewpos_f( gentity_t *ent ) { - vec3_t origin, angles; - char buffer[MAX_TOKEN_CHARS]; +void Cmd_SetViewpos_f( gentity_t *ent ) +{ + vec3_t origin, angles; + char buffer[ MAX_TOKEN_CHARS ]; int i; - if ( !g_cheats.integer ) { - trap_SendServerCommand( ent-g_entities, va("print \"Cheats are not enabled on this server.\n\"")); + if( !g_cheats.integer ) + { + trap_SendServerCommand( ent-g_entities, va( "print \"Cheats are not enabled on this server.\n\"" ) ); return; } - if ( trap_Argc() != 5 ) { - trap_SendServerCommand( ent-g_entities, va("print \"usage: setviewpos x y z yaw\n\"")); + + if( trap_Argc( ) != 5 ) + { + trap_SendServerCommand( ent-g_entities, va( "print \"usage: setviewpos x y z yaw\n\"" ) ); return; } VectorClear( angles ); - for ( i = 0 ; i < 3 ; i++ ) { + + for( i = 0 ; i < 3 ; i++ ) + { trap_Argv( i + 1, buffer, sizeof( buffer ) ); - origin[i] = atof( buffer ); + origin[ i ] = atof( buffer ); } trap_Argv( 4, buffer, sizeof( buffer ) ); - angles[YAW] = atof( buffer ); + angles[ YAW ] = atof( buffer ); TeleportPlayer( ent, origin, angles ); } @@ -1638,17 +1533,6 @@ void Cmd_Sell_f( gentity_t *ent ) } } -/* -================= -Cmd_Statement_f -================= -*/ -void Cmd_Statement_f( gentity_t *ent ) -{ - trap_SendServerCommand( ent-g_entities, va("print \"Credits: %d\n\"", - ent->client->ps.persistant[ PERS_CREDIT ] ) ); -} - /* ================= Cmd_Deposit_f @@ -1951,8 +1835,11 @@ void Cmd_Spawnbody_f( gentity_t *ent ) return; AngleVectors( ent->client->ps.viewangles, forward, NULL, NULL ); + forward[ 2 ] = 0.0f; + VectorMA( ent->client->ps.origin, 128.0f, forward, dummy->r.currentOrigin ); - + dummy->r.currentOrigin[ 2 ] += 64.0f; + dummy->client->ps.stats[ STAT_PTEAM ] = PTE_HUMANS; dummy->client->ps.stats[ STAT_PCLASS ] = PCL_H_BASE; @@ -1963,8 +1850,16 @@ void Cmd_Spawnbody_f( gentity_t *ent ) G_FreeEntity( dummy ); } +/* +================= +Cmd_Test_f +================= +*/ void Cmd_Test_f( gentity_t *ent ) { + if( !CheatsOk( ent ) ) + return; + ent->client->ps.stats[ STAT_STATE ] |= SS_KNOCKEDOVER; ent->client->lastKnockedOverTime = level.time; G_AddPredictableEvent( ent, EV_KNOCKOVER, 0 ); @@ -1981,100 +1876,104 @@ void Cmd_Test_f( gentity_t *ent ) ClientCommand ================= */ -void ClientCommand( int clientNum ) { +void ClientCommand( int clientNum ) +{ gentity_t *ent; - char cmd[MAX_TOKEN_CHARS]; + char cmd[ MAX_TOKEN_CHARS ]; ent = g_entities + clientNum; - if ( !ent->client ) { + if( !ent->client ) return; // not fully in game yet - } trap_Argv( 0, cmd, sizeof( cmd ) ); - if (Q_stricmp (cmd, "say") == 0) { - Cmd_Say_f (ent, SAY_ALL, qfalse); + if( Q_stricmp( cmd, "say" ) == 0 ) + { + Cmd_Say_f( ent, SAY_ALL, qfalse ); return; } - if (Q_stricmp (cmd, "say_team") == 0) { - Cmd_Say_f (ent, SAY_TEAM, qfalse); + + if( Q_stricmp( cmd, "say_team" ) == 0 ) + { + Cmd_Say_f( ent, SAY_TEAM, qfalse ); return; } - if (Q_stricmp (cmd, "tell") == 0) { - Cmd_Tell_f ( ent ); + + if( Q_stricmp( cmd, "tell" ) == 0 ) + { + Cmd_Tell_f( ent ); return; } - if (Q_stricmp (cmd, "score") == 0) { - Cmd_Score_f (ent); + + if( Q_stricmp( cmd, "score" ) == 0 ) + { + Cmd_Score_f( ent ); return; } // ignore all other commands when at intermission - if (level.intermissiontime) { - Cmd_Say_f (ent, qfalse, qtrue); + if( level.intermissiontime ) + { + Cmd_Say_f( ent, qfalse, qtrue ); return; } - if (Q_stricmp (cmd, "give") == 0) - Cmd_Give_f (ent); - else if (Q_stricmp (cmd, "god") == 0) - Cmd_God_f (ent); - else if (Q_stricmp (cmd, "notarget") == 0) - Cmd_Notarget_f (ent); - else if (Q_stricmp (cmd, "noclip") == 0) - Cmd_Noclip_f (ent); - else if (Q_stricmp (cmd, "kill") == 0) - Cmd_Kill_f (ent); - else if (Q_stricmp (cmd, "teamtask") == 0) - Cmd_TeamTask_f (ent); - else if (Q_stricmp (cmd, "levelshot") == 0) - Cmd_LevelShot_f (ent); - else if (Q_stricmp (cmd, "team") == 0) - Cmd_Team_f (ent); - else if (Q_stricmp (cmd, "class") == 0) + if( Q_stricmp( cmd, "give" ) == 0 ) + Cmd_Give_f( ent ); + else if( Q_stricmp( cmd, "god" ) == 0 ) + Cmd_God_f( ent ); + else if( Q_stricmp( cmd, "notarget" ) == 0 ) + Cmd_Notarget_f( ent ); + else if( Q_stricmp( cmd, "noclip" ) == 0 ) + Cmd_Noclip_f( ent ); + else if( Q_stricmp( cmd, "kill" ) == 0 ) + Cmd_Kill_f( ent ); + else if( Q_stricmp( cmd, "levelshot" ) == 0 ) + Cmd_LevelShot_f( ent ); + else if( Q_stricmp( cmd, "team" ) == 0 ) + Cmd_Team_f( ent ); + else if( Q_stricmp( cmd, "class" ) == 0 ) Cmd_Class_f( ent ); - else if (Q_stricmp (cmd, "build") == 0) + else if( Q_stricmp( cmd, "build" ) == 0 ) Cmd_Build_f( ent ); - else if (Q_stricmp (cmd, "buy") == 0) + else if( Q_stricmp( cmd, "buy" ) == 0 ) Cmd_Buy_f( ent ); - else if (Q_stricmp (cmd, "sell") == 0) + else if( Q_stricmp( cmd, "sell" ) == 0 ) Cmd_Sell_f( ent ); - else if (Q_stricmp (cmd, "statement") == 0) - Cmd_Statement_f( ent ); - else if (Q_stricmp (cmd, "deposit") == 0) + else if( Q_stricmp( cmd, "deposit" ) == 0 ) Cmd_Deposit_f( ent ); - else if (Q_stricmp (cmd, "withdraw") == 0) + else if( Q_stricmp( cmd, "withdraw" ) == 0 ) Cmd_Withdraw_f( ent ); - else if (Q_stricmp (cmd, "itemact") == 0) + else if( Q_stricmp( cmd, "itemact" ) == 0 ) Cmd_ActivateItem_f( ent ); - else if (Q_stricmp (cmd, "itemdeact") == 0) + else if( Q_stricmp( cmd, "itemdeact" ) == 0 ) Cmd_DeActivateItem_f( ent ); - else if (Q_stricmp (cmd, "itemtoggle") == 0) + else if( Q_stricmp( cmd, "itemtoggle" ) == 0 ) Cmd_ToggleItem_f( ent ); - else if (Q_stricmp (cmd, "destroy") == 0) + else if( Q_stricmp( cmd, "destroy" ) == 0 ) Cmd_Destroy_f( ent, qfalse ); - else if (Q_stricmp (cmd, "deconstruct") == 0) + else if( Q_stricmp( cmd, "deconstruct" ) == 0 ) Cmd_Destroy_f( ent, qtrue ); - else if (Q_stricmp (cmd, "echo") == 0) + else if( Q_stricmp( cmd, "echo" ) == 0 ) Cmd_Echo_f( ent ); - else if (Q_stricmp (cmd, "boost") == 0) + else if( Q_stricmp( cmd, "boost" ) == 0 ) Cmd_Boost_f( ent ); - else if (Q_stricmp (cmd, "where") == 0) - Cmd_Where_f (ent); - else if (Q_stricmp (cmd, "callvote") == 0) - Cmd_CallVote_f (ent); - else if (Q_stricmp (cmd, "vote") == 0) - Cmd_Vote_f (ent); - else if (Q_stricmp (cmd, "callteamvote") == 0) - Cmd_CallTeamVote_f (ent); - else if (Q_stricmp (cmd, "teamvote") == 0) - Cmd_TeamVote_f (ent); - else if (Q_stricmp (cmd, "setviewpos") == 0) + else if( Q_stricmp( cmd, "where" ) == 0 ) + Cmd_Where_f( ent ); + else if( Q_stricmp( cmd, "callvote" ) == 0 ) + Cmd_CallVote_f( ent ); + else if( Q_stricmp( cmd, "vote" ) == 0 ) + Cmd_Vote_f( ent ); + else if( Q_stricmp( cmd, "callteamvote" ) == 0 ) + Cmd_CallTeamVote_f( ent ); + else if( Q_stricmp( cmd, "teamvote" ) == 0 ) + Cmd_TeamVote_f( ent ); + else if( Q_stricmp( cmd, "setviewpos" ) == 0 ) Cmd_SetViewpos_f( ent ); - else if (Q_stricmp (cmd, "spawnbody") == 0) + else if( Q_stricmp( cmd, "spawnbody" ) == 0 ) Cmd_Spawnbody_f( ent ); - else if (Q_stricmp (cmd, "test") == 0) + else if( Q_stricmp( cmd, "test" ) == 0 ) Cmd_Test_f( ent ); else - trap_SendServerCommand( clientNum, va("print \"unknown cmd %s\n\"", cmd ) ); + trap_SendServerCommand( clientNum, va( "print \"unknown cmd %s\n\"", cmd ) ); } diff --git a/src/game/g_combat.c b/src/game/g_combat.c index 0745b517..a394d29f 100644 --- a/src/game/g_combat.c +++ b/src/game/g_combat.c @@ -43,65 +43,31 @@ void AddScore( gentity_t *ent, int score ) CalculateRanks( ); } -/* -================= -TossClientItems - -Toss the weapon and powerups for the killed player -================= -*/ -void TossClientItems( gentity_t *self ) { - gitem_t *item; - int weapon; - float angle; - int i; - gentity_t *drop; - int ammo, clips, maxclips; - - // drop the weapon if not a gauntlet or machinegun - weapon = self->s.weapon; - - BG_unpackAmmoArray( weapon, self->client->ps.ammo, self->client->ps.powerups, &ammo, &clips, &maxclips ); - - // make a special check to see if they are changing to a new - // weapon that isn't the mg or gauntlet. Without this, a client - // can pick up a weapon, be killed, and not drop the weapon because - // their weapon change hasn't completed yet and they are still holding the MG. - if( weapon == WP_MACHINEGUN ) { - if ( self->client->ps.weaponstate == WEAPON_DROPPING ) { - weapon = self->client->pers.cmd.weapon; - } - if ( !BG_gotWeapon( weapon, self->client->ps.stats ) ) { - weapon = WP_NONE; - } - } -} - - /* ================== LookAtKiller ================== */ -void LookAtKiller( gentity_t *self, gentity_t *inflictor, gentity_t *attacker ) { +void LookAtKiller( gentity_t *self, gentity_t *inflictor, gentity_t *attacker ) +{ vec3_t dir; vec3_t angles; if ( attacker && attacker != self ) - VectorSubtract (attacker->s.pos.trBase, self->s.pos.trBase, dir); - else if ( inflictor && inflictor != self ) - VectorSubtract (inflictor->s.pos.trBase, self->s.pos.trBase, dir); + VectorSubtract( attacker->s.pos.trBase, self->s.pos.trBase, dir ); + else if( inflictor && inflictor != self ) + VectorSubtract( inflictor->s.pos.trBase, self->s.pos.trBase, dir ); else { - self->client->ps.generic1 = self->s.angles[YAW]; + self->client->ps.generic1 = self->s.angles[ YAW ]; return; } - self->client->ps.generic1 = vectoyaw ( dir ); + self->client->ps.generic1 = vectoyaw( dir ); - angles[YAW] = vectoyaw ( dir ); - angles[PITCH] = 0; - angles[ROLL] = 0; + angles[ YAW ] = vectoyaw( dir ); + angles[ PITCH ] = 0; + angles[ ROLL ] = 0; } /* @@ -126,12 +92,14 @@ void GibEntity( gentity_t *self, int killer ) body_die ================== */ -void body_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ) { - if ( self->health > GIB_HEALTH ) { +void body_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ) +{ + if( self->health > GIB_HEALTH ) return; - } - if ( !g_blood.integer ) { - self->health = GIB_HEALTH+1; + + if( !g_blood.integer ) + { + self->health = GIB_HEALTH + 1; return; } @@ -141,7 +109,8 @@ void body_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int d // these are just for logging, the client prints its own messages -char *modNames[] = { +char *modNames[ ] = +{ "MOD_UNKNOWN", "MOD_SHOTGUN", "MOD_GAUNTLET", @@ -380,44 +349,6 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int } -/* -================ -RaySphereIntersections -================ -*/ -int RaySphereIntersections( vec3_t origin, float radius, vec3_t point, vec3_t dir, vec3_t intersections[2] ) { - float b, c, d, t; - - // | origin - (point + t * dir) | = radius - // a = dir[0]^2 + dir[1]^2 + dir[2]^2; - // b = 2 * (dir[0] * (point[0] - origin[0]) + dir[1] * (point[1] - origin[1]) + dir[2] * (point[2] - origin[2])); - // c = (point[0] - origin[0])^2 + (point[1] - origin[1])^2 + (point[2] - origin[2])^2 - radius^2; - - // normalize dir so a = 1 - VectorNormalize(dir); - b = 2 * (dir[0] * (point[0] - origin[0]) + dir[1] * (point[1] - origin[1]) + dir[2] * (point[2] - origin[2])); - c = (point[0] - origin[0]) * (point[0] - origin[0]) + - (point[1] - origin[1]) * (point[1] - origin[1]) + - (point[2] - origin[2]) * (point[2] - origin[2]) - - radius * radius; - - d = b * b - 4 * c; - if (d > 0) { - t = (- b + sqrt(d)) / 2; - VectorMA(point, t, dir, intersections[0]); - t = (- b - sqrt(d)) / 2; - VectorMA(point, t, dir, intersections[1]); - return 2; - } - else if (d == 0) { - t = (- b ) / 2; - VectorMA(point, t, dir, intersections[0]); - return 1; - } - return 0; -} - - ////////TA: locdamage /* @@ -748,7 +679,7 @@ float G_CalcDamageModifier( vec3_t point, gentity_t *targ, gentity_t *attacker, G_InitDamageLocations ============ */ -void G_InitDamageLocations( ) +void G_InitDamageLocations( void ) { char *modelName; char filename[ MAX_QPATH ]; @@ -854,19 +785,19 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, int knockback; int max; - if(!targ->takedamage) + if( !targ->takedamage ) return; // the intermission has allready been qualified for, so don't // allow any extra scoring - if ( level.intermissionQueued ) + if( level.intermissionQueued ) return; if( !inflictor ) - inflictor = &g_entities[ENTITYNUM_WORLD]; + inflictor = &g_entities[ ENTITYNUM_WORLD ]; if( !attacker ) - attacker = &g_entities[ENTITYNUM_WORLD]; + attacker = &g_entities[ ENTITYNUM_WORLD ]; // shootable doors / buttons don't actually have any health if( targ->s.eType == ET_MOVER ) @@ -990,13 +921,14 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, if( client ) { if( attacker ) - client->ps.persistant[PERS_ATTACKER] = attacker->s.number; + client->ps.persistant[ PERS_ATTACKER ] = attacker->s.number; else - client->ps.persistant[PERS_ATTACKER] = ENTITYNUM_WORLD; + client->ps.persistant[ PERS_ATTACKER ] = ENTITYNUM_WORLD; client->damage_armor += asave; client->damage_blood += take; client->damage_knockback += knockback; + if( dir ) { VectorCopy ( dir, client->damage_from ); @@ -1046,11 +978,11 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, targ->health = -999; targ->enemy = attacker; - targ->die (targ, inflictor, attacker, take, mod); + targ->die( targ, inflictor, attacker, take, mod ); return; } else if( targ->pain ) - targ->pain (targ, attacker, take); + targ->pain( targ, attacker, take ); } } @@ -1063,52 +995,52 @@ Returns qtrue if the inflictor can directly damage the target. Used for explosions and melee attacks. ============ */ -qboolean CanDamage (gentity_t *targ, vec3_t origin) { +qboolean CanDamage( gentity_t *targ, vec3_t origin ) +{ vec3_t dest; trace_t tr; vec3_t midpoint; // use the midpoint of the bounds instead of the origin, because // bmodels may have their origin is 0,0,0 - VectorAdd (targ->r.absmin, targ->r.absmax, midpoint); - VectorScale (midpoint, 0.5, midpoint); + VectorAdd( targ->r.absmin, targ->r.absmax, midpoint ); + VectorScale( midpoint, 0.5, midpoint ); - VectorCopy (midpoint, dest); - trap_Trace ( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID); - if (tr.fraction == 1.0 || tr.entityNum == targ->s.number) + VectorCopy( midpoint, dest ); + trap_Trace( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID ); + if( tr.fraction == 1.0 || tr.entityNum == targ->s.number ) return qtrue; // this should probably check in the plane of projection, // rather than in world coordinate, and also include Z - VectorCopy (midpoint, dest); - dest[0] += 15.0; - dest[1] += 15.0; - trap_Trace ( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID); - if (tr.fraction == 1.0) + VectorCopy( midpoint, dest ); + dest[ 0 ] += 15.0; + dest[ 1 ] += 15.0; + trap_Trace( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID ); + if( tr.fraction == 1.0 ) return qtrue; - VectorCopy (midpoint, dest); - dest[0] += 15.0; - dest[1] -= 15.0; - trap_Trace ( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID); - if (tr.fraction == 1.0) + VectorCopy( midpoint, dest ); + dest[ 0 ] += 15.0; + dest[ 1 ] -= 15.0; + trap_Trace( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID ); + if( tr.fraction == 1.0 ) return qtrue; - VectorCopy (midpoint, dest); - dest[0] -= 15.0; - dest[1] += 15.0; - trap_Trace ( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID); - if (tr.fraction == 1.0) + VectorCopy( midpoint, dest ); + dest[ 0 ] -= 15.0; + dest[ 1 ] += 15.0; + trap_Trace( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID ); + if( tr.fraction == 1.0 ) return qtrue; - VectorCopy (midpoint, dest); - dest[0] -= 15.0; - dest[1] -= 15.0; - trap_Trace ( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID); - if (tr.fraction == 1.0) + VectorCopy( midpoint, dest ); + dest[ 0 ] -= 15.0; + dest[ 1 ] -= 15.0; + trap_Trace( &tr, origin, vec3_origin, vec3_origin, dest, ENTITYNUM_NONE, MASK_SOLID ); + if( tr.fraction == 1.0 ) return qtrue; - return qfalse; } @@ -1116,64 +1048,67 @@ qboolean CanDamage (gentity_t *targ, vec3_t origin) { //TA: /* ============ -G_RadiusDamage +G_SelectiveRadiusDamage ============ */ -qboolean G_SelectiveRadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, float radius, - gentity_t *ignore, int mod, int team ) { - float points, dist; +qboolean G_SelectiveRadiusDamage( vec3_t origin, gentity_t *attacker, float damage, + float radius, gentity_t *ignore, int mod, int team ) +{ + float points, dist; gentity_t *ent; - int entityList[MAX_GENTITIES]; - int numListedEntities; + int entityList[ MAX_GENTITIES ]; + int numListedEntities; vec3_t mins, maxs; vec3_t v; vec3_t dir; - int i, e; + int i, e; qboolean hitClient = qfalse; - if ( radius < 1 ) { + if( radius < 1 ) radius = 1; - } - for ( i = 0 ; i < 3 ; i++ ) { - mins[i] = origin[i] - radius; - maxs[i] = origin[i] + radius; + for( i = 0; i < 3; i++ ) + { + mins[ i ] = origin[ i ] - radius; + maxs[ i ] = origin[ i ] + radius; } numListedEntities = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for ( e = 0 ; e < numListedEntities ; e++ ) { - ent = &g_entities[entityList[ e ]]; + for( e = 0; e < numListedEntities; e++ ) + { + ent = &g_entities[ entityList[ e ] ]; - if (ent == ignore) + if( ent == ignore ) continue; - if (!ent->takedamage) + + if( !ent->takedamage ) continue; // find the distance from the edge of the bounding box - for ( i = 0 ; i < 3 ; i++ ) { - if ( origin[i] < ent->r.absmin[i] ) { - v[i] = ent->r.absmin[i] - origin[i]; - } else if ( origin[i] > ent->r.absmax[i] ) { - v[i] = origin[i] - ent->r.absmax[i]; - } else { - v[i] = 0; - } + for( i = 0 ; i < 3 ; i++ ) + { + if( origin[ i ] < ent->r.absmin[ i ] ) + v[ i ] = ent->r.absmin[ i ] - origin[ i ]; + else if( origin[ i ] > ent->r.absmax[ i ] ) + v[ i ] = origin[ i ] - ent->r.absmax[ i ]; + else + v[ i ] = 0; } dist = VectorLength( v ); - if ( dist >= radius ) { + if( dist >= radius ) continue; - } points = damage * ( 1.0 - dist / radius ); - if( CanDamage (ent, origin) ) { - VectorSubtract (ent->r.currentOrigin, origin, dir); + if( CanDamage( ent, origin ) ) + { + VectorSubtract( ent->r.currentOrigin, origin, dir ); // push the center of mass higher than the origin so players // get knocked into the air more - dir[2] += 24; - G_SelectiveDamage (ent, NULL, attacker, dir, origin, (int)points, DAMAGE_RADIUS, mod, team ); + dir[ 2 ] += 24; + G_SelectiveDamage( ent, NULL, attacker, dir, origin, (int)points, DAMAGE_RADIUS, mod, team ); } } @@ -1186,61 +1121,64 @@ qboolean G_SelectiveRadiusDamage ( vec3_t origin, gentity_t *attacker, float dam G_RadiusDamage ============ */ -qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, float radius, - gentity_t *ignore, int mod) { - float points, dist; +qboolean G_RadiusDamage( vec3_t origin, gentity_t *attacker, float damage, + float radius, gentity_t *ignore, int mod ) +{ + float points, dist; gentity_t *ent; - int entityList[MAX_GENTITIES]; - int numListedEntities; + int entityList[ MAX_GENTITIES ]; + int numListedEntities; vec3_t mins, maxs; vec3_t v; vec3_t dir; - int i, e; + int i, e; qboolean hitClient = qfalse; - if ( radius < 1 ) { + if( radius < 1 ) radius = 1; - } - for ( i = 0 ; i < 3 ; i++ ) { - mins[i] = origin[i] - radius; - maxs[i] = origin[i] + radius; + for( i = 0; i < 3; i++ ) + { + mins[ i ] = origin[ i ] - radius; + maxs[ i ] = origin[ i ] + radius; } numListedEntities = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); - for ( e = 0 ; e < numListedEntities ; e++ ) { - ent = &g_entities[entityList[ e ]]; + for( e = 0; e < numListedEntities; e++ ) + { + ent = &g_entities[ entityList[ e ] ]; - if (ent == ignore) + if( ent == ignore ) continue; - if (!ent->takedamage) + + if( !ent->takedamage ) continue; // find the distance from the edge of the bounding box - for ( i = 0 ; i < 3 ; i++ ) { - if ( origin[i] < ent->r.absmin[i] ) { - v[i] = ent->r.absmin[i] - origin[i]; - } else if ( origin[i] > ent->r.absmax[i] ) { - v[i] = origin[i] - ent->r.absmax[i]; - } else { - v[i] = 0; - } + for( i = 0; i < 3; i++ ) + { + if( origin[ i ] < ent->r.absmin[ i ] ) + v[ i ] = ent->r.absmin[ i ] - origin[ i ]; + else if( origin[ i ] > ent->r.absmax[ i ] ) + v[ i ] = origin[ i ] - ent->r.absmax[ i ]; + else + v[ i ] = 0; } dist = VectorLength( v ); - if ( dist >= radius ) { + if( dist >= radius ) continue; - } points = damage * ( 1.0 - dist / radius ); - if( CanDamage (ent, origin) ) { - VectorSubtract (ent->r.currentOrigin, origin, dir); + if( CanDamage( ent, origin ) ) + { + VectorSubtract( ent->r.currentOrigin, origin, dir ); // push the center of mass higher than the origin so players // get knocked into the air more - dir[2] += 24; - G_Damage (ent, NULL, attacker, dir, origin, (int)points, DAMAGE_RADIUS, mod); + dir[ 2 ] += 24; + G_Damage( ent, NULL, attacker, dir, origin, (int)points, DAMAGE_RADIUS, mod ); } } diff --git a/src/game/g_local.h b/src/game/g_local.h index 574cd822..e37bdd57 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -44,7 +44,8 @@ #define FL_FORCE_GESTURE 0x00008000 // spawn point just for bots // movers are things like doors, plats, buttons, etc -typedef enum { +typedef enum +{ MOVER_POS1, MOVER_POS2, MOVER_1TO2, @@ -58,146 +59,149 @@ typedef enum { typedef struct gentity_s gentity_t; typedef struct gclient_s gclient_t; -struct gentity_s { - entityState_t s; // communicated by server to clients - entityShared_t r; // shared by both the server system and game +struct gentity_s +{ + entityState_t s; // communicated by server to clients + entityShared_t r; // shared by both the server system and game // DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER // EXPECTS THE FIELDS IN THAT ORDER! //================================ - struct gclient_s *client; // NULL if not a client + struct gclient_s *client; // NULL if not a client - qboolean inuse; + qboolean inuse; - char *classname; // set in QuakeEd - int spawnflags; // set in QuakeEd + char *classname; // set in QuakeEd + int spawnflags; // set in QuakeEd - qboolean neverFree; // if true, FreeEntity will only unlink - // bodyque uses this + qboolean neverFree; // if true, FreeEntity will only unlink + // bodyque uses this - int flags; // FL_* variables + int flags; // FL_* variables - char *model; - char *model2; - int freetime; // level.time when the object was freed + char *model; + char *model2; + int freetime; // level.time when the object was freed - int eventTime; // events will be cleared EVENT_VALID_MSEC after set - qboolean freeAfterEvent; - qboolean unlinkAfterEvent; + int eventTime; // events will be cleared EVENT_VALID_MSEC after set + qboolean freeAfterEvent; + qboolean unlinkAfterEvent; - qboolean physicsObject; // if true, it can be pushed by movers and fall off edges - // all game items are physicsObjects, - float physicsBounce; // 1.0 = continuous bounce, 0.0 = no bounce - int clipmask; // brushes with this content value will be collided against - // when moving. items and corpses do not collide against - // players, for instance + qboolean physicsObject; // if true, it can be pushed by movers and fall off edges + // all game items are physicsObjects, + float physicsBounce; // 1.0 = continuous bounce, 0.0 = no bounce + int clipmask; // brushes with this content value will be collided against + // when moving. items and corpses do not collide against + // players, for instance // movers - moverState_t moverState; - int soundPos1; - int sound1to2; - int sound2to1; - int soundPos2; - int soundLoop; - gentity_t *parent; - gentity_t *nextTrain; - gentity_t *prevTrain; - vec3_t pos1, pos2; - - char *message; - - int timestamp; // body queue sinking, etc - - float angle; // set in editor, -1 = up, -2 = down - char *target; - char *targetname; - char *team; - char *targetShaderName; - char *targetShaderNewName; - gentity_t *target_ent; - - float speed; - vec3_t movedir; + moverState_t moverState; + int soundPos1; + int sound1to2; + int sound2to1; + int soundPos2; + int soundLoop; + gentity_t *parent; + gentity_t *nextTrain; + gentity_t *prevTrain; + vec3_t pos1, pos2; + + char *message; + + int timestamp; // body queue sinking, etc + + float angle; // set in editor, -1 = up, -2 = down + char *target; + char *targetname; + char *team; + char *targetShaderName; + char *targetShaderNewName; + gentity_t *target_ent; + + float speed; + vec3_t movedir; //TA: acceleration evaluation - qboolean evaluateAcceleration; - vec3_t oldVelocity; - vec3_t acceleration; - vec3_t oldAccel; - vec3_t jerk; + qboolean evaluateAcceleration; + vec3_t oldVelocity; + vec3_t acceleration; + vec3_t oldAccel; + vec3_t jerk; - int nextthink; - void (*think)(gentity_t *self); - void (*reached)(gentity_t *self); // movers call this when hitting endpoint - void (*blocked)(gentity_t *self, gentity_t *other); - void (*touch)(gentity_t *self, gentity_t *other, trace_t *trace); - void (*use)(gentity_t *self, gentity_t *other, gentity_t *activator); - void (*pain)(gentity_t *self, gentity_t *attacker, int damage); - void (*die)(gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod); + int nextthink; + void (*think)( gentity_t *self ); + void (*reached)( gentity_t *self ); // movers call this when hitting endpoint + void (*blocked)( gentity_t *self, gentity_t *other ); + void (*touch)( gentity_t *self, gentity_t *other, trace_t *trace ); + void (*use)( gentity_t *self, gentity_t *other, gentity_t *activator ); + void (*pain)( gentity_t *self, gentity_t *attacker, int damage ); + void (*die)( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod ); - int pain_debounce_time; - int fly_sound_debounce_time; // wind tunnel - int last_move_time; + int pain_debounce_time; + int fly_sound_debounce_time; // wind tunnel + int last_move_time; - int health; + int health; - qboolean takedamage; + qboolean takedamage; - int damage; - int splashDamage; // quad will increase this without increasing radius - int splashRadius; - int methodOfDeath; - int splashMethodOfDeath; + int damage; + int splashDamage; // quad will increase this without increasing radius + int splashRadius; + int methodOfDeath; + int splashMethodOfDeath; - int count; + int count; - gentity_t *chain; - gentity_t *enemy; - gentity_t *activator; - gentity_t *teamchain; // next entity in team - gentity_t *teammaster; // master of the team + gentity_t *chain; + gentity_t *enemy; + gentity_t *activator; + gentity_t *teamchain; // next entity in team + gentity_t *teammaster; // master of the team - int watertype; - int waterlevel; + int watertype; + int waterlevel; - int noise_index; + int noise_index; // timing variables - float wait; - float random; + float wait; + float random; - gitem_t *item; // for bonus items + gitem_t *item; // for bonus items - int biteam; //TA: buildable item team - gentity_t *parentNode; //TA: for creep and defence/spawn dependencies - qboolean active; //TA: for power repeater, but could be useful elsewhere - qboolean powered; //TA: for human buildables - int builtBy; //TA: clientNum of person that built this - gentity_t *dccNode; //TA: controlling dcc - qboolean dcced; //TA: controlled by a dcc or not? - int time1000; //TA: timer evaluated every second + int biteam; //TA: buildable item team + gentity_t *parentNode; //TA: for creep and defence/spawn dependencies + qboolean active; //TA: for power repeater, but could be useful elsewhere + qboolean powered; //TA: for human buildables + int builtBy; //TA: clientNum of person that built this + gentity_t *dccNode; //TA: controlling dcc + qboolean dcced; //TA: controlled by a dcc or not? + int time1000; //TA: timer evaluated every second - int credits[ MAX_CLIENTS ]; //TA: human credits for each client - qboolean creditsHash[ MAX_CLIENTS ]; //TA: track who has claimed credit - int killedBy; //TA: clientNum of killer + int credits[ MAX_CLIENTS ]; //TA: human credits for each client + qboolean creditsHash[ MAX_CLIENTS ]; //TA: track who has claimed credit + int killedBy; //TA: clientNum of killer - gentity_t *targeted; //TA: true if the player is currently a valid target of a turret + gentity_t *targeted; //TA: true if the player is currently a valid target of a turret - vec4_t animation; //TA: animated map objects + vec4_t animation; //TA: animated map objects - vec3_t turretAim; //TA: aim vector for turrets + vec3_t turretAim; //TA: aim vector for turrets - gentity_t *builder; //TA: occupant of this hovel + gentity_t *builder; //TA: occupant of this hovel }; -typedef enum { +typedef enum +{ CON_DISCONNECTED, CON_CONNECTING, CON_CONNECTED } clientConnected_t; -typedef enum { +typedef enum +{ SPECTATOR_NOT, SPECTATOR_FREE, SPECTATOR_LOCKED, @@ -205,12 +209,14 @@ typedef enum { SPECTATOR_SCOREBOARD } spectatorState_t; -typedef enum { +typedef enum +{ TEAM_BEGIN, // Beginning a team game, spawn at base TEAM_ACTIVE // Now actively playing } playerTeamStateState_t; -typedef struct { +typedef struct +{ playerTeamStateState_t state; int location; @@ -237,13 +243,14 @@ typedef struct { // this is achieved by writing all the data to cvar strings at game shutdown // time and reading them back at connection time. Anything added here // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() -typedef struct { - team_t sessionTeam; - int spectatorTime; // for determining next-in-line to play +typedef struct +{ + team_t sessionTeam; + int spectatorTime; // for determining next-in-line to play spectatorState_t spectatorState; - int spectatorClient; // for chasecam and follow mode - int wins, losses; // tournament stats - qboolean teamLeader; // true when this client is a team leader + int spectatorClient; // for chasecam and follow mode + int wins, losses; // tournament stats + qboolean teamLeader; // true when this client is a team leader } clientSession_t; #define MAX_NETNAME 36 @@ -251,110 +258,112 @@ typedef struct { // client data that stays across multiple respawns, but is cleared // on each level change or team change at ClientBegin() -typedef struct { +typedef struct +{ clientConnected_t connected; - usercmd_t cmd; // we would lose angles if not persistant - qboolean localClient; // true if "ip" info key is "localhost" - qboolean initialSpawn; // the first spawn should be at a cool location - qboolean predictItemPickup; // based on cg_predictItems userinfo - qboolean pmoveFixed; // - char netname[ MAX_NETNAME ]; - int maxHealth; // for handicapping - int enterTime; // level.time the client entered the game - playerTeamState_t teamState; // status in teamplay games - int voteCount; // to prevent people from constantly calling votes - int teamVoteCount; // to prevent people from constantly calling votes - qboolean teamInfo; // send team overlay updates? - - int pclass; //TA: player class (copied to ent->client->ps.stats[ STAT_PCLASS ] once spawned) - //not really persistant.. this is just a nice place to stick it :) - int pitem; //TA: humans have a starting item - int pteam; //TA: player team (copied to ps.stats[ STAT_PTEAM ]) + usercmd_t cmd; // we would lose angles if not persistant + qboolean localClient; // true if "ip" info key is "localhost" + qboolean initialSpawn; // the first spawn should be at a cool location + qboolean predictItemPickup; // based on cg_predictItems userinfo + qboolean pmoveFixed; // + char netname[ MAX_NETNAME ]; + int maxHealth; // for handicapping + int enterTime; // level.time the client entered the game + playerTeamState_t teamState; // status in teamplay games + int voteCount; // to prevent people from constantly calling votes + int teamVoteCount; // to prevent people from constantly calling votes + qboolean teamInfo; // send team overlay updates? + + int pclass; //TA: player class (copied to ent->client->ps.stats[ STAT_PCLASS ] once spawned) + //not really persistant.. this is just a nice place to stick it :) + int pitem; //TA: humans have a starting item + int pteam; //TA: player team (copied to ps.stats[ STAT_PTEAM ]) } clientPersistant_t; // this structure is cleared on each ClientSpawn(), // except for 'client->pers' and 'client->sess' -struct gclient_s { +struct gclient_s +{ // ps MUST be the first element, because the server expects it - playerState_t ps; // communicated by server to clients + playerState_t ps; // communicated by server to clients // the rest of the structure is private to game clientPersistant_t pers; - clientSession_t sess; + clientSession_t sess; - qboolean readyToExit; // wishes to leave the intermission + qboolean readyToExit; // wishes to leave the intermission - qboolean noclip; + qboolean noclip; - int lastCmdTime; // level.time of last usercmd_t, for EF_CONNECTION - // we can't just use pers.lastCommand.time, because - // of the g_sycronousclients case - int buttons; - int oldbuttons; - int latched_buttons; + int lastCmdTime; // level.time of last usercmd_t, for EF_CONNECTION + // we can't just use pers.lastCommand.time, because + // of the g_sycronousclients case + int buttons; + int oldbuttons; + int latched_buttons; - vec3_t oldOrigin; + vec3_t oldOrigin; // sum up damage over an entire frame, so // shotgun blasts give a single big kick - int damage_armor; // damage absorbed by armor - int damage_blood; // damage taken out of health - int damage_knockback; // impact damage - vec3_t damage_from; // origin for vector calculation - qboolean damage_fromWorld; // if true, don't use the damage_from vector - - int accurateCount; // for "impressive" reward sound - int accuracy_shots; // total number of shots - int accuracy_hits; // total number of hits + int damage_armor; // damage absorbed by armor + int damage_blood; // damage taken out of health + int damage_knockback; // impact damage + vec3_t damage_from; // origin for vector calculation + qboolean damage_fromWorld; // if true, don't use the damage_from vector + + int accurateCount; // for "impressive" reward sound + int accuracy_shots; // total number of shots + int accuracy_hits; // total number of hits // - int lastkilled_client; // last client that this client killed - int lasthurt_client; // last client that damaged this client - int lasthurt_mod; // type of damage the client did + int lastkilled_client;// last client that this client killed + int lasthurt_client; // last client that damaged this client + int lasthurt_mod; // type of damage the client did // timers - int respawnTime; // can respawn when time > this, force after g_forcerespwan - int inactivityTime; // kick players when time > this - qboolean inactivityWarning; // qtrue if the five seoond warning has been given - int rewardTime; // clear the EF_AWARD_IMPRESSIVE, etc when time > this + int respawnTime; // can respawn when time > this, force after g_forcerespwan + int inactivityTime; // kick players when time > this + qboolean inactivityWarning;// qtrue if the five seoond warning has been given + int rewardTime; // clear the EF_AWARD_IMPRESSIVE, etc when time > this - int airOutTime; + int airOutTime; - int lastKillTime; // for multiple kill rewards + int lastKillTime; // for multiple kill rewards - qboolean fireHeld; // used for hook - qboolean fire2Held; // used for alt fire - gentity_t *hook; // grapple hook if out + qboolean fireHeld; // used for hook + qboolean fire2Held; // used for alt fire + gentity_t *hook; // grapple hook if out - int switchTeamTime; // time the player switched teams + int switchTeamTime; // time the player switched teams // timeResidual is used to handle events that happen every second // like health / armor countdowns and regeneration //TA: two timers, one every 100 msecs, another every sec - int time100; - int time1000; + int time100; + int time1000; - char *areabits; + char *areabits; - int lastInfestTime; //TA: to keep track of how long infests take - gentity_t *infestBody; //TA: body that is being infested. must be persistant + int lastInfestTime; //TA: to keep track of how long infests take + gentity_t *infestBody; //TA: body that is being infested. must be persistant - int lastPoisonTime; - int lastPoisonCloudedTime; - int lastGrabTime; - int lastLockTime; - int lastSlowTime; - int lastBoostedTime; - int lastKnockedOverTime; - int lastGetUpTime; + int lastPoisonTime; + int lastPoisonCloudedTime; + int lastGrabTime; + int lastLockTime; + int lastSlowTime; + int lastBoostedTime; + int lastKnockedOverTime; + int lastGetUpTime; - int pouncePayload; //TA: amount of damage pounce attack will do - qboolean allowedToPounce; + int pouncePayload; //TA: amount of damage pounce attack will do + qboolean allowedToPounce; - vec3_t hovelOrigin; //TA: player origin before entering hovel + vec3_t hovelOrigin; //TA: player origin before entering hovel - int lastFlameBall; //TA: s.number of the last flame ball fired + int lastFlameBall; //TA: s.number of the last flame ball fired - int lastRefilTime; //TA: last time human got a refil from rpt/rctr + int lastRefilTime; //TA: last time human got a refil from rpt/rctr }; #define MAX_LOCDAMAGE_TEXT 8192 @@ -391,102 +400,103 @@ typedef struct armourRegion_s #define MAX_SPAWN_VARS 64 #define MAX_SPAWN_VARS_CHARS 4096 -typedef struct { +typedef struct +{ struct gclient_s *clients; // [maxclients] struct gentity_s *gentities; - int gentitySize; - int num_entities; // current number, <= MAX_GENTITIES + int gentitySize; + int num_entities; // current number, <= MAX_GENTITIES - int warmupTime; // restart match at this time + int warmupTime; // restart match at this time - fileHandle_t logFile; + fileHandle_t logFile; // store latched cvars here that we want to get at often - int maxclients; + int maxclients; - int framenum; - int time; // in msec - int previousTime; // so movers can back up when blocked + int framenum; + int time; // in msec + int previousTime; // so movers can back up when blocked - int startTime; // level.time the map was started + int startTime; // level.time the map was started - int teamScores[TEAM_NUM_TEAMS]; - int lastTeamLocationTime; // last time of client team location update + int teamScores[ TEAM_NUM_TEAMS ]; + int lastTeamLocationTime; // last time of client team location update - qboolean newSession; // don't use any old session data, because - // we changed gametype + qboolean newSession; // don't use any old session data, because + // we changed gametype - qboolean restarted; // waiting for a map_restart to fire + qboolean restarted; // waiting for a map_restart to fire - int numConnectedClients; - int numNonSpectatorClients; // includes connecting clients - int numPlayingClients; // connected, non-spectators - int sortedClients[MAX_CLIENTS]; // sorted by score - int follow1, follow2; // clientNums for auto-follow spectators + int numConnectedClients; + int numNonSpectatorClients; // includes connecting clients + int numPlayingClients; // connected, non-spectators + int sortedClients[MAX_CLIENTS]; // sorted by score + int follow1, follow2; // clientNums for auto-follow spectators - int snd_fry; // sound index for standing in lava + int snd_fry; // sound index for standing in lava - int warmupModificationCount; // for detecting if g_warmup is changed + int warmupModificationCount; // for detecting if g_warmup is changed // voting state - char voteString[MAX_STRING_CHARS]; - char voteDisplayString[MAX_STRING_CHARS]; - int voteTime; // level.time vote was called - int voteExecuteTime; // time the vote is executed - int voteYes; - int voteNo; - int numVotingClients; // set by CalculateRanks + char voteString[MAX_STRING_CHARS]; + char voteDisplayString[MAX_STRING_CHARS]; + int voteTime; // level.time vote was called + int voteExecuteTime; // time the vote is executed + int voteYes; + int voteNo; + int numVotingClients; // set by CalculateRanks // team voting state - char teamVoteString[2][MAX_STRING_CHARS]; - int teamVoteTime[2]; // level.time vote was called - int teamVoteYes[2]; - int teamVoteNo[2]; - int numteamVotingClients[2];// set by CalculateRanks + char teamVoteString[ 2 ][ MAX_STRING_CHARS ]; + int teamVoteTime[ 2 ]; // level.time vote was called + int teamVoteYes[ 2 ]; + int teamVoteNo[ 2 ]; + int numteamVotingClients[ 2 ]; // set by CalculateRanks // spawn variables - qboolean spawning; // the G_Spawn*() functions are valid - int numSpawnVars; - char *spawnVars[MAX_SPAWN_VARS][2]; // key / value pairs - int numSpawnVarChars; - char spawnVarChars[MAX_SPAWN_VARS_CHARS]; + qboolean spawning; // the G_Spawn*() functions are valid + int numSpawnVars; + char *spawnVars[ MAX_SPAWN_VARS ][ 2 ]; // key / value pairs + int numSpawnVarChars; + char spawnVarChars[ MAX_SPAWN_VARS_CHARS ]; // intermission state - int intermissionQueued; // intermission was qualified, but - // wait INTERMISSION_DELAY_TIME before - // actually going there so the last - // frag can be watched. Disable future - // kills during this delay - int intermissiontime; // time the intermission was started - char *changemap; - qboolean readyToExit; // at least one client wants to exit - int exitTime; - vec3_t intermission_origin; // also used for spectator spawns - vec3_t intermission_angle; - - qboolean locationLinked; // target_locations get linked - gentity_t *locationHead; // head of the location list + int intermissionQueued; // intermission was qualified, but + // wait INTERMISSION_DELAY_TIME before + // actually going there so the last + // frag can be watched. Disable future + // kills during this delay + int intermissiontime; // time the intermission was started + char *changemap; + qboolean readyToExit; // at least one client wants to exit + int exitTime; + vec3_t intermission_origin; // also used for spectator spawns + vec3_t intermission_angle; + + qboolean locationLinked; // target_locations get linked + gentity_t *locationHead; // head of the location list //TA: extra stuff: - int numAlienSpawns; - int numHumanSpawns; + int numAlienSpawns; + int numHumanSpawns; - int numAlienClients; - int numHumanClients; + int numAlienClients; + int numHumanClients; - int numLiveAlienClients; - int numLiveHumanClients; + int numLiveAlienClients; + int numLiveHumanClients; - int alienBuildPoints; - int humanBuildPoints; - int humanBuildPointsPowered; + int alienBuildPoints; + int humanBuildPoints; + int humanBuildPointsPowered; - int bankCredits[ MAX_CLIENTS ]; //global credits storage - int oBankCredits[ MAX_CLIENTS ]; //global credits storage + int bankCredits[ MAX_CLIENTS ]; //global credits storage + int oBankCredits[ MAX_CLIENTS ]; //global credits storage - int alienKills; - int humanKills; + int alienKills; + int humanKills; } level_locals_t; // @@ -497,8 +507,8 @@ qboolean G_SpawnString( const char *key, const char *defaultString, char **out qboolean G_SpawnFloat( const char *key, const char *defaultString, float *out ); qboolean G_SpawnInt( const char *key, const char *defaultString, int *out ); qboolean G_SpawnVector( const char *key, const char *defaultString, float *out ); -void G_SpawnEntitiesFromString( void ); -char *G_NewString( const char *string ); +void G_SpawnEntitiesFromString( void ); +char *G_NewString( const char *string ); // // g_cmds.c @@ -549,49 +559,53 @@ void FinishSpawningBuildable( gentity_t *ent ); // // g_utils.c // -int G_ModelIndex( char *name ); -int G_SoundIndex( char *name ); -void G_TeamCommand( pTeam_t team, char *cmd ); -void G_KillBox (gentity_t *ent); -gentity_t *G_Find (gentity_t *from, int fieldofs, const char *match); -gentity_t *G_PickTarget (char *targetname); -void G_UseTargets (gentity_t *ent, gentity_t *activator); -void G_SetMovedir ( vec3_t angles, vec3_t movedir); - -void G_InitGentity( gentity_t *e ); -gentity_t *G_Spawn (void); -gentity_t *G_TempEntity( vec3_t origin, int event ); -void G_Sound( gentity_t *ent, int channel, int soundIndex ); -void G_FreeEntity( gentity_t *e ); -qboolean G_EntitiesFree( void ); - -void G_TouchTriggers (gentity_t *ent); -void G_TouchSolids (gentity_t *ent); - -float *tv (float x, float y, float z); -char *vtos( const vec3_t v ); - -float vectoyaw( const vec3_t vec ); - -void G_AddPredictableEvent( gentity_t *ent, int event, int eventParm ); -void G_AddEvent( gentity_t *ent, int event, int eventParm ); -void G_SetOrigin( gentity_t *ent, vec3_t origin ); -void AddRemap(const char *oldShader, const char *newShader, float timeOffset); -const char *BuildShaderStateConfig(); +int G_ModelIndex( char *name ); +int G_SoundIndex( char *name ); +void G_TeamCommand( pTeam_t team, char *cmd ); +void G_KillBox (gentity_t *ent); +gentity_t *G_Find (gentity_t *from, int fieldofs, const char *match); +gentity_t *G_PickTarget (char *targetname); +void G_UseTargets (gentity_t *ent, gentity_t *activator); +void G_SetMovedir ( vec3_t angles, vec3_t movedir); + +void G_InitGentity( gentity_t *e ); +gentity_t *G_Spawn( void ); +gentity_t *G_TempEntity( vec3_t origin, int event ); +void G_Sound( gentity_t *ent, int channel, int soundIndex ); +void G_FreeEntity( gentity_t *e ); +qboolean G_EntitiesFree( void ); + +void G_TouchTriggers( gentity_t *ent ); +void G_TouchSolids( gentity_t *ent ); + +float *tv( float x, float y, float z ); +char *vtos( const vec3_t v ); + +float vectoyaw( const vec3_t vec ); + +void G_AddPredictableEvent( gentity_t *ent, int event, int eventParm ); +void G_AddEvent( gentity_t *ent, int event, int eventParm ); +void G_SetOrigin( gentity_t *ent, vec3_t origin ); +void AddRemap(const char *oldShader, const char *newShader, float timeOffset); +const char *BuildShaderStateConfig(); // // g_combat.c // -qboolean CanDamage (gentity_t *targ, vec3_t origin); -void G_Damage (gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir, vec3_t point, int damage, int dflags, int mod); -void G_SelectiveDamage (gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir, vec3_t point, int damage, int dflags, int mod, int team); -qboolean G_RadiusDamage (vec3_t origin, gentity_t *attacker, float damage, float radius, gentity_t *ignore, int mod); -qboolean G_SelectiveRadiusDamage (vec3_t origin, gentity_t *attacker, float damage, float radius, gentity_t *ignore, int mod, int team ); -void body_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ); -void TossClientItems( gentity_t *self ); +qboolean CanDamage( gentity_t *targ, vec3_t origin ); +void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, + vec3_t dir, vec3_t point, int damage, int dflags, int mod ); +void G_SelectiveDamage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir, + vec3_t point, int damage, int dflags, int mod, int team ); +qboolean G_RadiusDamage( vec3_t origin, gentity_t *attacker, float damage, float radius, + gentity_t *ignore, int mod ); +qboolean G_SelectiveRadiusDamage( vec3_t origin, gentity_t *attacker, float damage, float radius, + gentity_t *ignore, int mod, int team ); +void body_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ); +void AddScore( gentity_t *ent, int score ); //TA: -void G_InitDamageLocations( ); +void G_InitDamageLocations( void ); // damage flags #define DAMAGE_RADIUS 0x00000001 // damage was indirect @@ -602,20 +616,15 @@ void G_InitDamageLocations( ); // // g_missile.c // -void G_RunMissile( gentity_t *ent ); +void G_RunMissile( gentity_t *ent ); -gentity_t *fire_blaster( gentity_t *self, vec3_t start, vec3_t aimdir ); gentity_t *fire_flamer( gentity_t *self, vec3_t start, vec3_t aimdir ); gentity_t *fire_plasma( gentity_t *self, vec3_t start, vec3_t aimdir ); gentity_t *fire_pulseRifle( gentity_t *self, vec3_t start, vec3_t dir ); gentity_t *fire_luciferCanon( gentity_t *self, vec3_t start, vec3_t dir, int damage ); -gentity_t *fire_grenade( gentity_t *self, vec3_t start, vec3_t aimdir ); -gentity_t *fire_rocket( gentity_t *self, vec3_t start, vec3_t dir ); gentity_t *fire_lockblob( gentity_t *self, vec3_t start, vec3_t dir ); gentity_t *fire_paraLockBlob( gentity_t *self, vec3_t start, vec3_t dir ); gentity_t *fire_slowBlob( gentity_t *self, vec3_t start, vec3_t dir ); -gentity_t *fire_bfg( gentity_t *self, vec3_t start, vec3_t dir ); -gentity_t *fire_grapple( gentity_t *self, vec3_t start, vec3_t dir ); // @@ -627,7 +636,7 @@ void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ); // // g_trigger.c // -void trigger_teleporter_touch (gentity_t *self, gentity_t *other, trace_t *trace ); +void trigger_teleporter_touch( gentity_t *self, gentity_t *other, trace_t *trace ); // @@ -639,46 +648,32 @@ void ShineTorch( gentity_t *self ); // // g_weapon.c // -qboolean LogAccuracyHit( gentity_t *target, gentity_t *attacker ); -void CalcMuzzlePoint( gentity_t *ent, vec3_t forward, vec3_t right, vec3_t up, vec3_t muzzlePoint ); -void SnapVectorTowards( vec3_t v, vec3_t to ); -qboolean CheckVenomAttack( gentity_t *ent ); -void CheckGrabAttack( gentity_t *ent ); -qboolean CheckPounceAttack( gentity_t *ent ); -void Weapon_HookFree (gentity_t *ent); -void Weapon_HookThink (gentity_t *ent); +void CalcMuzzlePoint( gentity_t *ent, vec3_t forward, vec3_t right, vec3_t up, vec3_t muzzlePoint ); +void SnapVectorTowards( vec3_t v, vec3_t to ); +qboolean CheckVenomAttack( gentity_t *ent ); +void CheckGrabAttack( gentity_t *ent ); +qboolean CheckPounceAttack( gentity_t *ent ); // // g_client.c // -team_t TeamCount( int ignoreClientNum, int team ); -int TeamLeader( int team ); -void SetClientViewAngle( gentity_t *ent, vec3_t angle ); -gentity_t *SelectSpawnPoint ( vec3_t avoidPoint, vec3_t origin, vec3_t angles ); -void SpawnCorpse( gentity_t *ent ); -void respawn (gentity_t *ent); -void BeginIntermission (void); -void InitClientPersistant (gclient_t *client); -void InitClientResp (gclient_t *client); -void InitBodyQue (void); -void ClientSpawn( gentity_t *ent, gentity_t *spawn ); -void player_die (gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod); -void AddScore( gentity_t *ent, int score ); - -//TA: extra bits -void AddPoints( gentity_t *ent, int score ); -int CalculatePoints( gentity_t *victim, gentity_t *attacker ); - -void CalculateRanks( void ); -qboolean SpotWouldTelefrag( gentity_t *spot ); +team_t TeamCount( int ignoreClientNum, int team ); +void SetClientViewAngle( gentity_t *ent, vec3_t angle ); +gentity_t *SelectSpawnPoint( vec3_t avoidPoint, vec3_t origin, vec3_t angles ); +void SpawnCorpse( gentity_t *ent ); +void respawn( gentity_t *ent ); +void BeginIntermission( void ); +void ClientSpawn( gentity_t *ent, gentity_t *spawn ); +void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod ); +qboolean SpotWouldTelefrag( gentity_t *spot ); // // g_svcmds.c // qboolean ConsoleCommand( void ); -void G_ProcessIPBans(void); -qboolean G_FilterPacket (char *from); +void G_ProcessIPBans( void ); +qboolean G_FilterPacket( char *from ); // // g_weapon.c @@ -687,29 +682,18 @@ void FireWeapon( gentity_t *ent ); void FireWeapon2( gentity_t *ent ); void FireWeapon3( gentity_t *ent ); -// -// p_hud.c -// -void MoveClientToIntermission (gentity_t *client); -void G_SetStats (gentity_t *ent); -void ScoreboardMessage (gentity_t *client); - // // g_cmds.c // -// -// g_pweapon.c -// - - // // g_main.c // +void ScoreboardMessage( gentity_t *client ); +void MoveClientToIntermission( gentity_t *client ); +void CalculateRanks( void ); void FindIntermissionPoint( void ); -void SetLeader(int team, int client); -void CheckTeamLeader( int team ); -void G_RunThink (gentity_t *ent); +void G_RunThink( gentity_t *ent ); void QDECL G_LogPrintf( const char *fmt, ... ); void SendScoreboardMessageToAllClients( void ); void QDECL G_Printf( const char *fmt, ... ); @@ -734,8 +718,11 @@ void G_RunClient( gentity_t *ent ); // // g_team.c // -qboolean OnSameTeam( gentity_t *ent1, gentity_t *ent2 ); -void Team_CheckDroppedItem( gentity_t *dropped ); +qboolean OnSameTeam( gentity_t *ent1, gentity_t *ent2 ); +gentity_t *Team_GetLocation( gentity_t *ent ); +qboolean Team_GetLocationMsg( gentity_t *ent, char *loc, int loclen ); +void TeamplayInfoMessage( gentity_t *ent ); +void CheckTeamStatus( void ); // // g_mem.c @@ -751,56 +738,13 @@ void Svcmd_GameMem_f( void ); // void G_ReadSessionData( gclient_t *client ); void G_InitSessionData( gclient_t *client, char *userinfo ); - -void G_InitWorldSession( void ); void G_WriteSessionData( void ); -// -// g_arenas.c -// -void UpdateTournamentInfo( void ); -void SpawnModelsOnVictoryPads( void ); -void Svcmd_AbortPodium_f( void ); - -// -// g_bot.c -// -/*void G_InitBots( qboolean restart ); -char *G_GetBotInfoByNumber( int num ); -char *G_GetBotInfoByName( const char *name ); -void G_CheckBotSpawn( void ); -void G_QueueBotBegin( int clientNum ); -qboolean G_BotConnect( int clientNum, qboolean restart ); -void Svcmd_AddBot_f( void ); -void Svcmd_BotList_f( void ); -void BotInterbreedEndMatch( void );*/ - -// ai_main.c - //some maxs #define MAX_FILEPATH 144 -//bot settings -/*typedef struct bot_settings_s -{ - char characterfile[MAX_FILEPATH]; - float skill; - char team[MAX_FILEPATH]; -} bot_settings_t; - -int BotAISetup( int restart ); -int BotAIShutdown( int restart ); -int BotAILoadMap( int restart ); -int BotAISetupClient( int client, bot_settings_t *settings ); -int BotAIShutdownClient( int client ); -int BotAIStartFrame( int time );*/ - - -#include "g_team.h" // teamplay specific stuff - - extern level_locals_t level; -extern gentity_t g_entities[MAX_GENTITIES]; +extern gentity_t g_entities[ MAX_GENTITIES ]; #define FOFS(x) ((int)&(((gentity_t *)0)->x)) @@ -811,9 +755,7 @@ extern vmCvar_t g_maxGameClients; // allow this many active extern vmCvar_t g_restarted; extern vmCvar_t g_dmflags; -extern vmCvar_t g_fraglimit; extern vmCvar_t g_timelimit; -extern vmCvar_t g_capturelimit; extern vmCvar_t g_friendlyFire; extern vmCvar_t g_password; extern vmCvar_t g_needpass; @@ -857,208 +799,52 @@ extern vmCvar_t g_alienMaxStage; extern vmCvar_t g_alienStage2Threshold; extern vmCvar_t g_alienStage3Threshold; -void trap_Printf( const char *fmt ); -void trap_Error( const char *fmt ); -int trap_Milliseconds( void ); -int trap_Argc( void ); -void trap_Argv( int n, char *buffer, int bufferLength ); -void trap_Args( char *buffer, int bufferLength ); -int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ); -void trap_FS_Read( void *buffer, int len, fileHandle_t f ); -void trap_FS_Write( const void *buffer, int len, fileHandle_t f ); -void trap_FS_FCloseFile( fileHandle_t f ); -int trap_FS_GetFileList( const char *path, const char *extension, char *listbuf, int bufsize ); -void trap_SendConsoleCommand( int exec_when, const char *text ); -void trap_Cvar_Register( vmCvar_t *cvar, const char *var_name, const char *value, int flags ); -void trap_Cvar_Update( vmCvar_t *cvar ); -void trap_Cvar_Set( const char *var_name, const char *value ); -int trap_Cvar_VariableIntegerValue( const char *var_name ); -float trap_Cvar_VariableValue( const char *var_name ); -void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ); -void trap_LocateGameData( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t, playerState_t *gameClients, int sizeofGameClient ); -void trap_DropClient( int clientNum, const char *reason ); -void trap_SendServerCommand( int clientNum, const char *text ); -void trap_SetConfigstring( int num, const char *string ); -void trap_GetConfigstring( int num, char *buffer, int bufferSize ); -void trap_GetUserinfo( int num, char *buffer, int bufferSize ); -void trap_SetUserinfo( int num, const char *buffer ); -void trap_GetServerinfo( char *buffer, int bufferSize ); -void trap_SetBrushModel( gentity_t *ent, const char *name ); -void trap_Trace( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask ); -int trap_PointContents( const vec3_t point, int passEntityNum ); -qboolean trap_InPVS( const vec3_t p1, const vec3_t p2 ); -qboolean trap_InPVSIgnorePortals( const vec3_t p1, const vec3_t p2 ); -void trap_AdjustAreaPortalState( gentity_t *ent, qboolean open ); -qboolean trap_AreasConnected( int area1, int area2 ); -void trap_LinkEntity( gentity_t *ent ); -void trap_UnlinkEntity( gentity_t *ent ); -int trap_EntitiesInBox( const vec3_t mins, const vec3_t maxs, int *entityList, int maxcount ); -qboolean trap_EntityContact( const vec3_t mins, const vec3_t maxs, const gentity_t *ent ); -int trap_BotAllocateClient( void ); -void trap_BotFreeClient( int clientNum ); -void trap_GetUsercmd( int clientNum, usercmd_t *cmd ); +void trap_Printf( const char *fmt ); +void trap_Error( const char *fmt ); +int trap_Milliseconds( void ); +int trap_Argc( void ); +void trap_Argv( int n, char *buffer, int bufferLength ); +void trap_Args( char *buffer, int bufferLength ); +int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ); +void trap_FS_Read( void *buffer, int len, fileHandle_t f ); +void trap_FS_Write( const void *buffer, int len, fileHandle_t f ); +void trap_FS_FCloseFile( fileHandle_t f ); +int trap_FS_GetFileList( const char *path, const char *extension, char *listbuf, int bufsize ); +void trap_SendConsoleCommand( int exec_when, const char *text ); +void trap_Cvar_Register( vmCvar_t *cvar, const char *var_name, const char *value, int flags ); +void trap_Cvar_Update( vmCvar_t *cvar ); +void trap_Cvar_Set( const char *var_name, const char *value ); +int trap_Cvar_VariableIntegerValue( const char *var_name ); +float trap_Cvar_VariableValue( const char *var_name ); +void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ); +void trap_LocateGameData( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t, + playerState_t *gameClients, int sizeofGameClient ); +void trap_DropClient( int clientNum, const char *reason ); +void trap_SendServerCommand( int clientNum, const char *text ); +void trap_SetConfigstring( int num, const char *string ); +void trap_GetConfigstring( int num, char *buffer, int bufferSize ); +void trap_GetUserinfo( int num, char *buffer, int bufferSize ); +void trap_SetUserinfo( int num, const char *buffer ); +void trap_GetServerinfo( char *buffer, int bufferSize ); +void trap_SetBrushModel( gentity_t *ent, const char *name ); +void trap_Trace( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, + const vec3_t end, int passEntityNum, int contentmask ); +int trap_PointContents( const vec3_t point, int passEntityNum ); +qboolean trap_InPVS( const vec3_t p1, const vec3_t p2 ); +qboolean trap_InPVSIgnorePortals( const vec3_t p1, const vec3_t p2 ); +void trap_AdjustAreaPortalState( gentity_t *ent, qboolean open ); +qboolean trap_AreasConnected( int area1, int area2 ); +void trap_LinkEntity( gentity_t *ent ); +void trap_UnlinkEntity( gentity_t *ent ); +int trap_EntitiesInBox( const vec3_t mins, const vec3_t maxs, int *entityList, int maxcount ); +qboolean trap_EntityContact( const vec3_t mins, const vec3_t maxs, const gentity_t *ent ); +int trap_BotAllocateClient( void ); +void trap_BotFreeClient( int clientNum ); +void trap_GetUsercmd( int clientNum, usercmd_t *cmd ); qboolean trap_GetEntityToken( char *buffer, int bufferSize ); -int trap_DebugPolygonCreate(int color, int numPoints, vec3_t *points); -void trap_DebugPolygonDelete(int id); - -int trap_BotLibSetup( void ); -int trap_BotLibShutdown( void ); -int trap_BotLibVarSet(char *var_name, char *value); -int trap_BotLibVarGet(char *var_name, char *value, int size); -int trap_BotLibDefine(char *string); -int trap_BotLibStartFrame(float time); -int trap_BotLibLoadMap(const char *mapname); -int trap_BotLibUpdateEntity(int ent, void /* struct bot_updateentity_s */ *bue); -int trap_BotLibTest(int parm0, char *parm1, vec3_t parm2, vec3_t parm3); - -int trap_BotGetSnapshotEntity( int clientNum, int sequence ); -int trap_BotGetServerCommand(int clientNum, char *message, int size); -void trap_BotUserCommand(int client, usercmd_t *ucmd); - -int trap_AAS_BBoxAreas(vec3_t absmins, vec3_t absmaxs, int *areas, int maxareas); -int trap_AAS_AreaInfo( int areanum, void /* struct aas_areainfo_s */ *info ); -void trap_AAS_EntityInfo(int entnum, void /* struct aas_entityinfo_s */ *info); - -int trap_AAS_Initialized(void); -void trap_AAS_PresenceTypeBoundingBox(int presencetype, vec3_t mins, vec3_t maxs); -float trap_AAS_Time(void); - -int trap_AAS_PointAreaNum(vec3_t point); -int trap_AAS_PointReachabilityAreaIndex(vec3_t point); -int trap_AAS_TraceAreas(vec3_t start, vec3_t end, int *areas, vec3_t *points, int maxareas); - -int trap_AAS_PointContents(vec3_t point); -int trap_AAS_NextBSPEntity(int ent); -int trap_AAS_ValueForBSPEpairKey(int ent, char *key, char *value, int size); -int trap_AAS_VectorForBSPEpairKey(int ent, char *key, vec3_t v); -int trap_AAS_FloatForBSPEpairKey(int ent, char *key, float *value); -int trap_AAS_IntForBSPEpairKey(int ent, char *key, int *value); - -int trap_AAS_AreaReachability(int areanum); - -int trap_AAS_AreaTravelTimeToGoalArea(int areanum, vec3_t origin, int goalareanum, int travelflags); -int trap_AAS_EnableRoutingArea( int areanum, int enable ); -int trap_AAS_PredictRoute(void /*struct aas_predictroute_s*/ *route, int areanum, vec3_t origin, - int goalareanum, int travelflags, int maxareas, int maxtime, - int stopevent, int stopcontents, int stoptfl, int stopareanum); - -int trap_AAS_AlternativeRouteGoals(vec3_t start, int startareanum, vec3_t goal, int goalareanum, int travelflags, - void /*struct aas_altroutegoal_s*/ *altroutegoals, int maxaltroutegoals, - int type); - -int trap_AAS_Swimming(vec3_t origin); -int trap_AAS_PredictClientMovement(void /* aas_clientmove_s */ *move, int entnum, vec3_t origin, int presencetype, int onground, vec3_t velocity, vec3_t cmdmove, int cmdframes, int maxframes, float frametime, int stopevent, int stopareanum, int visualize); - - -void trap_EA_Say(int client, char *str); -void trap_EA_SayTeam(int client, char *str); -void trap_EA_Command(int client, char *command); - -void trap_EA_Action(int client, int action); -void trap_EA_Gesture(int client); - -void trap_EA_Talk(int client); -void trap_EA_Attack(int client); -void trap_EA_Use(int client); -void trap_EA_Respawn(int client); -void trap_EA_Crouch(int client); -void trap_EA_MoveUp(int client); -void trap_EA_MoveDown(int client); -void trap_EA_MoveForward(int client); -void trap_EA_MoveBack(int client); -void trap_EA_MoveLeft(int client); -void trap_EA_MoveRight(int client); -void trap_EA_SelectWeapon(int client, int weapon); -void trap_EA_Jump(int client); -void trap_EA_DelayedJump(int client); -void trap_EA_Move(int client, vec3_t dir, float speed); -void trap_EA_View(int client, vec3_t viewangles); - -void trap_EA_EndRegular(int client, float thinktime); -void trap_EA_GetInput(int client, float thinktime, void /* struct bot_input_s */ *input); -void trap_EA_ResetInput(int client); - - -int trap_BotLoadCharacter(char *charfile, float skill); -void trap_BotFreeCharacter(int character); -float trap_Characteristic_Float(int character, int index); -float trap_Characteristic_BFloat(int character, int index, float min, float max); -int trap_Characteristic_Integer(int character, int index); -int trap_Characteristic_BInteger(int character, int index, int min, int max); -void trap_Characteristic_String(int character, int index, char *buf, int size); - -int trap_BotAllocChatState(void); -void trap_BotFreeChatState(int handle); -void trap_BotQueueConsoleMessage(int chatstate, int type, char *message); -void trap_BotRemoveConsoleMessage(int chatstate, int handle); -int trap_BotNextConsoleMessage(int chatstate, void /* struct bot_consolemessage_s */ *cm); -int trap_BotNumConsoleMessages(int chatstate); -void trap_BotInitialChat(int chatstate, char *type, int mcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7 ); -int trap_BotNumInitialChats(int chatstate, char *type); -int trap_BotReplyChat(int chatstate, char *message, int mcontext, int vcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7 ); -int trap_BotChatLength(int chatstate); -void trap_BotEnterChat(int chatstate, int client, int sendto); -void trap_BotGetChatMessage(int chatstate, char *buf, int size); -int trap_StringContains(char *str1, char *str2, int casesensitive); -int trap_BotFindMatch(char *str, void /* struct bot_match_s */ *match, unsigned long int context); -void trap_BotMatchVariable(void /* struct bot_match_s */ *match, int variable, char *buf, int size); -void trap_UnifyWhiteSpaces(char *string); -void trap_BotReplaceSynonyms(char *string, unsigned long int context); -int trap_BotLoadChatFile(int chatstate, char *chatfile, char *chatname); -void trap_BotSetChatGender(int chatstate, int gender); -void trap_BotSetChatName(int chatstate, char *name, int client); -void trap_BotResetGoalState(int goalstate); -void trap_BotRemoveFromAvoidGoals(int goalstate, int number); -void trap_BotResetAvoidGoals(int goalstate); -void trap_BotPushGoal(int goalstate, void /* struct bot_goal_s */ *goal); -void trap_BotPopGoal(int goalstate); -void trap_BotEmptyGoalStack(int goalstate); -void trap_BotDumpAvoidGoals(int goalstate); -void trap_BotDumpGoalStack(int goalstate); -void trap_BotGoalName(int number, char *name, int size); -int trap_BotGetTopGoal(int goalstate, void /* struct bot_goal_s */ *goal); -int trap_BotGetSecondGoal(int goalstate, void /* struct bot_goal_s */ *goal); -int trap_BotChooseLTGItem(int goalstate, vec3_t origin, int *inventory, int travelflags); -int trap_BotChooseNBGItem(int goalstate, vec3_t origin, int *inventory, int travelflags, void /* struct bot_goal_s */ *ltg, float maxtime); -int trap_BotTouchingGoal(vec3_t origin, void /* struct bot_goal_s */ *goal); -int trap_BotItemGoalInVisButNotVisible(int viewer, vec3_t eye, vec3_t viewangles, void /* struct bot_goal_s */ *goal); -int trap_BotGetNextCampSpotGoal(int num, void /* struct bot_goal_s */ *goal); -int trap_BotGetMapLocationGoal(char *name, void /* struct bot_goal_s */ *goal); -int trap_BotGetLevelItemGoal(int index, char *classname, void /* struct bot_goal_s */ *goal); -float trap_BotAvoidGoalTime(int goalstate, int number); -void trap_BotSetAvoidGoalTime(int goalstate, int number, float avoidtime); -void trap_BotInitLevelItems(void); -void trap_BotUpdateEntityItems(void); -int trap_BotLoadItemWeights(int goalstate, char *filename); -void trap_BotFreeItemWeights(int goalstate); -void trap_BotInterbreedGoalFuzzyLogic(int parent1, int parent2, int child); -void trap_BotSaveGoalFuzzyLogic(int goalstate, char *filename); -void trap_BotMutateGoalFuzzyLogic(int goalstate, float range); -int trap_BotAllocGoalState(int state); -void trap_BotFreeGoalState(int handle); - -void trap_BotResetMoveState(int movestate); -void trap_BotMoveToGoal(void /* struct bot_moveresult_s */ *result, int movestate, void /* struct bot_goal_s */ *goal, int travelflags); -int trap_BotMoveInDirection(int movestate, vec3_t dir, float speed, int type); -void trap_BotResetAvoidReach(int movestate); -void trap_BotResetLastAvoidReach(int movestate); -int trap_BotReachabilityArea(vec3_t origin, int testground); -int trap_BotMovementViewTarget(int movestate, void /* struct bot_goal_s */ *goal, int travelflags, float lookahead, vec3_t target); -int trap_BotPredictVisiblePosition(vec3_t origin, int areanum, void /* struct bot_goal_s */ *goal, int travelflags, vec3_t target); -int trap_BotAllocMoveState(void); -void trap_BotFreeMoveState(int handle); -void trap_BotInitMoveState(int handle, void /* struct bot_initmove_s */ *initmove); -void trap_BotAddAvoidSpot(int movestate, vec3_t origin, float radius, int type); - -int trap_BotChooseBestFightWeapon(int weaponstate, int *inventory); -void trap_BotGetWeaponInfo(int weaponstate, int weapon, void /* struct weaponinfo_s */ *weaponinfo); -int trap_BotLoadWeaponWeights(int weaponstate, char *filename); -int trap_BotAllocWeaponState(void); -void trap_BotFreeWeaponState(int weaponstate); -void trap_BotResetWeaponState(int weaponstate); - -int trap_GeneticParentsAndChildSelection(int numranks, float *ranks, int *parent1, int *parent2, int *child); - -void trap_SnapVector( float *v ); +int trap_DebugPolygonCreate(int color, int numPoints, vec3_t *points); +void trap_DebugPolygonDelete(int id); + +void trap_SnapVector( float *v ); diff --git a/src/game/g_main.c b/src/game/g_main.c index ba4616e5..478d0906 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -18,7 +18,8 @@ level_locals_t level; -typedef struct { +typedef struct +{ vmCvar_t *vmCvar; char *cvarName; char *defaultString; @@ -28,8 +29,8 @@ typedef struct { qboolean teamShader; // track and if changed, update shader state } cvarTable_t; -gentity_t g_entities[MAX_GENTITIES]; -gclient_t g_clients[MAX_CLIENTS]; +gentity_t g_entities[ MAX_GENTITIES ]; +gclient_t g_clients[ MAX_CLIENTS ]; vmCvar_t g_dmflags; vmCvar_t g_fraglimit; @@ -86,7 +87,8 @@ vmCvar_t g_alienMaxStage; vmCvar_t g_alienStage2Threshold; vmCvar_t g_alienStage3Threshold; -static cvarTable_t gameCvarTable[] = { +static cvarTable_t gameCvarTable[ ] = +{ // don't override the cheat state set by the system { &g_cheats, "sv_cheats", "", 0, 0, qfalse }, @@ -166,7 +168,7 @@ static cvarTable_t gameCvarTable[] = { { &g_rankings, "g_rankings", "0", 0, 0, qfalse} }; -static int gameCvarTableSize = sizeof( gameCvarTable ) / sizeof( gameCvarTable[0] ); +static int gameCvarTableSize = sizeof( gameCvarTable ) / sizeof( gameCvarTable[ 0 ] ); void G_InitGame( int levelTime, int randomSeed, int restart ); @@ -185,60 +187,75 @@ This is the only way control passes into the module. This must be the very first function compiled into the .q3vm file ================ */ -int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11 ) { - switch ( command ) { - case GAME_INIT: - G_InitGame( arg0, arg1, arg2 ); - return 0; - case GAME_SHUTDOWN: - G_ShutdownGame( arg0 ); - return 0; - case GAME_CLIENT_CONNECT: - return (int)ClientConnect( arg0, arg1, arg2 ); - case GAME_CLIENT_THINK: - ClientThink( arg0 ); - return 0; - case GAME_CLIENT_USERINFO_CHANGED: - ClientUserinfoChanged( arg0 ); - return 0; - case GAME_CLIENT_DISCONNECT: - ClientDisconnect( arg0 ); - return 0; - case GAME_CLIENT_BEGIN: - ClientBegin( arg0 ); - return 0; - case GAME_CLIENT_COMMAND: - ClientCommand( arg0 ); - return 0; - case GAME_RUN_FRAME: - G_RunFrame( arg0 ); - return 0; - case GAME_CONSOLE_COMMAND: - return ConsoleCommand(); +int vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, + int arg5, int arg6, int arg7, int arg8, int arg9, + int arg10, int arg11 ) +{ + switch( command ) + { + case GAME_INIT: + G_InitGame( arg0, arg1, arg2 ); + return 0; + + case GAME_SHUTDOWN: + G_ShutdownGame( arg0 ); + return 0; + + case GAME_CLIENT_CONNECT: + return (int)ClientConnect( arg0, arg1, arg2 ); + + case GAME_CLIENT_THINK: + ClientThink( arg0 ); + return 0; + + case GAME_CLIENT_USERINFO_CHANGED: + ClientUserinfoChanged( arg0 ); + return 0; + + case GAME_CLIENT_DISCONNECT: + ClientDisconnect( arg0 ); + return 0; + + case GAME_CLIENT_BEGIN: + ClientBegin( arg0 ); + return 0; + + case GAME_CLIENT_COMMAND: + ClientCommand( arg0 ); + return 0; + + case GAME_RUN_FRAME: + G_RunFrame( arg0 ); + return 0; + + case GAME_CONSOLE_COMMAND: + return ConsoleCommand( ); } return -1; } -void QDECL G_Printf( const char *fmt, ... ) { - va_list argptr; - char text[1024]; +void QDECL G_Printf( const char *fmt, ... ) +{ + va_list argptr; + char text[ 1024 ]; - va_start (argptr, fmt); - vsprintf (text, fmt, argptr); - va_end (argptr); + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); trap_Printf( text ); } -void QDECL G_Error( const char *fmt, ... ) { - va_list argptr; - char text[1024]; +void QDECL G_Error( const char *fmt, ... ) +{ + va_list argptr; + char text[ 1024 ]; - va_start (argptr, fmt); - vsprintf (text, fmt, argptr); - va_end (argptr); + va_start( argptr, fmt ); + vsprintf( text, fmt, argptr ); + va_end( argptr ); trap_Error( text ); } @@ -254,32 +271,42 @@ All but the first will have the FL_TEAMSLAVE flag set and teammaster field set All but the last will have the teamchain field set to the next one ================ */ -void G_FindTeams( void ) { +void G_FindTeams( void ) +{ gentity_t *e, *e2; - int i, j; - int c, c2; + int i, j; + int c, c2; c = 0; c2 = 0; - for ( i=1, e=g_entities+i ; i < level.num_entities ; i++,e++ ){ - if (!e->inuse) + + for( i = 1, e = g_entities+i; i < level.num_entities; i++, e++ ) + { + if( !e->inuse ) continue; - if (!e->team) + + if( !e->team ) continue; - if (e->flags & FL_TEAMSLAVE) + + if( e->flags & FL_TEAMSLAVE ) continue; + e->teammaster = e; c++; c2++; - for (j=i+1, e2=e+1 ; j < level.num_entities ; j++,e2++) + + for( j = i + 1, e2 = e + 1; j < level.num_entities; j++, e2++ ) { - if (!e2->inuse) + if( !e2->inuse ) continue; - if (!e2->team) + + if( !e2->team ) continue; - if (e2->flags & FL_TEAMSLAVE) + + if( e2->flags & FL_TEAMSLAVE ) continue; - if (!strcmp(e->team, e2->team)) + + if( !strcmp( e->team, e2->team ) ) { c2++; e2->teamchain = e->teamchain; @@ -288,7 +315,8 @@ void G_FindTeams( void ) { e2->flags |= FL_TEAMSLAVE; // make sure that targets only point at the master - if ( e2->targetname ) { + if( e2->targetname ) + { e->targetname = e2->targetname; e2->targetname = NULL; } @@ -296,7 +324,7 @@ void G_FindTeams( void ) { } } - G_Printf ("%i teams with %i entities\n", c, c2); + G_Printf( "%i teams with %i entities\n", c, c2 ); } /* @@ -324,7 +352,8 @@ void G_RegisterPlayerModels( void ) } -void G_RemapTeamShaders() { +void G_RemapTeamShaders( ) +{ } @@ -363,33 +392,34 @@ void G_RegisterCvars( void ) G_UpdateCvars ================= */ -void G_UpdateCvars( void ) { - int i; +void G_UpdateCvars( void ) +{ + int i; cvarTable_t *cv; - qboolean remapped = qfalse; + qboolean remapped = qfalse; - for ( i = 0, cv = gameCvarTable ; i < gameCvarTableSize ; i++, cv++ ) { - if ( cv->vmCvar ) { + for( i = 0, cv = gameCvarTable; i < gameCvarTableSize; i++, cv++ ) + { + if( cv->vmCvar ) + { trap_Cvar_Update( cv->vmCvar ); - if ( cv->modificationCount != cv->vmCvar->modificationCount ) { + if( cv->modificationCount != cv->vmCvar->modificationCount ) + { cv->modificationCount = cv->vmCvar->modificationCount; - if ( cv->trackChange ) { - trap_SendServerCommand( -1, va("print \"Server: %s changed to %s\n\"", + if( cv->trackChange ) + trap_SendServerCommand( -1, va( "print \"Server: %s changed to %s\n\"", cv->cvarName, cv->vmCvar->string ) ); - } - if (cv->teamShader) { + if( cv->teamShader ) remapped = qtrue; - } } } } - if (remapped) { - G_RemapTeamShaders(); - } + if( remapped ) + G_RemapTeamShaders( ); } @@ -420,7 +450,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) level.time = levelTime; level.startTime = levelTime; - level.snd_fry = G_SoundIndex("sound/player/fry.wav"); // FIXME standing in lava / slime + level.snd_fry = G_SoundIndex( "sound/player/fry.wav" ); // FIXME standing in lava / slime if( g_log.string[ 0 ] ) { @@ -433,12 +463,12 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) G_Printf( "WARNING: Couldn't open logfile: %s\n", g_log.string ); else { - char serverinfo[MAX_INFO_STRING]; + char serverinfo[ MAX_INFO_STRING ]; trap_GetServerinfo( serverinfo, sizeof( serverinfo ) ); - G_LogPrintf("------------------------------------------------------------\n" ); - G_LogPrintf("InitGame: %s\n", serverinfo ); + G_LogPrintf( "------------------------------------------------------------\n" ); + G_LogPrintf( "InitGame: %s\n", serverinfo ); } } else @@ -476,7 +506,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) G_RegisterPlayerModels( ); G_InitDamageLocations( ); - G_Printf ("-----------------------------------\n"); + G_Printf( "-----------------------------------\n" ); G_RemapTeamShaders( ); @@ -491,17 +521,19 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) G_ShutdownGame ================= */ -void G_ShutdownGame( int restart ) { - G_Printf ("==== ShutdownGame ====\n"); +void G_ShutdownGame( int restart ) +{ + G_Printf( "==== ShutdownGame ====\n" ); - if ( level.logFile ) { - G_LogPrintf("ShutdownGame:\n" ); - G_LogPrintf("------------------------------------------------------------\n" ); + if( level.logFile ) + { + G_LogPrintf( "ShutdownGame:\n" ); + G_LogPrintf( "------------------------------------------------------------\n" ); trap_FS_FCloseFile( level.logFile ); } // write all the client session data so we can get it back - G_WriteSessionData(); + G_WriteSessionData( ); } @@ -511,26 +543,28 @@ void G_ShutdownGame( int restart ) { #ifndef GAME_HARD_LINKED // this is only here so the functions in q_shared.c and bg_*.c can link -void QDECL Com_Error ( int level, const char *error, ... ) { - va_list argptr; - char text[1024]; +void QDECL Com_Error( int level, const char *error, ... ) +{ + va_list argptr; + char text[ 1024 ]; - va_start (argptr, error); - vsprintf (text, error, argptr); - va_end (argptr); + va_start( argptr, error ); + vsprintf( text, error, argptr ); + va_end( argptr ); - G_Error( "%s", text); + G_Error( "%s", text ); } -void QDECL Com_Printf( const char *msg, ... ) { - va_list argptr; - char text[1024]; +void QDECL Com_Printf( const char *msg, ... ) +{ + va_list argptr; + char text[ 1024 ]; - va_start (argptr, msg); - vsprintf (text, msg, argptr); - va_end (argptr); + va_start( argptr, msg ); + vsprintf( text, msg, argptr ); + va_end( argptr ); - G_Printf ("%s", text); + G_Printf( "%s", text ); } #endif @@ -543,132 +577,6 @@ PLAYER COUNTING / SCORE SORTING ======================================================================== */ -/* -============= -AddTournamentPlayer - -If there are less than two tournament players, put a -spectator in the game and restart -============= -*/ -void AddTournamentPlayer( void ) { - int i; - gclient_t *client; - gclient_t *nextInLine; - - if ( level.numPlayingClients >= 2 ) { - return; - } - - // never change during intermission - if ( level.intermissiontime ) { - return; - } - - nextInLine = NULL; - - for ( i = 0 ; i < level.maxclients ; i++ ) { - client = &level.clients[i]; - if ( client->pers.connected != CON_CONNECTED ) { - continue; - } - if ( client->sess.sessionTeam != TEAM_SPECTATOR ) { - continue; - } - // never select the dedicated follow or scoreboard clients - if ( client->sess.spectatorState == SPECTATOR_SCOREBOARD || - client->sess.spectatorClient < 0 ) { - continue; - } - - if ( !nextInLine || client->sess.spectatorTime < nextInLine->sess.spectatorTime ) { - nextInLine = client; - } - } - - if ( !nextInLine ) { - return; - } - - level.warmupTime = -1; - - // set them to free-for-all team - /*SetTeam( &g_entities[ nextInLine - level.clients ], "f" );*/ -} - - -/* -======================= -RemoveTournamentLoser - -Make the loser a spectator at the back of the line -======================= -*/ -void RemoveTournamentLoser( void ) { - int clientNum; - - if ( level.numPlayingClients != 2 ) { - return; - } - - clientNum = level.sortedClients[1]; - - if ( level.clients[ clientNum ].pers.connected != CON_CONNECTED ) { - return; - } - - // make them a spectator - /*SetTeam( &g_entities[ clientNum ], "s" );*/ -} - - -/* -======================= -RemoveTournamentWinner -======================= -*/ -void RemoveTournamentWinner( void ) { - int clientNum; - - if ( level.numPlayingClients != 2 ) { - return; - } - - clientNum = level.sortedClients[0]; - - if ( level.clients[ clientNum ].pers.connected != CON_CONNECTED ) { - return; - } - - // make them a spectator - /*SetTeam( &g_entities[ clientNum ], "s" );*/ -} - - -/* -======================= -AdjustTournamentScores - -======================= -*/ -void AdjustTournamentScores( void ) { - int clientNum; - - clientNum = level.sortedClients[0]; - if ( level.clients[ clientNum ].pers.connected == CON_CONNECTED ) { - level.clients[ clientNum ].sess.wins++; - ClientUserinfoChanged( clientNum ); - } - - clientNum = level.sortedClients[1]; - if ( level.clients[ clientNum ].pers.connected == CON_CONNECTED ) { - level.clients[ clientNum ].sess.losses++; - ClientUserinfoChanged( clientNum ); - } - -} - - /* ============= @@ -676,55 +584,53 @@ SortRanks ============= */ -int QDECL SortRanks( const void *a, const void *b ) { +int QDECL SortRanks( const void *a, const void *b ) +{ gclient_t *ca, *cb; - ca = &level.clients[*(int *)a]; - cb = &level.clients[*(int *)b]; + ca = &level.clients[ *(int *)a ]; + cb = &level.clients[ *(int *)b ]; // sort special clients last - if ( ca->sess.spectatorState == SPECTATOR_SCOREBOARD || ca->sess.spectatorClient < 0 ) { + if( ca->sess.spectatorState == SPECTATOR_SCOREBOARD || ca->sess.spectatorClient < 0 ) return 1; - } - if ( cb->sess.spectatorState == SPECTATOR_SCOREBOARD || cb->sess.spectatorClient < 0 ) { + + if( cb->sess.spectatorState == SPECTATOR_SCOREBOARD || cb->sess.spectatorClient < 0 ) return -1; - } // then connecting clients - if ( ca->pers.connected == CON_CONNECTING ) { + if( ca->pers.connected == CON_CONNECTING ) return 1; - } - if ( cb->pers.connected == CON_CONNECTING ) { + + if( cb->pers.connected == CON_CONNECTING ) return -1; - } // then spectators - if ( ca->sess.sessionTeam == TEAM_SPECTATOR && cb->sess.sessionTeam == TEAM_SPECTATOR ) { - if ( ca->sess.spectatorTime < cb->sess.spectatorTime ) { + if( ca->sess.sessionTeam == TEAM_SPECTATOR && cb->sess.sessionTeam == TEAM_SPECTATOR ) + { + if( ca->sess.spectatorTime < cb->sess.spectatorTime ) return -1; - } - if ( ca->sess.spectatorTime > cb->sess.spectatorTime ) { + + if( ca->sess.spectatorTime > cb->sess.spectatorTime ) return 1; - } + return 0; } - if ( ca->sess.sessionTeam == TEAM_SPECTATOR ) { + + if( ca->sess.sessionTeam == TEAM_SPECTATOR ) return 1; - } - if ( cb->sess.sessionTeam == TEAM_SPECTATOR ) { + + if( cb->sess.sessionTeam == TEAM_SPECTATOR ) return -1; - } // then sort by score - if ( ca->ps.persistant[PERS_SCORE] - > cb->ps.persistant[PERS_SCORE] ) { + if( ca->ps.persistant[ PERS_SCORE ] > cb->ps.persistant[ PERS_SCORE ] ) return -1; - } - if ( ca->ps.persistant[PERS_SCORE] - < cb->ps.persistant[PERS_SCORE] ) { + + if( ca->ps.persistant[ PERS_SCORE ] < cb->ps.persistant[ PERS_SCORE ] ) return 1; - } + return 0; } @@ -745,7 +651,7 @@ void countSpawns( void ) for ( i = 1, ent = g_entities + i ; i < level.num_entities ; i++, ent++ ) { - if (!ent->inuse) + if( !ent->inuse ) continue; if( ent->s.modelindex == BA_A_SPAWN && ent->health > 0 ) @@ -854,11 +760,12 @@ This will be called on every client connect, begin, disconnect, death, and team change. ============ */ -void CalculateRanks( void ) { - int i; - int rank; - int score; - int newScore; +void CalculateRanks( void ) +{ + int i; + int rank; + int score; + int newScore; gclient_t *cl; level.follow1 = -1; @@ -872,47 +779,47 @@ void CalculateRanks( void ) { level.numLiveAlienClients = 0; level.numLiveHumanClients = 0; - for ( i = 0; i < TEAM_NUM_TEAMS; i++ ) { - level.numteamVotingClients[i] = 0; - } + for( i = 0; i < TEAM_NUM_TEAMS; i++ ) + level.numteamVotingClients[ i ] = 0; - for ( i = 0 ; i < level.maxclients ; i++ ) + for( i = 0; i < level.maxclients; i++ ) { - if ( level.clients[i].pers.connected != CON_DISCONNECTED ) + if ( level.clients[ i ].pers.connected != CON_DISCONNECTED ) { - level.sortedClients[level.numConnectedClients] = i; + level.sortedClients[ level.numConnectedClients ] = i; level.numConnectedClients++; //TA: so we know when the game ends and for team leveling - if( level.clients[i].pers.pteam == PTE_ALIENS ) + if( level.clients[ i ].pers.pteam == PTE_ALIENS ) { level.numAlienClients++; - if ( level.clients[i].sess.sessionTeam != TEAM_SPECTATOR ) + if( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR ) level.numLiveAlienClients++; } - if( level.clients[i].pers.pteam == PTE_HUMANS ) + if( level.clients[ i ].pers.pteam == PTE_HUMANS ) { level.numHumanClients++; - if ( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR ) + if( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR ) level.numLiveHumanClients++; } //////////////// - if ( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR ) + if( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR ) { level.numNonSpectatorClients++; // decide if this should be auto-followed - if ( level.clients[i].pers.connected == CON_CONNECTED ) + if( level.clients[ i ].pers.connected == CON_CONNECTED ) { level.numPlayingClients++; if( !(g_entities[ i ].r.svFlags & SVF_BOT) ) level.numVotingClients++; - if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) - level.numteamVotingClients[ 0 ]++; - else if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == PTE_ALIENS ) - level.numteamVotingClients[ 1 ]++; + + if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) + level.numteamVotingClients[ 0 ]++; + else if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == PTE_ALIENS ) + level.numteamVotingClients[ 1 ]++; if( level.follow1 == -1 ) level.follow1 = i; @@ -925,31 +832,37 @@ void CalculateRanks( void ) { } qsort( level.sortedClients, level.numConnectedClients, - sizeof(level.sortedClients[0]), SortRanks ); + sizeof( level.sortedClients[ 0 ] ), SortRanks ); // set the rank value for all clients that are connected and not spectators rank = -1; score = 0; - for ( i = 0; i < level.numPlayingClients; i++ ) { - cl = &level.clients[ level.sortedClients[i] ]; - newScore = cl->ps.persistant[PERS_SCORE]; - if ( i == 0 || newScore != score ) { + for( i = 0; i < level.numPlayingClients; i++ ) + { + cl = &level.clients[ level.sortedClients[ i ] ]; + newScore = cl->ps.persistant[ PERS_SCORE ]; + + if( i == 0 || newScore != score ) + { rank = i; // assume we aren't tied until the next client is checked - level.clients[ level.sortedClients[i] ].ps.persistant[PERS_RANK] = rank; - } else { + level.clients[ level.sortedClients[ i ] ].ps.persistant[ PERS_RANK ] = rank; + } + else + { // we are tied with the previous client - level.clients[ level.sortedClients[i-1] ].ps.persistant[PERS_RANK] = rank | RANK_TIED_FLAG; - level.clients[ level.sortedClients[i] ].ps.persistant[PERS_RANK] = rank | RANK_TIED_FLAG; + level.clients[ level.sortedClients[ i - 1 ] ].ps.persistant[ PERS_RANK ] = rank | RANK_TIED_FLAG; + level.clients[ level.sortedClients[ i ] ].ps.persistant[ PERS_RANK ] = rank | RANK_TIED_FLAG; } + score = newScore; } // set the CS_SCORES1/2 configstrings, which will be visible to everyone if( level.numConnectedClients == 0 ) { - trap_SetConfigstring( CS_SCORES1, va("%i", SCORE_NOT_PRESENT) ); - trap_SetConfigstring( CS_SCORES2, va("%i", SCORE_NOT_PRESENT) ); + trap_SetConfigstring( CS_SCORES1, va( "%i", SCORE_NOT_PRESENT ) ); + trap_SetConfigstring( CS_SCORES2, va( "%i", SCORE_NOT_PRESENT ) ); } else if( level.numConnectedClients == 1 ) { @@ -966,12 +879,11 @@ void CalculateRanks( void ) { } // see if it is time to end the level - CheckExitRules(); + CheckExitRules( ); // if we are at the intermission, send the new info to everyone - if ( level.intermissiontime ) { - SendScoreboardMessageToAllClients(); - } + if( level.intermissiontime ) + SendScoreboardMessageToAllClients( ); } @@ -1015,11 +927,11 @@ void MoveClientToIntermission( gentity_t *ent ) // move to the spot VectorCopy( level.intermission_origin, ent->s.origin ); VectorCopy( level.intermission_origin, ent->client->ps.origin ); - VectorCopy (level.intermission_angle, ent->client->ps.viewangles); + VectorCopy( level.intermission_angle, ent->client->ps.viewangles ); ent->client->ps.pm_type = PM_INTERMISSION; // clean up powerup info - memset( ent->client->ps.powerups, 0, sizeof(ent->client->ps.powerups) ); + memset( ent->client->ps.powerups, 0, sizeof( ent->client->ps.powerups ) ); ent->client->ps.eFlags = 0; ent->s.eFlags = 0; @@ -1037,21 +949,29 @@ FindIntermissionPoint This is also used for spectator spawns ================== */ -void FindIntermissionPoint( void ) { +void FindIntermissionPoint( void ) +{ gentity_t *ent, *target; vec3_t dir; // find the intermission spot - ent = G_Find (NULL, FOFS(classname), "info_player_intermission"); - if ( !ent ) { // the map creator forgot to put in an intermission point... - SelectSpawnPoint ( vec3_origin, level.intermission_origin, level.intermission_angle ); - } else { - VectorCopy (ent->s.origin, level.intermission_origin); - VectorCopy (ent->s.angles, level.intermission_angle); + ent = G_Find( NULL, FOFS( classname ), "info_player_intermission" ); + + if( !ent ) + { // the map creator forgot to put in an intermission point... + SelectSpawnPoint( vec3_origin, level.intermission_origin, level.intermission_angle ); + } + else + { + VectorCopy( ent->s.origin, level.intermission_origin ); + VectorCopy( ent->s.angles, level.intermission_angle ); // if it has a target, look towards it - if ( ent->target ) { + if( ent->target ) + { target = G_PickTarget( ent->target ); - if ( target ) { + + if( target ) + { VectorSubtract( target->s.origin, level.intermission_origin, dir ); vectoangles( dir, level.intermission_angle ); } @@ -1065,31 +985,34 @@ void FindIntermissionPoint( void ) { BeginIntermission ================== */ -void BeginIntermission( void ) { +void BeginIntermission( void ) +{ int i; gentity_t *client; - if ( level.intermissiontime ) { + if( level.intermissiontime ) return; // already active - } level.intermissiontime = level.time; - FindIntermissionPoint(); + FindIntermissionPoint( ); // move all clients to the intermission point - for (i=0 ; i< level.maxclients ; i++) { + for( i = 0; i < level.maxclients; i++ ) + { client = g_entities + i; - if (!client->inuse) + + if( !client->inuse ) continue; + // respawn if dead - if (client->health <= 0) { + if( client->health <= 0 ) respawn(client); - } + MoveClientToIntermission( client ); } // send the current scoring to all clients - SendScoreboardMessageToAllClients(); + SendScoreboardMessageToAllClients( ); } @@ -1102,8 +1025,9 @@ or moved to a new level based on the "nextmap" cvar ============= */ -void ExitLevel (void) { - int i; +void ExitLevel( void ) +{ + int i; gclient_t *cl; trap_SendConsoleCommand( EXEC_APPEND, "vstr nextmap\n" ); @@ -1140,9 +1064,10 @@ G_LogPrintf Print to the logfile with a time stamp if it is open ================= */ -void QDECL G_LogPrintf( const char *fmt, ... ) { - va_list argptr; - char string[1024]; +void QDECL G_LogPrintf( const char *fmt, ... ) +{ + va_list argptr; + char string[ 1024 ]; int min, tens, sec; sec = level.time / 1000; @@ -1152,19 +1077,17 @@ void QDECL G_LogPrintf( const char *fmt, ... ) { tens = sec / 10; sec -= tens * 10; - Com_sprintf( string, sizeof(string), "%3i:%i%i ", min, tens, sec ); + Com_sprintf( string, sizeof( string ), "%3i:%i%i ", min, tens, sec ); va_start( argptr, fmt ); vsprintf( string +7 , fmt,argptr ); va_end( argptr ); - if ( g_dedicated.integer ) { + if( g_dedicated.integer ) G_Printf( "%s", string + 7 ); - } - if ( !level.logFile ) { + if( !level.logFile ) return; - } trap_FS_Write( string, strlen( string ), level.logFile ); } @@ -1176,12 +1099,10 @@ LogExit Append information about this game to the log file ================ */ -void LogExit( const char *string ) { - int i, numSorted; +void LogExit( const char *string ) +{ + int i, numSorted; gclient_t *cl; -#ifdef MISSIONPACK // bk001205 - qboolean won = qtrue; -#endif G_LogPrintf( "Exit: %s\n", string ); @@ -1228,76 +1149,69 @@ If one or more players have not acknowledged the continue, the game will wait 10 seconds before going on. ================= */ -void CheckIntermissionExit( void ) { - int ready, notReady; - int i; +void CheckIntermissionExit( void ) +{ + int ready, notReady; + int i; gclient_t *cl; - int readyMask; + int readyMask; // see which players are ready ready = 0; notReady = 0; readyMask = 0; - for (i=0 ; i< g_maxclients.integer ; i++) { + for( i = 0; i < g_maxclients.integer; i++ ) + { cl = level.clients + i; - if ( cl->pers.connected != CON_CONNECTED ) { + if( cl->pers.connected != CON_CONNECTED ) continue; - } - if ( g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT ) { + + if( g_entities[ cl->ps.clientNum ].r.svFlags & SVF_BOT ) continue; - } - if ( cl->readyToExit ) { + if( cl->readyToExit ) + { ready++; - if ( i < 16 ) { + if( i < 16 ) readyMask |= 1 << i; - } - } else { - notReady++; } + else + notReady++; } - // copy the readyMask to each player's stats so - // it can be displayed on the scoreboard -/* for (i=0 ; i< g_maxclients.integer ; i++) { - cl = level.clients + i; - if ( cl->pers.connected != CON_CONNECTED ) { - continue; - } - cl->ps.stats[STAT_CLIENTS_READY] = readyMask; - }*/ trap_SetConfigstring( CS_CLIENTS_READY, va( "%d", readyMask ) ); // never exit in less than five seconds - if ( level.time < level.intermissiontime + 5000 ) { + if( level.time < level.intermissiontime + 5000 ) return; - } // if nobody wants to go, clear timer - if ( !ready ) { + if( !ready ) + { level.readyToExit = qfalse; return; } // if everyone wants to go, go now - if ( !notReady ) { - ExitLevel(); + if( !notReady ) + { + ExitLevel( ); return; } // the first person to ready starts the ten second timeout - if ( !level.readyToExit ) { + if( !level.readyToExit ) + { level.readyToExit = qtrue; level.exitTime = level.time; } // if we have waited ten seconds since at least one player // wanted to exit, go ahead - if ( level.time < level.exitTime + 10000 ) { + if( level.time < level.exitTime + 10000 ) return; - } - ExitLevel(); + ExitLevel( ); } /* @@ -1401,111 +1315,46 @@ FUNCTIONS CALLED EVERY FRAME CheckVote ================== */ -void CheckVote( void ) { - if ( level.voteExecuteTime && level.voteExecuteTime < level.time ) { +void CheckVote( void ) +{ + if( level.voteExecuteTime && level.voteExecuteTime < level.time ) + { level.voteExecuteTime = 0; trap_SendConsoleCommand( EXEC_APPEND, va("%s\n", level.voteString ) ); } - if ( !level.voteTime ) { + + if( !level.voteTime ) return; - } - if ( level.time - level.voteTime >= VOTE_TIME ) { + + if( level.time - level.voteTime >= VOTE_TIME ) + { trap_SendServerCommand( -1, "print \"Vote failed.\n\"" ); - } else { - if ( level.voteYes > level.numVotingClients/2 ) { + } + else + { + if( level.voteYes > level.numVotingClients / 2 ) + { // execute the command, then remove the vote trap_SendServerCommand( -1, "print \"Vote passed.\n\"" ); level.voteExecuteTime = level.time + 3000; - } else if ( level.voteNo >= level.numVotingClients/2 ) { + } + else if( level.voteNo >= level.numVotingClients / 2 ) + { // same behavior as a timeout trap_SendServerCommand( -1, "print \"Vote failed.\n\"" ); - } else { + } + else + { // still waiting for a majority return; } } + level.voteTime = 0; trap_SetConfigstring( CS_VOTE_TIME, "" ); - } -/* -================== -PrintTeam -================== -*/ -void PrintTeam(int team, char *message) { - int i; - - for ( i = 0 ; i < level.maxclients ; i++ ) { - if (level.clients[i].sess.sessionTeam != team) - continue; - trap_SendServerCommand( i, message ); - } -} - -/* -================== -SetLeader -================== -*/ -void SetLeader(int team, int client) { - int i; - - if ( level.clients[client].pers.connected == CON_DISCONNECTED ) { - PrintTeam(team, va("print \"%s is not connected\n\"", level.clients[client].pers.netname) ); - return; - } - if (level.clients[client].sess.sessionTeam != team) { - PrintTeam(team, va("print \"%s is not on the team anymore\n\"", level.clients[client].pers.netname) ); - return; - } - for ( i = 0 ; i < level.maxclients ; i++ ) { - if (level.clients[i].sess.sessionTeam != team) - continue; - if (level.clients[i].sess.teamLeader) { - level.clients[i].sess.teamLeader = qfalse; - ClientUserinfoChanged(i); - } - } - level.clients[client].sess.teamLeader = qtrue; - ClientUserinfoChanged( client ); - PrintTeam(team, va("print \"%s is the new team leader\n\"", level.clients[client].pers.netname) ); -} - -/* -================== -CheckTeamLeader -================== -*/ -void CheckTeamLeader( int team ) { - int i; - - for ( i = 0 ; i < level.maxclients ; i++ ) { - if (level.clients[i].sess.sessionTeam != team) - continue; - if (level.clients[i].sess.teamLeader) - break; - } - if (i >= level.maxclients) { - for ( i = 0 ; i < level.maxclients ; i++ ) { - if (level.clients[i].sess.sessionTeam != team) - continue; - if (!(g_entities[i].r.svFlags & SVF_BOT)) { - level.clients[i].sess.teamLeader = qtrue; - break; - } - } - for ( i = 0 ; i < level.maxclients ; i++ ) { - if (level.clients[i].sess.sessionTeam != team) - continue; - level.clients[i].sess.teamLeader = qtrue; - break; - } - } -} - /* ================== CheckTeamVote @@ -1536,15 +1385,7 @@ void CheckTeamVote( int team ) // execute the command, then remove the vote trap_SendServerCommand( -1, "print \"Team vote passed.\n\"" ); // - if( !Q_strncmp( "leader", level.teamVoteString[ cs_offset ], 6 ) ) - { - //set the team leader - SetLeader( team, atoi( level.teamVoteString[ cs_offset ] + 7 ) ); - } - else - { - trap_SendConsoleCommand( EXEC_APPEND, va( "%s\n", level.teamVoteString[ cs_offset ] ) ); - } + trap_SendConsoleCommand( EXEC_APPEND, va( "%s\n", level.teamVoteString[ cs_offset ] ) ); } else if( level.teamVoteNo[ cs_offset ] >= level.numteamVotingClients[ cs_offset ] / 2 ) { @@ -1568,16 +1409,18 @@ void CheckTeamVote( int team ) CheckCvars ================== */ -void CheckCvars( void ) { +void CheckCvars( void ) +{ static int lastMod = -1; - if ( g_password.modificationCount != lastMod ) { + if( g_password.modificationCount != lastMod ) + { lastMod = g_password.modificationCount; - if ( *g_password.string && Q_stricmp( g_password.string, "none" ) ) { + + if( *g_password.string && Q_stricmp( g_password.string, "none" ) ) trap_Cvar_Set( "g_needpass", "1" ); - } else { + else trap_Cvar_Set( "g_needpass", "0" ); - } } } @@ -1588,22 +1431,22 @@ G_RunThink Runs thinking code for this frame if necessary ============= */ -void G_RunThink (gentity_t *ent) { +void G_RunThink( gentity_t *ent ) +{ float thinktime; thinktime = ent->nextthink; - if (thinktime <= 0) { + if( thinktime <= 0 ) return; - } - if (thinktime > level.time) { + + if( thinktime > level.time ) return; - } ent->nextthink = 0; - if (!ent->think) { - G_Error ( "NULL ent->think"); - } - ent->think (ent); + if( !ent->think ) + G_Error( "NULL ent->think" ); + + ent->think( ent ); } /* @@ -1635,16 +1478,16 @@ G_RunFrame Advances the non-player objects in the world ================ */ -void G_RunFrame( int levelTime ) { - int i; +void G_RunFrame( int levelTime ) +{ + int i; gentity_t *ent; - int msec; -int start, end; + int msec; + int start, end; // if we are waiting for the level to restart, do nothing - if ( level.restarted ) { + if( level.restarted ) return; - } level.framenum++; level.previousTime = level.time; @@ -1652,15 +1495,15 @@ int start, end; msec = level.time - level.previousTime; // get any cvar changes - G_UpdateCvars(); + G_UpdateCvars( ); // // go through all allocated objects // -start = trap_Milliseconds(); - ent = &g_entities[0]; + start = trap_Milliseconds( ); + ent = &g_entities[ 0 ]; - for ( i = 0; i < level.num_entities; i++, ent++ ) + for( i = 0; i < level.num_entities; i++, ent++ ) { if( !ent->inuse ) continue; @@ -1694,18 +1537,17 @@ start = trap_Milliseconds(); } // temporary entities don't think - if ( ent->freeAfterEvent ) + if( ent->freeAfterEvent ) continue; //TA: calculate the acceleration of this entity if( ent->evaluateAcceleration ) G_EvaluateAcceleration( ent, msec ); - if ( !ent->r.linked && ent->neverFree ) { + if( !ent->r.linked && ent->neverFree ) continue; - } - if ( ent->s.eType == ET_MISSILE ) + if( ent->s.eType == ET_MISSILE ) { G_RunMissile( ent ); continue; @@ -1717,29 +1559,34 @@ start = trap_Milliseconds(); continue; } - if ( ent->s.eType == ET_MOVER ) { + if( ent->s.eType == ET_MOVER ) + { G_RunMover( ent ); continue; } - if ( i < MAX_CLIENTS ) { + if( i < MAX_CLIENTS ) + { G_RunClient( ent ); continue; } G_RunThink( ent ); } -end = trap_Milliseconds(); + end = trap_Milliseconds(); -start = trap_Milliseconds(); + start = trap_Milliseconds(); + // perform final fixups on the players - ent = &g_entities[0]; - for (i=0 ; i < level.maxclients ; i++, ent++ ) { - if ( ent->inuse ) { + ent = &g_entities[ 0 ]; + + for( i = 0; i < level.maxclients; i++, ent++ ) + { + if( ent->inuse ) ClientEndFrame( ent ); - } } -end = trap_Milliseconds(); + + end = trap_Milliseconds(); //TA: countSpawns( ); @@ -1747,26 +1594,27 @@ end = trap_Milliseconds(); CalculateStages( ); // see if it is time to end the level - CheckExitRules(); + CheckExitRules( ); // update to team status? - CheckTeamStatus(); + CheckTeamStatus( ); // cancel vote if timed out - CheckVote(); + CheckVote( ); // check team votes CheckTeamVote( PTE_HUMANS ); CheckTeamVote( PTE_ALIENS ); // for tracking changes - CheckCvars(); + CheckCvars( ); - if (g_listEntity.integer) { - for (i = 0; i < MAX_GENTITIES; i++) { - G_Printf("%4i: %s\n", i, g_entities[i].classname); - } - trap_Cvar_Set("g_listEntity", "0"); + if( g_listEntity.integer ) + { + for( i = 0; i < MAX_GENTITIES; i++ ) + G_Printf( "%4i: %s\n", i, g_entities[ i ].classname ); + + trap_Cvar_Set( "g_listEntity", "0" ); } } diff --git a/src/game/g_mem.c b/src/game/g_mem.c index 1e2dc24a..c553859b 100644 --- a/src/game/g_mem.c +++ b/src/game/g_mem.c @@ -136,12 +136,12 @@ void G_InitMemory( void ) { // Set up the initial node - freehead = (struct freememnode *) memoryPool; + freehead = (struct freememnode *)memoryPool; freehead->cookie = FREEMEMCOOKIE; freehead->size = POOLSIZE; freehead->next = NULL; freehead->prev = NULL; - freemem = sizeof(memoryPool); + freemem = sizeof( memoryPool ); } void G_DefragmentMemory( void ) @@ -199,34 +199,3 @@ void Svcmd_GameMem_f( void ) G_Printf( "Status complete.\n" ); } -/* Golliwog: All rewritten -static int allocPoint; - -void *G_Alloc( int size ) { - char *p; - - if ( g_debugAlloc.integer ) { - G_Printf( "G_Alloc of %i bytes (%i left)\n", size, POOLSIZE - allocPoint - ( ( size + 31 ) & ~31 ) ); - } - - if ( allocPoint + size > POOLSIZE ) { - G_Error( "G_Alloc: failed on allocation of %i bytes\n", size ); - return NULL; - } - - p = &memoryPool[allocPoint]; - - allocPoint += ( size + 31 ) & ~31; - - return p; -} - -void G_InitMemory( void ) { - allocPoint = 0; -} - -void Svcmd_GameMem_f( void ) { - G_Printf( "Game memory status: %i out of %i bytes allocated\n", allocPoint, POOLSIZE ); -} -// Golliwog. -*/ diff --git a/src/game/g_misc.c b/src/game/g_misc.c index 3562a142..eac7f2f0 100644 --- a/src/game/g_misc.c +++ b/src/game/g_misc.c @@ -26,7 +26,8 @@ Used to group brushes together just for editor convenience. They are turned int /*QUAKED info_camp (0 0.5 0) (-4 -4 -4) (4 4 4) Used as a positional target for calculations in the utilities (spotlights, etc), but removed during gameplay. */ -void SP_info_camp( gentity_t *self ) { +void SP_info_camp( gentity_t *self ) +{ G_SetOrigin( self, self->s.origin ); } @@ -34,7 +35,8 @@ void SP_info_camp( gentity_t *self ) { /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4) Used as a positional target for calculations in the utilities (spotlights, etc), but removed during gameplay. */ -void SP_info_null( gentity_t *self ) { +void SP_info_null( gentity_t *self ) +{ G_FreeEntity( self ); } @@ -43,7 +45,8 @@ void SP_info_null( gentity_t *self ) { Used as a positional target for in-game calculation, like jumppad targets. target_position does the same thing */ -void SP_info_notnull( gentity_t *self ){ +void SP_info_notnull( gentity_t *self ) +{ G_SetOrigin( self, self->s.origin ); } @@ -55,7 +58,8 @@ Linear checbox gives linear falloff instead of inverse square Lights pointed at a target will be spotlights. "radius" overrides the default 64 unit radius of a spotlight at the target point. */ -void SP_light( gentity_t *self ) { +void SP_light( gentity_t *self ) +{ G_FreeEntity( self ); } @@ -69,12 +73,14 @@ TELEPORTERS ================================================================================= */ -void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) { +void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) +{ gentity_t *tent; // use temp events at source and destination to prevent the effect // from getting dropped by a second player event - if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) { + if( player->client->sess.sessionTeam != TEAM_SPECTATOR ) + { tent = G_TempEntity( player->client->ps.origin, EV_PLAYER_TELEPORT_OUT ); tent->s.clientNum = player->s.clientNum; @@ -83,10 +89,10 @@ void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) { } // unlink to make sure it can't possibly interfere with G_KillBox - trap_UnlinkEntity (player); + trap_UnlinkEntity( player ); - VectorCopy ( origin, player->client->ps.origin ); - player->client->ps.origin[2] += 1; + VectorCopy( origin, player->client->ps.origin ); + player->client->ps.origin[ 2 ] += 1; // spit the player out AngleVectors( angles, player->client->ps.velocity, NULL, NULL ); @@ -101,9 +107,8 @@ void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) { SetClientViewAngle( player, angles ); // kill anything at the destination - if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) { - G_KillBox (player); - } + if( player->client->sess.sessionTeam != TEAM_SPECTATOR ) + G_KillBox( player ); // save results of pmove BG_PlayerStateToEntityState( &player->client->ps, &player->s, qtrue ); @@ -111,9 +116,8 @@ void TeleportPlayer( gentity_t *player, vec3_t origin, vec3_t angles ) { // use the precise origin for linking VectorCopy( player->client->ps.origin, player->r.currentOrigin ); - if ( player->client->sess.sessionTeam != TEAM_SPECTATOR ) { + if( player->client->sess.sessionTeam != TEAM_SPECTATOR ) trap_LinkEntity (player); - } } @@ -122,7 +126,8 @@ Point teleporters at these. Now that we don't have teleport destination pads, this is just an info_notnull */ -void SP_misc_teleporter_dest( gentity_t *ent ) { +void SP_misc_teleporter_dest( gentity_t *ent ) +{ } @@ -131,8 +136,8 @@ void SP_misc_teleporter_dest( gentity_t *ent ) { /*QUAKED misc_model (1 0 0) (-16 -16 -16) (16 16 16) "model" arbitrary .md3 file to display */ -void SP_misc_model( gentity_t *ent ) { - +void SP_misc_model( gentity_t *ent ) +{ #if 0 ent->s.modelindex = G_ModelIndex( ent->model ); VectorSet (ent->mins, -16, -16, -16); @@ -148,13 +153,15 @@ void SP_misc_model( gentity_t *ent ) { //=========================================================== -void locateCamera( gentity_t *ent ) { +void locateCamera( gentity_t *ent ) +{ vec3_t dir; gentity_t *target; gentity_t *owner; owner = G_PickTarget( ent->target ); - if ( !owner ) { + if( !owner ) + { G_Printf( "Couldn't find target for misc_partal_surface\n" ); G_FreeEntity( ent ); return; @@ -162,20 +169,19 @@ void locateCamera( gentity_t *ent ) { ent->r.ownerNum = owner->s.number; // frame holds the rotate speed - if ( owner->spawnflags & 1 ) { + if( owner->spawnflags & 1 ) ent->s.frame = 25; - } else if ( owner->spawnflags & 2 ) { + else if( owner->spawnflags & 2 ) ent->s.frame = 75; - } // swing camera ? - if ( owner->spawnflags & 4 ) { + if( owner->spawnflags & 4 ) + { // set to 0 for no rotation at all ent->s.powerups = 0; } - else { + else ent->s.powerups = 1; - } // clientNum holds the rotate offset ent->s.clientNum = owner->s.clientNum; @@ -184,12 +190,13 @@ void locateCamera( gentity_t *ent ) { // see if the portal_camera has a target target = G_PickTarget( owner->target ); - if ( target ) { + if( target ) + { VectorSubtract( target->s.origin, owner->s.origin, dir ); VectorNormalize( dir ); - } else { - G_SetMovedir( owner->s.angles, dir ); } + else + G_SetMovedir( owner->s.angles, dir ); ent->s.eventParm = DirToByte( dir ); } @@ -198,17 +205,21 @@ void locateCamera( gentity_t *ent ) { The portal surface nearest this entity will show a view from the targeted misc_portal_camera, or a mirror view if untargeted. This must be within 64 world units of the surface! */ -void SP_misc_portal_surface(gentity_t *ent) { +void SP_misc_portal_surface( gentity_t *ent ) +{ VectorClear( ent->r.mins ); VectorClear( ent->r.maxs ); - trap_LinkEntity (ent); + trap_LinkEntity( ent ); ent->r.svFlags = SVF_PORTAL; ent->s.eType = ET_PORTAL; - if ( !ent->target ) { + if( !ent->target ) + { VectorCopy( ent->s.origin, ent->s.origin2 ); - } else { + } + else + { ent->think = locateCamera; ent->nextthink = level.time + 100; } @@ -219,16 +230,17 @@ void SP_misc_portal_surface(gentity_t *ent) { The target for a misc_portal_director. You can set either angles or target another entity to determine the direction of view. "roll" an angle modifier to orient the camera around the target vector; */ -void SP_misc_portal_camera(gentity_t *ent) { +void SP_misc_portal_camera( gentity_t *ent ) +{ float roll; VectorClear( ent->r.mins ); VectorClear( ent->r.maxs ); - trap_LinkEntity (ent); + trap_LinkEntity( ent ); G_SpawnFloat( "roll", "0", &roll ); - ent->s.clientNum = roll/360.0 * 256; + ent->s.clientNum = roll / 360.0f * 256; } /* @@ -239,27 +251,29 @@ void SP_misc_portal_camera(gentity_t *ent) { ====================================================================== */ -void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) { +void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) +{ vec3_t dir; - float deg; + float deg; vec3_t up, right; // see if we have a target - if ( ent->enemy ) { + if( ent->enemy ) + { VectorSubtract( ent->enemy->r.currentOrigin, ent->s.origin, dir ); VectorNormalize( dir ); - } else { - VectorCopy( ent->movedir, dir ); } + else + VectorCopy( ent->movedir, dir ); // randomize a bit PerpendicularVector( up, dir ); CrossProduct( up, dir, right ); - deg = crandom() * ent->random; + deg = crandom( ) * ent->random; VectorMA( dir, deg, up, dir ); - deg = crandom() * ent->random; + deg = crandom( ) * ent->random; VectorMA( dir, deg, right, dir ); VectorNormalize( dir ); @@ -277,13 +291,15 @@ void Use_Shooter( gentity_t *ent, gentity_t *other, gentity_t *activator ) { } -static void InitShooter_Finish( gentity_t *ent ) { +static void InitShooter_Finish( gentity_t *ent ) +{ ent->enemy = G_PickTarget( ent->target ); ent->think = 0; ent->nextthink = 0; } -void InitShooter( gentity_t *ent, int weapon ) { +void InitShooter( gentity_t *ent, int weapon ) +{ ent->use = Use_Shooter; ent->s.weapon = weapon; @@ -291,15 +307,17 @@ void InitShooter( gentity_t *ent, int weapon ) { G_SetMovedir( ent->s.angles, ent->movedir ); - if ( !ent->random ) { + if( !ent->random ) ent->random = 1.0; - } + ent->random = sin( M_PI * ent->random / 180 ); // target might be a moving object, so we can't set movedir for it - if ( ent->target ) { + if( ent->target ) + { ent->think = InitShooter_Finish; ent->nextthink = level.time + 500; } + trap_LinkEntity( ent ); } @@ -307,7 +325,8 @@ void InitShooter( gentity_t *ent, int weapon ) { Fires at either the target or the current direction. "random" the number of degrees of deviance from the taget. (1.0 default) */ -void SP_shooter_rocket( gentity_t *ent ) { +void SP_shooter_rocket( gentity_t *ent ) +{ //InitShooter( ent, WP_ROCKET_LAUNCHER ); } @@ -315,7 +334,8 @@ void SP_shooter_rocket( gentity_t *ent ) { Fires at either the target or the current direction. "random" is the number of degrees of deviance from the taget. (1.0 default) */ -void SP_shooter_plasma( gentity_t *ent ) { +void SP_shooter_plasma( gentity_t *ent ) +{ //InitShooter( ent, WP_PLASMAGUN); } @@ -323,7 +343,8 @@ void SP_shooter_plasma( gentity_t *ent ) { Fires at either the target or the current direction. "random" is the number of degrees of deviance from the taget. (1.0 default) */ -void SP_shooter_grenade( gentity_t *ent ) { +void SP_shooter_grenade( gentity_t *ent ) +{ //InitShooter( ent, WP_GRENADE_LAUNCHER); } diff --git a/src/game/g_missile.c b/src/game/g_missile.c index 94381fdc..d7c44dcf 100644 --- a/src/game/g_missile.c +++ b/src/game/g_missile.c @@ -24,7 +24,8 @@ G_BounceMissile ================ */ -void G_BounceMissile( gentity_t *ent, trace_t *trace ) { +void G_BounceMissile( gentity_t *ent, trace_t *trace ) +{ vec3_t velocity; float dot; int hitTime; @@ -33,18 +34,20 @@ void G_BounceMissile( gentity_t *ent, trace_t *trace ) { hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction; BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity ); dot = DotProduct( velocity, trace->plane.normal ); - VectorMA( velocity, -2*dot, trace->plane.normal, ent->s.pos.trDelta ); + VectorMA( velocity, -2 * dot, trace->plane.normal, ent->s.pos.trDelta ); - if ( ent->s.eFlags & EF_BOUNCE_HALF ) { + if( ent->s.eFlags & EF_BOUNCE_HALF ) + { VectorScale( ent->s.pos.trDelta, 0.65, ent->s.pos.trDelta ); // check for stop - if ( trace->plane.normal[2] > 0.2 && VectorLength( ent->s.pos.trDelta ) < 40 ) { + if( trace->plane.normal[ 2 ] > 0.2 && VectorLength( ent->s.pos.trDelta ) < 40 ) + { G_SetOrigin( ent, trace->endpos ); return; } } - VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin); + VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin ); VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase ); ent->s.pos.trTime = level.time; } @@ -57,7 +60,8 @@ G_ExplodeMissile Explode a missile without an impact ================ */ -void G_ExplodeMissile( gentity_t *ent ) { +void G_ExplodeMissile( gentity_t *ent ) +{ vec3_t dir; vec3_t origin; @@ -66,8 +70,8 @@ void G_ExplodeMissile( gentity_t *ent ) { G_SetOrigin( ent, origin ); // we don't have a valid direction, so just point straight up - dir[0] = dir[1] = 0; - dir[2] = 1; + dir[ 0 ] = dir[ 1 ] = 0; + dir[ 2 ] = 1; ent->s.eType = ET_GENERAL; @@ -77,13 +81,13 @@ void G_ExplodeMissile( gentity_t *ent ) { ent->freeAfterEvent = qtrue; -/* // splash damage + // splash damage if ( ent->splashDamage ) { if( G_RadiusDamage( ent->r.currentOrigin, ent->parent, ent->splashDamage, ent->splashRadius, ent , ent->splashMethodOfDeath ) ) { g_entities[ent->r.ownerNum].client->accuracy_hits++; } - }*/ + } trap_LinkEntity( ent ); } @@ -95,33 +99,37 @@ G_MissileImpact ================ */ -void G_MissileImpact( gentity_t *ent, trace_t *trace ) { +void G_MissileImpact( gentity_t *ent, trace_t *trace ) +{ gentity_t *other; qboolean hitClient = qfalse; - other = &g_entities[trace->entityNum]; + other = &g_entities[ trace->entityNum ]; // check for bounce - if ( !other->takedamage && - ( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) { + if( !other->takedamage && + ( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) + { G_BounceMissile( ent, trace ); G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 ); return; } // impact damage - if (other->takedamage) { + if( other->takedamage ) + { // FIXME: wrong damage direction? - if ( ent->damage ) { + if( ent->damage ) + { vec3_t velocity; BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity ); - if ( VectorLength( velocity ) == 0 ) { - velocity[2] = 1; // stepped on a grenade - } - G_Damage (other, ent, &g_entities[ent->r.ownerNum], velocity, + if( VectorLength( velocity ) == 0 ) + velocity[ 2 ] = 1; // stepped on a grenade + + G_Damage( other, ent, &g_entities[ ent->r.ownerNum ], velocity, ent->s.origin, ent->damage, - 0, ent->methodOfDeath); + 0, ent->methodOfDeath ); } } @@ -147,14 +155,15 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace ) { // is it cheaper in bandwidth to just remove this ent and create a new // one, rather than changing the missile into the explosion? - if ( other->takedamage && other->client ) { + if( other->takedamage && other->client ) + { G_AddEvent( ent, EV_MISSILE_HIT, DirToByte( trace->plane.normal ) ); ent->s.otherEntityNum = other->s.number; - } else if( trace->surfaceFlags & SURF_METALSTEPS ) { + } + else if( trace->surfaceFlags & SURF_METALSTEPS ) G_AddEvent( ent, EV_MISSILE_MISS_METAL, DirToByte( trace->plane.normal ) ); - } else { + else G_AddEvent( ent, EV_MISSILE_MISS, DirToByte( trace->plane.normal ) ); - } ent->freeAfterEvent = qtrue; @@ -166,12 +175,13 @@ void G_MissileImpact( gentity_t *ent, trace_t *trace ) { G_SetOrigin( ent, trace->endpos ); // splash damage (doesn't apply to person directly hit) - if ( ent->splashDamage ) { + if( ent->splashDamage ) + { if( G_RadiusDamage( trace->endpos, ent->parent, ent->splashDamage, ent->splashRadius, - other, ent->splashMethodOfDeath ) ) { - if( !hitClient ) { - g_entities[ent->r.ownerNum].client->accuracy_hits++; - } + other, ent->splashMethodOfDeath ) ) + { + if( !hitClient ) + g_entities[ ent->r.ownerNum ].client->accuracy_hits++; } } @@ -221,10 +231,10 @@ void G_RunMissile( gentity_t *ent ) if( tr.fraction != 1 ) { // never explode or bounce on sky - if ( tr.surfaceFlags & SURF_NOIMPACT ) + if( tr.surfaceFlags & SURF_NOIMPACT ) { // If grapple, reset owner - if (ent->parent && ent->parent->client && ent->parent->client->hook == ent) + if( ent->parent && ent->parent->client && ent->parent->client->hook == ent ) ent->parent->client->hook = NULL; G_FreeEntity( ent ); @@ -287,46 +297,6 @@ gentity_t *fire_flamer( gentity_t *self, vec3_t start, vec3_t dir ) //============================================================================= -/* -================= -fire_plasma - -================= -*/ -gentity_t *fire_plasma( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize (dir); - - bolt = G_Spawn(); - bolt->classname = "plasma"; - bolt->nextthink = level.time + 10000; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_PLASMAGUN; - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = 20; - bolt->splashDamage = 15; - bolt->splashRadius = 20; - //bolt->methodOfDeath = MOD_FLAMER; - //bolt->splashMethodOfDeath = MOD_FLAMER_SPLASH; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - - bolt->s.pos.trType = TR_LINEAR; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, 2000, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - - VectorCopy (start, bolt->r.currentOrigin); - - return bolt; -} - /* ================= fire_pulseRifle diff --git a/src/game/g_mover.c b/src/game/g_mover.c index 13d99ff5..7327c4cd 100644 --- a/src/game/g_mover.c +++ b/src/game/g_mover.c @@ -28,13 +28,15 @@ PUSHMOVE void MatchTeam( gentity_t *teamLeader, int moverState, int time ); -typedef struct { +typedef struct +{ gentity_t *ent; vec3_t origin; vec3_t angles; float deltayaw; } pushed_t; -pushed_t pushed[MAX_GENTITIES], *pushed_p; + +pushed_t pushed[ MAX_GENTITIES ], *pushed_p; /* @@ -43,22 +45,22 @@ G_TestEntityPosition ============ */ -gentity_t *G_TestEntityPosition( gentity_t *ent ) { +gentity_t *G_TestEntityPosition( gentity_t *ent ) +{ trace_t tr; int mask; - if ( ent->clipmask ) { + if( ent->clipmask ) mask = ent->clipmask; - } else { + else mask = MASK_SOLID; - } - if ( ent->client ) { + + if( ent->client ) trap_Trace( &tr, ent->client->ps.origin, ent->r.mins, ent->r.maxs, ent->client->ps.origin, ent->s.number, mask ); - } else { + else trap_Trace( &tr, ent->s.pos.trBase, ent->r.mins, ent->r.maxs, ent->s.pos.trBase, ent->s.number, mask ); - } - if (tr.startsolid) + if( tr.startsolid ) return &g_entities[ tr.entityNum ]; return NULL; @@ -69,9 +71,10 @@ gentity_t *G_TestEntityPosition( gentity_t *ent ) { G_CreateRotationMatrix ================ */ -void G_CreateRotationMatrix(vec3_t angles, vec3_t matrix[3]) { - AngleVectors(angles, matrix[0], matrix[1], matrix[2]); - VectorInverse(matrix[1]); +void G_CreateRotationMatrix( vec3_t angles, vec3_t matrix[ 3 ] ) +{ + AngleVectors( angles, matrix[ 0 ], matrix[ 1 ], matrix[ 2 ] ); + VectorInverse( matrix[ 1 ] ); } /* @@ -79,11 +82,15 @@ void G_CreateRotationMatrix(vec3_t angles, vec3_t matrix[3]) { G_TransposeMatrix ================ */ -void G_TransposeMatrix(vec3_t matrix[3], vec3_t transpose[3]) { +void G_TransposeMatrix( vec3_t matrix[ 3 ], vec3_t transpose[ 3 ] ) +{ int i, j; - for (i = 0; i < 3; i++) { - for (j = 0; j < 3; j++) { - transpose[i][j] = matrix[j][i]; + + for( i = 0; i < 3; i++ ) + { + for( j = 0; j < 3; j++ ) + { + transpose[ i ][ j ] = matrix[ j ][ i ]; } } } @@ -93,13 +100,14 @@ void G_TransposeMatrix(vec3_t matrix[3], vec3_t transpose[3]) { G_RotatePoint ================ */ -void G_RotatePoint(vec3_t point, vec3_t matrix[3]) { +void G_RotatePoint( vec3_t point, vec3_t matrix[ 3 ] ) +{ vec3_t tvec; - VectorCopy(point, tvec); - point[0] = DotProduct(matrix[0], tvec); - point[1] = DotProduct(matrix[1], tvec); - point[2] = DotProduct(matrix[2], tvec); + VectorCopy( point, tvec ); + point[ 0 ] = DotProduct( matrix[ 0 ], tvec ); + point[ 1 ] = DotProduct( matrix[ 1 ], tvec ); + point[ 2 ] = DotProduct( matrix[ 2 ], tvec ); } /* @@ -109,28 +117,30 @@ G_TryPushingEntity Returns qfalse if the move is blocked ================== */ -qboolean G_TryPushingEntity( gentity_t *check, gentity_t *pusher, vec3_t move, vec3_t amove ) { - vec3_t matrix[3], transpose[3]; +qboolean G_TryPushingEntity( gentity_t *check, gentity_t *pusher, vec3_t move, vec3_t amove ) +{ + vec3_t matrix[ 3 ], transpose[ 3 ]; vec3_t org, org2, move2; gentity_t *block; // EF_MOVER_STOP will just stop when contacting another entity // instead of pushing it, but entities can still ride on top of it - if ( ( pusher->s.eFlags & EF_MOVER_STOP ) && - check->s.groundEntityNum != pusher->s.number ) { + if( ( pusher->s.eFlags & EF_MOVER_STOP ) && + check->s.groundEntityNum != pusher->s.number ) return qfalse; - } // save off the old position - if (pushed_p > &pushed[MAX_GENTITIES]) { + if( pushed_p > &pushed[ MAX_GENTITIES ] ) G_Error( "pushed_p > &pushed[MAX_GENTITIES]" ); - } + pushed_p->ent = check; - VectorCopy (check->s.pos.trBase, pushed_p->origin); - VectorCopy (check->s.apos.trBase, pushed_p->angles); - if ( check->client ) { - pushed_p->deltayaw = check->client->ps.delta_angles[YAW]; - VectorCopy (check->client->ps.origin, pushed_p->origin); + VectorCopy( check->s.pos.trBase, pushed_p->origin ); + VectorCopy( check->s.apos.trBase, pushed_p->angles ); + + if( check->client ) + { + pushed_p->deltayaw = check->client->ps.delta_angles[ YAW ]; + VectorCopy( check->client->ps.origin, pushed_p->origin ); } pushed_p++; @@ -138,52 +148,58 @@ qboolean G_TryPushingEntity( gentity_t *check, gentity_t *pusher, vec3_t move, // figure movement due to the pusher's amove G_CreateRotationMatrix( amove, transpose ); G_TransposeMatrix( transpose, matrix ); - if ( check->client ) { - VectorSubtract (check->client->ps.origin, pusher->r.currentOrigin, org); - } - else { - VectorSubtract (check->s.pos.trBase, pusher->r.currentOrigin, org); - } + + if( check->client ) + VectorSubtract( check->client->ps.origin, pusher->r.currentOrigin, org ); + else + VectorSubtract( check->s.pos.trBase, pusher->r.currentOrigin, org ); + VectorCopy( org, org2 ); G_RotatePoint( org2, matrix ); - VectorSubtract (org2, org, move2); + VectorSubtract( org2, org, move2 ); // add movement - VectorAdd (check->s.pos.trBase, move, check->s.pos.trBase); - VectorAdd (check->s.pos.trBase, move2, check->s.pos.trBase); - if ( check->client ) { - VectorAdd (check->client->ps.origin, move, check->client->ps.origin); - VectorAdd (check->client->ps.origin, move2, check->client->ps.origin); + VectorAdd( check->s.pos.trBase, move, check->s.pos.trBase ); + VectorAdd( check->s.pos.trBase, move2, check->s.pos.trBase ); + + if( check->client ) + { + VectorAdd( check->client->ps.origin, move, check->client->ps.origin ); + VectorAdd( check->client->ps.origin, move2, check->client->ps.origin ); // make sure the client's view rotates when on a rotating mover - check->client->ps.delta_angles[YAW] += ANGLE2SHORT(amove[YAW]); + check->client->ps.delta_angles[ YAW ] += ANGLE2SHORT( amove[ YAW ] ); } // may have pushed them off an edge - if ( check->s.groundEntityNum != pusher->s.number ) { + if( check->s.groundEntityNum != pusher->s.number ) check->s.groundEntityNum = -1; - } block = G_TestEntityPosition( check ); - if (!block) { + + if( !block ) + { // pushed ok - if ( check->client ) { + if( check->client ) VectorCopy( check->client->ps.origin, check->r.currentOrigin ); - } else { + else VectorCopy( check->s.pos.trBase, check->r.currentOrigin ); - } - trap_LinkEntity (check); + + trap_LinkEntity( check ); return qtrue; } // if it is ok to leave in the old position, do it // this is only relevent for riding entities, not pushed // Sliding trapdoors can cause this. - VectorCopy( (pushed_p-1)->origin, check->s.pos.trBase); - if ( check->client ) { - VectorCopy( (pushed_p-1)->origin, check->client->ps.origin); - } - VectorCopy( (pushed_p-1)->angles, check->s.apos.trBase ); - block = G_TestEntityPosition (check); - if ( !block ) { + VectorCopy( ( pushed_p - 1 )->origin, check->s.pos.trBase ); + + if( check->client ) + VectorCopy( ( pushed_p - 1 )->origin, check->client->ps.origin ); + + VectorCopy( ( pushed_p - 1 )->angles, check->s.apos.trBase ); + block = G_TestEntityPosition( check ); + + if( !block ) + { check->s.groundEntityNum = -1; pushed_p--; return qtrue; @@ -203,13 +219,14 @@ otherwise riders would continue to slide. If qfalse is returned, *obstacle will be the blocking entity ============ */ -qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t **obstacle ) { - int i, e; +qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t **obstacle ) +{ + int i, e; gentity_t *check; vec3_t mins, maxs; pushed_t *p; - int entityList[MAX_GENTITIES]; - int listedEntities; + int entityList[ MAX_GENTITIES ]; + int listedEntities; vec3_t totalMins, totalMaxs; *obstacle = NULL; @@ -217,31 +234,37 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** // mins/maxs are the bounds at the destination // totalMins / totalMaxs are the bounds for the entire move - if ( pusher->r.currentAngles[0] || pusher->r.currentAngles[1] || pusher->r.currentAngles[2] - || amove[0] || amove[1] || amove[2] ) { + if( pusher->r.currentAngles[ 0 ] || pusher->r.currentAngles[ 1 ] || pusher->r.currentAngles[ 2 ] + || amove[ 0 ] || amove[ 1 ] || amove[ 2 ] ) + { float radius; radius = RadiusFromBounds( pusher->r.mins, pusher->r.maxs ); - for ( i = 0 ; i < 3 ; i++ ) { - mins[i] = pusher->r.currentOrigin[i] + move[i] - radius; - maxs[i] = pusher->r.currentOrigin[i] + move[i] + radius; - totalMins[i] = mins[i] - move[i]; - totalMaxs[i] = maxs[i] - move[i]; + + for( i = 0 ; i < 3 ; i++ ) + { + mins[ i ] = pusher->r.currentOrigin[ i ] + move[ i ] - radius; + maxs[ i ] = pusher->r.currentOrigin[ i ] + move[ i ] + radius; + totalMins[ i ] = mins[ i ] - move[ i ]; + totalMaxs[ i ] = maxs[ i ] - move[ i ]; } - } else { - for (i=0 ; i<3 ; i++) { - mins[i] = pusher->r.absmin[i] + move[i]; - maxs[i] = pusher->r.absmax[i] + move[i]; + } + else + { + for( i = 0; i < 3; i++ ) + { + mins[ i ] = pusher->r.absmin[ i ] + move[ i ]; + maxs[ i ] = pusher->r.absmax[ i ] + move[ i ]; } VectorCopy( pusher->r.absmin, totalMins ); VectorCopy( pusher->r.absmax, totalMaxs ); - for (i=0 ; i<3 ; i++) { - if ( move[i] > 0 ) { - totalMaxs[i] += move[i]; - } else { - totalMins[i] += move[i]; - } + for( i = 0; i < 3; i++ ) + { + if( move[ i ] > 0 ) + totalMaxs[ i ] += move[ i ]; + else + totalMins[ i ] += move[ i ]; } } @@ -256,43 +279,43 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** trap_LinkEntity( pusher ); // see if any solid entities are inside the final position - for ( e = 0 ; e < listedEntities ; e++ ) { + for( e = 0 ; e < listedEntities ; e++ ) + { check = &g_entities[ entityList[ e ] ]; // only push items and players - if ( check->s.eType != ET_ITEM && check->s.eType != ET_BUILDABLE && - check->s.eType != ET_CORPSE && check->s.eType != ET_PLAYER && - !check->physicsObject ) { + if( check->s.eType != ET_ITEM && check->s.eType != ET_BUILDABLE && + check->s.eType != ET_CORPSE && check->s.eType != ET_PLAYER && + !check->physicsObject ) continue; - } // if the entity is standing on the pusher, it will definitely be moved - if ( check->s.groundEntityNum != pusher->s.number ) { + if( check->s.groundEntityNum != pusher->s.number ) + { // see if the ent needs to be tested - if ( check->r.absmin[0] >= maxs[0] - || check->r.absmin[1] >= maxs[1] - || check->r.absmin[2] >= maxs[2] - || check->r.absmax[0] <= mins[0] - || check->r.absmax[1] <= mins[1] - || check->r.absmax[2] <= mins[2] ) { + if( check->r.absmin[ 0 ] >= maxs[ 0 ] + || check->r.absmin[ 1 ] >= maxs[ 1 ] + || check->r.absmin[ 2 ] >= maxs[ 2 ] + || check->r.absmax[ 0 ] <= mins[ 0 ] + || check->r.absmax[ 1 ] <= mins[ 1 ] + || check->r.absmax[ 2 ] <= mins[ 2 ] ) continue; - } + // see if the ent's bbox is inside the pusher's final position // this does allow a fast moving object to pass through a thin entity... - if (!G_TestEntityPosition (check)) { + if( !G_TestEntityPosition( check ) ) continue; - } } // the entity needs to be pushed - if ( G_TryPushingEntity( check, pusher, move, amove ) ) { + if( G_TryPushingEntity( check, pusher, move, amove ) ) continue; - } // the move was blocked an entity // bobbing entities are instant-kill and never get blocked - if ( pusher->s.pos.trType == TR_SINE || pusher->s.apos.trType == TR_SINE ) { + if( pusher->s.pos.trType == TR_SINE || pusher->s.apos.trType == TR_SINE ) + { G_Damage( check, pusher, pusher, NULL, NULL, 99999, 0, MOD_CRUSH ); continue; } @@ -304,15 +327,20 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** // move back any entities we already moved // go backwards, so if the same entity was pushed // twice, it goes back to the original position - for ( p=pushed_p-1 ; p>=pushed ; p-- ) { - VectorCopy (p->origin, p->ent->s.pos.trBase); - VectorCopy (p->angles, p->ent->s.apos.trBase); - if ( p->ent->client ) { - p->ent->client->ps.delta_angles[YAW] = p->deltayaw; - VectorCopy (p->origin, p->ent->client->ps.origin); + for( p = pushed_p - 1; p >= pushed; p-- ) + { + VectorCopy( p->origin, p->ent->s.pos.trBase ); + VectorCopy( p->angles, p->ent->s.apos.trBase ); + + if( p->ent->client ) + { + p->ent->client->ps.delta_angles[ YAW ] = p->deltayaw; + VectorCopy( p->origin, p->ent->client->ps.origin ); } - trap_LinkEntity (p->ent); + + trap_LinkEntity( p->ent ); } + return qfalse; } @@ -325,7 +353,8 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t ** G_MoverTeam ================= */ -void G_MoverTeam( gentity_t *ent ) { +void G_MoverTeam( gentity_t *ent ) +{ vec3_t move, amove; gentity_t *part, *obstacle; vec3_t origin, angles; @@ -336,20 +365,22 @@ void G_MoverTeam( gentity_t *ent ) { // any moves or calling any think functions // if the move is blocked, all moved objects will be backed out pushed_p = pushed; - for (part = ent ; part ; part=part->teamchain) { + for( part = ent; part; part = part->teamchain ) + { // get current position BG_EvaluateTrajectory( &part->s.pos, level.time, origin ); BG_EvaluateTrajectory( &part->s.apos, level.time, angles ); VectorSubtract( origin, part->r.currentOrigin, move ); VectorSubtract( angles, part->r.currentAngles, amove ); - if ( !G_MoverPush( part, move, amove, &obstacle ) ) { + if( !G_MoverPush( part, move, amove, &obstacle ) ) break; // move was blocked - } } - if (part) { + if( part ) + { // go back to the previous position - for ( part = ent ; part ; part = part->teamchain ) { + for( part = ent; part; part = part->teamchain ) + { part->s.pos.trTime += level.time - level.previousTime; part->s.apos.trTime += level.time - level.previousTime; BG_EvaluateTrajectory( &part->s.pos, level.time, part->r.currentOrigin ); @@ -358,20 +389,22 @@ void G_MoverTeam( gentity_t *ent ) { } // if the pusher has a "blocked" function, call it - if (ent->blocked) { + if( ent->blocked ) ent->blocked( ent, obstacle ); - } + return; } // the move succeeded - for ( part = ent ; part ; part = part->teamchain ) { + for( part = ent; part; part = part->teamchain ) + { // call the reached function if time is at or past end point - if ( part->s.pos.trType == TR_LINEAR_STOP ) { - if ( level.time >= part->s.pos.trTime + part->s.pos.trDuration ) { - if ( part->reached ) { + if( part->s.pos.trType == TR_LINEAR_STOP ) + { + if( level.time >= part->s.pos.trTime + part->s.pos.trDuration ) + { + if( part->reached ) part->reached( part ); - } } } } @@ -383,17 +416,16 @@ G_RunMover ================ */ -void G_RunMover( gentity_t *ent ) { +void G_RunMover( gentity_t *ent ) +{ // if not a team captain, don't do anything, because // the captain will handle everything - if ( ent->flags & FL_TEAMSLAVE ) { + if( ent->flags & FL_TEAMSLAVE ) return; - } // if stationary at one of the positions, don't move anything - if ( ent->s.pos.trType != TR_STATIONARY || ent->s.apos.trType != TR_STATIONARY ) { + if( ent->s.pos.trType != TR_STATIONARY || ent->s.apos.trType != TR_STATIONARY ) G_MoverTeam( ent ); - } // check think function G_RunThink( ent ); @@ -414,37 +446,43 @@ Pos1 is "at rest", pos2 is "activated" SetMoverState =============== */ -void SetMoverState( gentity_t *ent, moverState_t moverState, int time ) { - vec3_t delta; - float f; +void SetMoverState( gentity_t *ent, moverState_t moverState, int time ) +{ + vec3_t delta; + float f; ent->moverState = moverState; ent->s.pos.trTime = time; - switch( moverState ) { - case MOVER_POS1: - VectorCopy( ent->pos1, ent->s.pos.trBase ); - ent->s.pos.trType = TR_STATIONARY; - break; - case MOVER_POS2: - VectorCopy( ent->pos2, ent->s.pos.trBase ); - ent->s.pos.trType = TR_STATIONARY; - break; - case MOVER_1TO2: - VectorCopy( ent->pos1, ent->s.pos.trBase ); - VectorSubtract( ent->pos2, ent->pos1, delta ); - f = 1000.0 / ent->s.pos.trDuration; - VectorScale( delta, f, ent->s.pos.trDelta ); - ent->s.pos.trType = TR_LINEAR_STOP; - break; - case MOVER_2TO1: - VectorCopy( ent->pos2, ent->s.pos.trBase ); - VectorSubtract( ent->pos1, ent->pos2, delta ); - f = 1000.0 / ent->s.pos.trDuration; - VectorScale( delta, f, ent->s.pos.trDelta ); - ent->s.pos.trType = TR_LINEAR_STOP; - break; - } + switch( moverState ) + { + case MOVER_POS1: + VectorCopy( ent->pos1, ent->s.pos.trBase ); + ent->s.pos.trType = TR_STATIONARY; + break; + + case MOVER_POS2: + VectorCopy( ent->pos2, ent->s.pos.trBase ); + ent->s.pos.trType = TR_STATIONARY; + break; + + case MOVER_1TO2: + VectorCopy( ent->pos1, ent->s.pos.trBase ); + VectorSubtract( ent->pos2, ent->pos1, delta ); + f = 1000.0 / ent->s.pos.trDuration; + VectorScale( delta, f, ent->s.pos.trDelta ); + ent->s.pos.trType = TR_LINEAR_STOP; + break; + + case MOVER_2TO1: + VectorCopy( ent->pos2, ent->s.pos.trBase ); + VectorSubtract( ent->pos1, ent->pos2, delta ); + f = 1000.0 / ent->s.pos.trDuration; + VectorScale( delta, f, ent->s.pos.trDelta ); + ent->s.pos.trType = TR_LINEAR_STOP; + break; + } + BG_EvaluateTrajectory( &ent->s.pos, level.time, ent->r.currentOrigin ); trap_LinkEntity( ent ); } @@ -457,12 +495,12 @@ All entities in a mover team will move from pos1 to pos2 in the same amount of time ================ */ -void MatchTeam( gentity_t *teamLeader, int moverState, int time ) { +void MatchTeam( gentity_t *teamLeader, int moverState, int time ) +{ gentity_t *slave; - for ( slave = teamLeader ; slave ; slave = slave->teamchain ) { + for( slave = teamLeader; slave; slave = slave->teamchain ) SetMoverState( slave, moverState, time ); - } } @@ -472,16 +510,16 @@ void MatchTeam( gentity_t *teamLeader, int moverState, int time ) { ReturnToPos1 ================ */ -void ReturnToPos1( gentity_t *ent ) { +void ReturnToPos1( gentity_t *ent ) +{ MatchTeam( ent, MOVER_2TO1, level.time ); // looping sound ent->s.loopSound = ent->soundLoop; // starting sound - if ( ent->sound2to1 ) { + if( ent->sound2to1 ) G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound2to1 ); - } } @@ -490,45 +528,45 @@ void ReturnToPos1( gentity_t *ent ) { Reached_BinaryMover ================ */ -void Reached_BinaryMover( gentity_t *ent ) { - +void Reached_BinaryMover( gentity_t *ent ) +{ // stop the looping sound ent->s.loopSound = ent->soundLoop; - if ( ent->moverState == MOVER_1TO2 ) { + if( ent->moverState == MOVER_1TO2 ) + { // reached pos2 SetMoverState( ent, MOVER_POS2, level.time ); // play sound - if ( ent->soundPos2 ) { + if( ent->soundPos2 ) G_AddEvent( ent, EV_GENERAL_SOUND, ent->soundPos2 ); - } // return to pos1 after a delay ent->think = ReturnToPos1; ent->nextthink = level.time + ent->wait; // fire targets - if ( !ent->activator ) { + if( !ent->activator ) ent->activator = ent; - } + G_UseTargets( ent, ent->activator ); - } else if ( ent->moverState == MOVER_2TO1 ) { + } + else if( ent->moverState == MOVER_2TO1 ) + { // reached pos1 SetMoverState( ent, MOVER_POS1, level.time ); // play sound - if ( ent->soundPos1 ) { + if( ent->soundPos1 ) G_AddEvent( ent, EV_GENERAL_SOUND, ent->soundPos1 ); - } // close areaportals - if ( ent->teammaster == ent || !ent->teammaster ) { + if( ent->teammaster == ent || !ent->teammaster ) trap_AdjustAreaPortalState( ent, qfalse ); - } - } else { - G_Error( "Reached_BinaryMover: bad moverState" ); } + else + G_Error( "Reached_BinaryMover: bad moverState" ); } @@ -537,73 +575,78 @@ void Reached_BinaryMover( gentity_t *ent ) { Use_BinaryMover ================ */ -void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator ) { +void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator ) +{ int total; int partial; // only the master should be used - if ( ent->flags & FL_TEAMSLAVE ) { + if( ent->flags & FL_TEAMSLAVE ) + { Use_BinaryMover( ent->teammaster, other, activator ); return; } ent->activator = activator; - if ( ent->moverState == MOVER_POS1 ) { + if( ent->moverState == MOVER_POS1 ) + { // start moving 50 msec later, becase if this was player // triggered, level.time hasn't been advanced yet MatchTeam( ent, MOVER_1TO2, level.time + 50 ); // starting sound - if ( ent->sound1to2 ) { + if( ent->sound1to2 ) G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound1to2 ); - } // looping sound ent->s.loopSound = ent->soundLoop; // open areaportal - if ( ent->teammaster == ent || !ent->teammaster ) { + if( ent->teammaster == ent || !ent->teammaster ) trap_AdjustAreaPortalState( ent, qtrue ); - } + return; } // if all the way up, just delay before coming down - if ( ent->moverState == MOVER_POS2 ) { + if( ent->moverState == MOVER_POS2 ) + { ent->nextthink = level.time + ent->wait; return; } // only partway down before reversing - if ( ent->moverState == MOVER_2TO1 ) { + if( ent->moverState == MOVER_2TO1 ) + { total = ent->s.pos.trDuration; partial = level.time - ent->s.pos.trTime; - if ( partial > total ) { + + if( partial > total ) partial = total; - } MatchTeam( ent, MOVER_1TO2, level.time - ( total - partial ) ); - if ( ent->sound1to2 ) { + if( ent->sound1to2 ) G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound1to2 ); - } + return; } // only partway up before reversing - if ( ent->moverState == MOVER_1TO2 ) { + if( ent->moverState == MOVER_1TO2 ) + { total = ent->s.pos.trDuration; partial = level.time - ent->s.pos.trTime; - if ( partial > total ) { + + if( partial > total ) partial = total; - } MatchTeam( ent, MOVER_2TO1, level.time - ( total - partial ) ); - if ( ent->sound2to1 ) { + if( ent->sound2to1 ) G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound2to1 ); - } + return; } } @@ -618,47 +661,48 @@ InitMover so the movement delta can be calculated ================ */ -void InitMover( gentity_t *ent ) { +void InitMover( gentity_t *ent ) +{ vec3_t move; - float distance; - float light; + float distance; + float light; vec3_t color; qboolean lightSet, colorSet; - char *sound; + char *sound; // if the "model2" key is set, use a seperate model // for drawing, but clip against the brushes - if ( ent->model2 ) { + if( ent->model2 ) ent->s.modelindex2 = G_ModelIndex( ent->model2 ); - } // if the "loopsound" key is set, use a constant looping sound when moving - if ( G_SpawnString( "noise", "100", &sound ) ) { + if( G_SpawnString( "noise", "100", &sound ) ) ent->s.loopSound = G_SoundIndex( sound ); - } // if the "color" or "light" keys are set, setup constantLight lightSet = G_SpawnFloat( "light", "100", &light ); colorSet = G_SpawnVector( "color", "1 1 1", color ); - if ( lightSet || colorSet ) { + + if( lightSet || colorSet ) + { int r, g, b, i; - r = color[0] * 255; - if ( r > 255 ) { + r = color[ 0 ] * 255; + if( r > 255 ) r = 255; - } - g = color[1] * 255; - if ( g > 255 ) { + + g = color[ 1 ] * 255; + if( g > 255 ) g = 255; - } - b = color[2] * 255; - if ( b > 255 ) { + + b = color[ 2 ] * 255; + if( b > 255 ) b = 255; - } + i = light / 4; - if ( i > 255 ) { + if( i > 255 ) i = 255; - } + ent->s.constantLight = r | ( g << 8 ) | ( b << 16 ) | ( i << 24 ); } @@ -669,8 +713,8 @@ void InitMover( gentity_t *ent ) { ent->moverState = MOVER_POS1; ent->r.svFlags = SVF_USE_CURRENT_ORIGIN; ent->s.eType = ET_MOVER; - VectorCopy (ent->pos1, ent->r.currentOrigin); - trap_LinkEntity (ent); + VectorCopy( ent->pos1, ent->r.currentOrigin ); + trap_LinkEntity( ent ); ent->s.pos.trType = TR_STATIONARY; VectorCopy( ent->pos1, ent->s.pos.trBase ); @@ -678,14 +722,14 @@ void InitMover( gentity_t *ent ) { // calculate time to reach second position from speed VectorSubtract( ent->pos2, ent->pos1, move ); distance = VectorLength( move ); - if ( ! ent->speed ) { + if( ! ent->speed ) ent->speed = 100; - } + VectorScale( move, ent->speed, ent->s.pos.trDelta ); ent->s.pos.trDuration = distance * 1000 / ent->speed; - if ( ent->s.pos.trDuration <= 0 ) { + + if( ent->s.pos.trDuration <= 0 ) ent->s.pos.trDuration = 1; - } } @@ -705,21 +749,22 @@ targeted by another entity. Blocked_Door ================ */ -void Blocked_Door( gentity_t *ent, gentity_t *other ) { +void Blocked_Door( gentity_t *ent, gentity_t *other ) +{ // remove anything other than a client - if ( !other->client ) { + if( !other->client ) + { // except CTF flags!!!! G_TempEntity( other->s.origin, EV_ITEM_POP ); G_FreeEntity( other ); return; } - if ( ent->damage ) { + if( ent->damage ) G_Damage( other, ent, ent, NULL, NULL, ent->damage, 0, MOD_CRUSH ); - } - if ( ent->spawnflags & 4 ) { + + if( ent->spawnflags & 4 ) return; // crushers don't reverse - } // reverse direction Use_BinaryMover( ent, ent, other ); @@ -730,27 +775,36 @@ void Blocked_Door( gentity_t *ent, gentity_t *other ) { Touch_DoorTriggerSpectator ================ */ -static void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_t *trace ) { - int i, axis; - vec3_t origin, dir, angles; +static void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_t *trace ) +{ + int i, axis; + vec3_t origin, dir, angles; axis = ent->count; - VectorClear(dir); - if (fabs(other->s.origin[axis] - ent->r.absmax[axis]) < - fabs(other->s.origin[axis] - ent->r.absmin[axis])) { - origin[axis] = ent->r.absmin[axis] - 10; - dir[axis] = -1; - } - else { - origin[axis] = ent->r.absmax[axis] + 10; - dir[axis] = 1; - } - for (i = 0; i < 3; i++) { - if (i == axis) continue; - origin[i] = (ent->r.absmin[i] + ent->r.absmax[i]) * 0.5; + VectorClear( dir ); + + if( fabs( other->s.origin[ axis ] - ent->r.absmax[ axis ] ) < + fabs( other->s.origin[ axis ] - ent->r.absmin[ axis ] ) ) + { + origin[ axis ] = ent->r.absmin[ axis ] - 10; + dir[ axis ] = -1; + } + else + { + origin[ axis ] = ent->r.absmax[ axis ] + 10; + dir[ axis ] = 1; + } + + for( i = 0; i < 3; i++ ) + { + if( i == axis ) + continue; + + origin[ i ] = ( ent->r.absmin[ i ] + ent->r.absmax[ i ] ) * 0.5; } - vectoangles(dir, angles); - TeleportPlayer(other, origin, angles ); + + vectoangles( dir, angles ); + TeleportPlayer( other, origin, angles ); } /* @@ -758,17 +812,17 @@ static void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_ Touch_DoorTrigger ================ */ -void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) { - if ( other->client && other->client->sess.sessionTeam == TEAM_SPECTATOR ) { +void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) +{ + if( other->client && other->client->sess.sessionTeam == TEAM_SPECTATOR ) + { // if the door is not open and not opening - if ( ent->parent->moverState != MOVER_1TO2 && - ent->parent->moverState != MOVER_POS2) { + if( ent->parent->moverState != MOVER_1TO2 && + ent->parent->moverState != MOVER_POS2 ) Touch_DoorTriggerSpectator( ent, other, trace ); - } } - else if ( ent->parent->moverState != MOVER_1TO2 ) { + else if( ent->parent->moverState != MOVER_1TO2 ) Use_BinaryMover( ent->parent, ent, other ); - } } @@ -780,51 +834,54 @@ All of the parts of a door have been spawned, so create a trigger that encloses all of them ====================== */ -void Think_SpawnNewDoorTrigger( gentity_t *ent ) { - gentity_t *other; +void Think_SpawnNewDoorTrigger( gentity_t *ent ) +{ + gentity_t *other; vec3_t mins, maxs; - int i, best; + int i, best; // set all of the slaves as shootable - for ( other = ent ; other ; other = other->teamchain ) { + for( other = ent; other; other = other->teamchain ) other->takedamage = qtrue; - } // find the bounds of everything on the team - VectorCopy (ent->r.absmin, mins); - VectorCopy (ent->r.absmax, maxs); + VectorCopy( ent->r.absmin, mins ); + VectorCopy( ent->r.absmax, maxs ); - for (other = ent->teamchain ; other ; other=other->teamchain) { - AddPointToBounds (other->r.absmin, mins, maxs); - AddPointToBounds (other->r.absmax, mins, maxs); + for( other = ent->teamchain; other; other=other->teamchain ) + { + AddPointToBounds( other->r.absmin, mins, maxs ); + AddPointToBounds( other->r.absmax, mins, maxs ); } // find the thinnest axis, which will be the one we expand best = 0; - for ( i = 1 ; i < 3 ; i++ ) { - if ( maxs[i] - mins[i] < maxs[best] - mins[best] ) { + for( i = 1; i < 3; i++ ) + { + if( maxs[ i ] - mins[ i ] < maxs[ best ] - mins[ best ] ) best = i; - } } - maxs[best] += 120; - mins[best] -= 120; + + maxs[ best ] += 120; + mins[ best ] -= 120; // create a trigger with this size - other = G_Spawn (); + other = G_Spawn( ); other->classname = "door_trigger"; - VectorCopy (mins, other->r.mins); - VectorCopy (maxs, other->r.maxs); + VectorCopy( mins, other->r.mins ); + VectorCopy( maxs, other->r.maxs ); other->parent = ent; other->r.contents = CONTENTS_TRIGGER; other->touch = Touch_DoorTrigger; // remember the thinnest axis other->count = best; - trap_LinkEntity (other); + trap_LinkEntity( other ); MatchTeam( ent, ent->moverState, level.time ); } -void Think_MatchTeam( gentity_t *ent ) { +void Think_MatchTeam( gentity_t *ent ) +{ MatchTeam( ent, ent->moverState, level.time ); } @@ -845,24 +902,26 @@ NOMONSTER monsters will not trigger this door "light" constantLight radius "health" if set, the door must be shot open */ -void SP_func_door (gentity_t *ent) { +void SP_func_door( gentity_t *ent ) +{ vec3_t abs_movedir; - float distance; + float distance; vec3_t size; - float lip; + float lip; - ent->sound1to2 = ent->sound2to1 = G_SoundIndex("sound/movers/doors/dr1_strt.wav"); - ent->soundPos1 = ent->soundPos2 = G_SoundIndex("sound/movers/doors/dr1_end.wav"); + ent->sound1to2 = ent->sound2to1 = G_SoundIndex( "sound/movers/doors/dr1_strt.wav" ); + ent->soundPos1 = ent->soundPos2 = G_SoundIndex( "sound/movers/doors/dr1_end.wav" ); ent->blocked = Blocked_Door; // default speed of 400 - if (!ent->speed) + if( !ent->speed ) ent->speed = 400; // default wait of 2 seconds - if (!ent->wait) + if( !ent->wait ) ent->wait = 2; + ent->wait *= 1000; // default lip of 8 units @@ -876,16 +935,17 @@ void SP_func_door (gentity_t *ent) { // calculate second position trap_SetBrushModel( ent, ent->model ); - G_SetMovedir (ent->s.angles, ent->movedir); - abs_movedir[0] = fabs(ent->movedir[0]); - abs_movedir[1] = fabs(ent->movedir[1]); - abs_movedir[2] = fabs(ent->movedir[2]); + G_SetMovedir( ent->s.angles, ent->movedir ); + abs_movedir[ 0 ] = fabs( ent->movedir[ 0 ] ); + abs_movedir[ 1 ] = fabs( ent->movedir[ 1 ] ); + abs_movedir[ 2 ] = fabs( ent->movedir[ 2 ] ); VectorSubtract( ent->r.maxs, ent->r.mins, size ); distance = DotProduct( abs_movedir, size ) - lip; VectorMA( ent->pos1, distance, ent->movedir, ent->pos2 ); // if "start_open", reverse position 1 and 2 - if ( ent->spawnflags & 1 ) { + if( ent->spawnflags & 1 ) + { vec3_t temp; VectorCopy( ent->pos2, temp ); @@ -897,22 +957,22 @@ void SP_func_door (gentity_t *ent) { ent->nextthink = level.time + FRAMETIME; - if ( ! (ent->flags & FL_TEAMSLAVE ) ) { + if( ! (ent->flags & FL_TEAMSLAVE ) ) + { int health; G_SpawnInt( "health", "0", &health ); - if ( health ) { + if( health ) ent->takedamage = qtrue; - } - if ( ent->targetname || health ) { + + if( ent->targetname || health ) + { // non touch/shoot doors ent->think = Think_MatchTeam; - } else { - ent->think = Think_SpawnNewDoorTrigger; } + else + ent->think = Think_SpawnNewDoorTrigger; } - - } /* @@ -930,15 +990,14 @@ Touch_Plat Don't allow decent if a living player is on it =============== */ -void Touch_Plat( gentity_t *ent, gentity_t *other, trace_t *trace ) { - if ( !other->client || other->client->ps.stats[STAT_HEALTH] <= 0 ) { +void Touch_Plat( gentity_t *ent, gentity_t *other, trace_t *trace ) +{ + if( !other->client || other->client->ps.stats[ STAT_HEALTH ] <= 0 ) return; - } // delay return-to-pos1 by one second - if ( ent->moverState == MOVER_POS2 ) { + if( ent->moverState == MOVER_POS2 ) ent->nextthink = level.time + 1000; - } } /* @@ -948,14 +1007,13 @@ Touch_PlatCenterTrigger If the plat is at the bottom position, start it going up =============== */ -void Touch_PlatCenterTrigger(gentity_t *ent, gentity_t *other, trace_t *trace ) { - if ( !other->client ) { +void Touch_PlatCenterTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) +{ + if( !other->client ) return; - } - if ( ent->parent->moverState == MOVER_POS1 ) { + if( ent->parent->moverState == MOVER_POS1 ) Use_BinaryMover( ent->parent, ent, other ); - } } @@ -968,39 +1026,43 @@ Elevator cars require that the trigger extend through the entire low position, not just sit on top of it. ================ */ -void SpawnPlatTrigger( gentity_t *ent ) { +void SpawnPlatTrigger( gentity_t *ent ) +{ gentity_t *trigger; - vec3_t tmin, tmax; + vec3_t tmin, tmax; // the middle trigger will be a thin trigger just // above the starting position - trigger = G_Spawn(); + trigger = G_Spawn( ); trigger->classname = "plat_trigger"; trigger->touch = Touch_PlatCenterTrigger; trigger->r.contents = CONTENTS_TRIGGER; trigger->parent = ent; - tmin[0] = ent->pos1[0] + ent->r.mins[0] + 33; - tmin[1] = ent->pos1[1] + ent->r.mins[1] + 33; - tmin[2] = ent->pos1[2] + ent->r.mins[2]; + tmin[ 0 ] = ent->pos1[ 0 ] + ent->r.mins[ 0 ] + 33; + tmin[ 1 ] = ent->pos1[ 1 ] + ent->r.mins[ 1 ] + 33; + tmin[ 2 ] = ent->pos1[ 2 ] + ent->r.mins[ 2 ]; - tmax[0] = ent->pos1[0] + ent->r.maxs[0] - 33; - tmax[1] = ent->pos1[1] + ent->r.maxs[1] - 33; - tmax[2] = ent->pos1[2] + ent->r.maxs[2] + 8; + tmax[ 0 ] = ent->pos1[ 0 ] + ent->r.maxs[ 0 ] - 33; + tmax[ 1 ] = ent->pos1[ 1 ] + ent->r.maxs[ 1 ] - 33; + tmax[ 2 ] = ent->pos1[ 2 ] + ent->r.maxs[ 2 ] + 8; - if ( tmax[0] <= tmin[0] ) { - tmin[0] = ent->pos1[0] + (ent->r.mins[0] + ent->r.maxs[0]) *0.5; - tmax[0] = tmin[0] + 1; + if( tmax[ 0 ] <= tmin[ 0 ] ) + { + tmin[ 0 ] = ent->pos1[ 0 ] + ( ent->r.mins[ 0 ] + ent->r.maxs[ 0 ] ) * 0.5; + tmax[ 0 ] = tmin[ 0 ] + 1; } - if ( tmax[1] <= tmin[1] ) { - tmin[1] = ent->pos1[1] + (ent->r.mins[1] + ent->r.maxs[1]) *0.5; - tmax[1] = tmin[1] + 1; + + if( tmax[ 1 ] <= tmin[ 1 ] ) + { + tmin[ 1 ] = ent->pos1[ 1 ] + ( ent->r.mins[ 1 ] + ent->r.maxs[ 1 ] ) * 0.5; + tmax[ 1 ] = tmin[ 1 ] + 1; } - VectorCopy (tmin, trigger->r.mins); - VectorCopy (tmax, trigger->r.maxs); + VectorCopy( tmin, trigger->r.mins ); + VectorCopy( tmax, trigger->r.maxs ); - trap_LinkEntity (trigger); + trap_LinkEntity( trigger ); } @@ -1015,13 +1077,14 @@ Plats are always drawn in the extended position so they will light correctly. "color" constantLight color "light" constantLight radius */ -void SP_func_plat (gentity_t *ent) { - float lip, height; +void SP_func_plat( gentity_t *ent ) +{ + float lip, height; - ent->sound1to2 = ent->sound2to1 = G_SoundIndex("sound/movers/plats/pt1_strt.wav"); - ent->soundPos1 = ent->soundPos2 = G_SoundIndex("sound/movers/plats/pt1_end.wav"); + ent->sound1to2 = ent->sound2to1 = G_SoundIndex( "sound/movers/plats/pt1_strt.wav" ); + ent->soundPos1 = ent->soundPos2 = G_SoundIndex( "sound/movers/plats/pt1_end.wav" ); - VectorClear (ent->s.angles); + VectorClear( ent->s.angles ); G_SpawnFloat( "speed", "200", &ent->speed ); G_SpawnInt( "dmg", "2", &ent->damage ); @@ -1033,14 +1096,13 @@ void SP_func_plat (gentity_t *ent) { // create second position trap_SetBrushModel( ent, ent->model ); - if ( !G_SpawnFloat( "height", "0", &height ) ) { - height = (ent->r.maxs[2] - ent->r.mins[2]) - lip; - } + if( !G_SpawnFloat( "height", "0", &height ) ) + height = ( ent->r.maxs[ 2 ] - ent->r.mins[ 2 ] ) - lip; // pos1 is the rest (bottom) position, pos2 is the top VectorCopy( ent->s.origin, ent->pos2 ); VectorCopy( ent->pos2, ent->pos1 ); - ent->pos1[2] -= height; + ent->pos1[ 2 ] -= height; InitMover( ent ); @@ -1053,9 +1115,8 @@ void SP_func_plat (gentity_t *ent) { ent->parent = ent; // so it can be treated as a door // spawn the trigger if one hasn't been custom made - if ( !ent->targetname ) { - SpawnPlatTrigger(ent); - } + if( !ent->targetname ) + SpawnPlatTrigger( ent ); } @@ -1073,14 +1134,13 @@ Touch_Button =============== */ -void Touch_Button(gentity_t *ent, gentity_t *other, trace_t *trace ) { - if ( !other->client ) { +void Touch_Button( gentity_t *ent, gentity_t *other, trace_t *trace ) +{ + if( !other->client ) return; - } - if ( ent->moverState == MOVER_POS1 ) { + if( ent->moverState == MOVER_POS1 ) Use_BinaryMover( ent, other, other ); - } } @@ -1097,21 +1157,21 @@ When a button is touched, it moves some distance in the direction of it's angle, "color" constantLight color "light" constantLight radius */ -void SP_func_button( gentity_t *ent ) { - vec3_t abs_movedir; +void SP_func_button( gentity_t *ent ) +{ + vec3_t abs_movedir; float distance; - vec3_t size; + vec3_t size; float lip; - ent->sound1to2 = G_SoundIndex("sound/movers/switches/butn2.wav"); + ent->sound1to2 = G_SoundIndex( "sound/movers/switches/butn2.wav" ); - if ( !ent->speed ) { + if( !ent->speed ) ent->speed = 40; - } - if ( !ent->wait ) { + if( !ent->wait ) ent->wait = 1; - } + ent->wait *= 1000; // first position @@ -1123,17 +1183,20 @@ void SP_func_button( gentity_t *ent ) { G_SpawnFloat( "lip", "4", &lip ); G_SetMovedir( ent->s.angles, ent->movedir ); - abs_movedir[0] = fabs(ent->movedir[0]); - abs_movedir[1] = fabs(ent->movedir[1]); - abs_movedir[2] = fabs(ent->movedir[2]); + abs_movedir[ 0 ] = fabs( ent->movedir[ 0 ] ); + abs_movedir[ 1 ] = fabs( ent->movedir[ 1 ] ); + abs_movedir[ 2 ] = fabs( ent->movedir[ 2 ] ); VectorSubtract( ent->r.maxs, ent->r.mins, size ); - distance = abs_movedir[0] * size[0] + abs_movedir[1] * size[1] + abs_movedir[2] * size[2] - lip; - VectorMA (ent->pos1, distance, ent->movedir, ent->pos2); + distance = abs_movedir[ 0 ] * size[ 0 ] + abs_movedir[ 1 ] * size[ 1 ] + abs_movedir[ 2 ] * size[ 2 ] - lip; + VectorMA( ent->pos1, distance, ent->movedir, ent->pos2 ); - if (ent->health) { + if( ent->health ) + { // shootable button ent->takedamage = qtrue; - } else { + } + else + { // touchable button ent->touch = Touch_Button; } @@ -1163,7 +1226,8 @@ Think_BeginMoving The wait time at a corner has completed, so start moving again =============== */ -void Think_BeginMoving( gentity_t *ent ) { +void Think_BeginMoving( gentity_t *ent ) +{ ent->s.pos.trTime = level.time; ent->s.pos.trType = TR_LINEAR_STOP; } @@ -1173,17 +1237,17 @@ void Think_BeginMoving( gentity_t *ent ) { Reached_Train =============== */ -void Reached_Train( gentity_t *ent ) { - gentity_t *next; +void Reached_Train( gentity_t *ent ) +{ + gentity_t *next; float speed; - vec3_t move; + vec3_t move; float length; // copy the apropriate values next = ent->nextTrain; - if ( !next || !next->nextTrain ) { + if( !next || !next->nextTrain ) return; // just stop - } // fire all other targets G_UseTargets( next, NULL ); @@ -1194,15 +1258,18 @@ void Reached_Train( gentity_t *ent ) { VectorCopy( next->nextTrain->s.origin, ent->pos2 ); // if the path_corner has a speed, use that - if ( next->speed ) { + if( next->speed ) + { speed = next->speed; - } else { + } + else + { // otherwise use the train's speed speed = ent->speed; } - if ( speed < 1 ) { + + if( speed < 1 ) speed = 1; - } // calculate duration VectorSubtract( ent->pos2, ent->pos1, move ); @@ -1217,7 +1284,8 @@ void Reached_Train( gentity_t *ent ) { SetMoverState( ent, MOVER_1TO2, level.time ); // if there is a "wait" value on the target, don't start moving yet - if ( next->wait ) { + if( next->wait ) + { ent->nextthink = level.time + next->wait * 1000; ent->think = Think_BeginMoving; ent->s.pos.trType = TR_STATIONARY; @@ -1232,25 +1300,29 @@ Think_SetupTrainTargets Link all the corners together =============== */ -void Think_SetupTrainTargets( gentity_t *ent ) { - gentity_t *path, *next, *start; - - ent->nextTrain = G_Find( NULL, FOFS(targetname), ent->target ); - if ( !ent->nextTrain ) { +void Think_SetupTrainTargets( gentity_t *ent ) +{ + gentity_t *path, *next, *start; + + ent->nextTrain = G_Find( NULL, FOFS( targetname ), ent->target ); + + if( !ent->nextTrain ) + { G_Printf( "func_train at %s with an unfound target\n", - vtos(ent->r.absmin) ); + vtos( ent->r.absmin ) ); return; } start = NULL; - for ( path = ent->nextTrain ; path != start ; path = next ) { - if ( !start ) { + for( path = ent->nextTrain; path != start; path = next ) + { + if( !start ) start = path; - } - if ( !path->target ) { + if( !path->target ) + { G_Printf( "Train corner at %s without a target\n", - vtos(path->s.origin) ); + vtos( path->s.origin ) ); return; } @@ -1258,14 +1330,17 @@ void Think_SetupTrainTargets( gentity_t *ent ) { // there may also be other targets that get fired when the corner // is reached next = NULL; - do { - next = G_Find( next, FOFS(targetname), path->target ); - if ( !next ) { + do + { + next = G_Find( next, FOFS( targetname ), path->target ); + + if( !next ) + { G_Printf( "Train corner at %s without a target path_corner\n", - vtos(path->s.origin) ); + vtos( path->s.origin ) ); return; } - } while ( strcmp( next->classname, "path_corner" ) ); + } while( strcmp( next->classname, "path_corner" ) ); path->nextTrain = next; } @@ -1282,9 +1357,11 @@ Target: next path corner and other targets to fire "speed" speed to move to the next corner "wait" seconds to wait before behining move to next corner */ -void SP_path_corner( gentity_t *self ) { - if ( !self->targetname ) { - G_Printf ("path_corner with no targetname at %s\n", vtos(self->s.origin)); +void SP_path_corner( gentity_t *self ) +{ + if( !self->targetname ) + { + G_Printf( "path_corner with no targetname at %s\n", vtos( self->s.origin ) ); G_FreeEntity( self ); return; } @@ -1305,23 +1382,23 @@ The train spawns at the first target it is pointing at. "color" constantLight color "light" constantLight radius */ -void SP_func_train (gentity_t *self) { - VectorClear (self->s.angles); +void SP_func_train( gentity_t *self ) +{ + VectorClear( self->s.angles ); - if (self->spawnflags & TRAIN_BLOCK_STOPS) { + if( self->spawnflags & TRAIN_BLOCK_STOPS ) + { self->damage = 0; - } else { - if (!self->damage) { - self->damage = 2; - } } + else if( !self->damage ) + self->damage = 2; - if ( !self->speed ) { + if( !self->speed ) self->speed = 100; - } - if ( !self->target ) { - G_Printf ("func_train without a target at %s\n", vtos(self->r.absmin)); + if( !self->target ) + { + G_Printf( "func_train without a target at %s\n", vtos( self->r.absmin ) ); G_FreeEntity( self ); return; } @@ -1352,7 +1429,8 @@ A bmodel that just sits there, doing nothing. Can be used for conditional walls "color" constantLight color "light" constantLight radius */ -void SP_func_static( gentity_t *ent ) { +void SP_func_static( gentity_t *ent ) +{ trap_SetBrushModel( ent, ent->model ); InitMover( ent ); VectorCopy( ent->s.origin, ent->s.pos.trBase ); @@ -1380,24 +1458,23 @@ check either the X_AXIS or Y_AXIS box to change that. "color" constantLight color "light" constantLight radius */ -void SP_func_rotating (gentity_t *ent) { - if ( !ent->speed ) { +void SP_func_rotating( gentity_t *ent ) +{ + if( !ent->speed ) ent->speed = 100; - } // set the axis of rotation ent->s.apos.trType = TR_LINEAR; - if ( ent->spawnflags & 4 ) { - ent->s.apos.trDelta[2] = ent->speed; - } else if ( ent->spawnflags & 8 ) { - ent->s.apos.trDelta[0] = ent->speed; - } else { - ent->s.apos.trDelta[1] = ent->speed; - } - if (!ent->damage) { + if( ent->spawnflags & 4 ) + ent->s.apos.trDelta[ 2 ] = ent->speed; + else if( ent->spawnflags & 8 ) + ent->s.apos.trDelta[ 0 ] = ent->speed; + else + ent->s.apos.trDelta[ 1 ] = ent->speed; + + if( !ent->damage ) ent->damage = 2; - } trap_SetBrushModel( ent, ent->model ); InitMover( ent ); @@ -1429,7 +1506,8 @@ Normally bobs on the Z axis "color" constantLight color "light" constantLight radius */ -void SP_func_bobbing (gentity_t *ent) { +void SP_func_bobbing( gentity_t *ent ) +{ float height; float phase; @@ -1449,13 +1527,12 @@ void SP_func_bobbing (gentity_t *ent) { ent->s.pos.trType = TR_SINE; // set the axis of bobbing - if ( ent->spawnflags & 1 ) { - ent->s.pos.trDelta[0] = height; - } else if ( ent->spawnflags & 2 ) { - ent->s.pos.trDelta[1] = height; - } else { - ent->s.pos.trDelta[2] = height; - } + if( ent->spawnflags & 1 ) + ent->s.pos.trDelta[ 0 ] = height; + else if( ent->spawnflags & 2 ) + ent->s.pos.trDelta[ 1 ] = height; + else + ent->s.pos.trDelta[ 2 ] = height; } /* @@ -1478,11 +1555,12 @@ Pendulum frequency is a physical constant based on the length of the beam and gr "color" constantLight color "light" constantLight radius */ -void SP_func_pendulum(gentity_t *ent) { - float freq; - float length; - float phase; - float speed; +void SP_func_pendulum( gentity_t *ent ) +{ + float freq; + float length; + float phase; + float speed; G_SpawnFloat( "speed", "30", &speed ); G_SpawnInt( "dmg", "2", &ent->damage ); @@ -1491,10 +1569,10 @@ void SP_func_pendulum(gentity_t *ent) { trap_SetBrushModel( ent, ent->model ); // find pendulum length - length = fabs( ent->r.mins[2] ); - if ( length < 8 ) { + length = fabs( ent->r.mins[ 2 ] ); + + if( length < 8 ) length = 8; - } freq = 1 / ( M_PI * 2 ) * sqrt( g_gravity.value / ( 3 * length ) ); @@ -1510,5 +1588,5 @@ void SP_func_pendulum(gentity_t *ent) { ent->s.apos.trDuration = 1000 / freq; ent->s.apos.trTime = ent->s.apos.trDuration * phase; ent->s.apos.trType = TR_SINE; - ent->s.apos.trDelta[2] = speed; + ent->s.apos.trDelta[ 2 ] = speed; } diff --git a/src/game/g_session.c b/src/game/g_session.c index 0ac65709..7f44d5b0 100644 --- a/src/game/g_session.c +++ b/src/game/g_session.c @@ -34,11 +34,12 @@ G_WriteClientSessionData Called on game shutdown ================ */ -void G_WriteClientSessionData( gclient_t *client ) { +void G_WriteClientSessionData( gclient_t *client ) +{ const char *s; const char *var; - s = va("%i %i %i %i %i %i %i", + s = va( "%i %i %i %i %i %i %i", client->sess.sessionTeam, client->sess.spectatorTime, client->sess.spectatorState, @@ -60,8 +61,9 @@ G_ReadSessionData Called on a reconnect ================ */ -void G_ReadSessionData( gclient_t *client ) { - char s[MAX_STRING_CHARS]; +void G_ReadSessionData( gclient_t *client ) +{ + char s[ MAX_STRING_CHARS ]; const char *var; // bk001205 - format @@ -96,9 +98,10 @@ G_InitSessionData Called on a first-time connect ================ */ -void G_InitSessionData( gclient_t *client, char *userinfo ) { +void G_InitSessionData( gclient_t *client, char *userinfo ) +{ clientSession_t *sess; - const char *value; + const char *value; sess = &client->sess; @@ -131,7 +134,8 @@ G_WriteSessionData ================== */ -void G_WriteSessionData( void ) { +void G_WriteSessionData( void ) +{ int i; //TA: ? diff --git a/src/game/g_spawn.c b/src/game/g_spawn.c index b9fb1851..b66675c0 100644 --- a/src/game/g_spawn.c +++ b/src/game/g_spawn.c @@ -16,17 +16,21 @@ #include "g_local.h" -qboolean G_SpawnString( const char *key, const char *defaultString, char **out ) { +qboolean G_SpawnString( const char *key, const char *defaultString, char **out ) +{ int i; - if ( !level.spawning ) { + if( !level.spawning ) + { *out = (char *)defaultString; // G_Error( "G_SpawnString() called while not spawning" ); } - for ( i = 0 ; i < level.numSpawnVars ; i++ ) { - if ( !Q_stricmp( key, level.spawnVars[i][0] ) ) { - *out = level.spawnVars[i][1]; + for( i = 0; i < level.numSpawnVars; i++ ) + { + if( !Q_stricmp( key, level.spawnVars[ i ][ 0 ] ) ) + { + *out = level.spawnVars[ i ][ 1 ]; return qtrue; } } @@ -35,7 +39,8 @@ qboolean G_SpawnString( const char *key, const char *defaultString, char **out return qfalse; } -qboolean G_SpawnFloat( const char *key, const char *defaultString, float *out ) { +qboolean G_SpawnFloat( const char *key, const char *defaultString, float *out ) +{ char *s; qboolean present; @@ -44,8 +49,9 @@ qboolean G_SpawnFloat( const char *key, const char *defaultString, float *out ) return present; } -qboolean G_SpawnInt( const char *key, const char *defaultString, int *out ) { - char *s; +qboolean G_SpawnInt( const char *key, const char *defaultString, int *out ) +{ + char *s; qboolean present; present = G_SpawnString( key, defaultString, &s ); @@ -53,21 +59,23 @@ qboolean G_SpawnInt( const char *key, const char *defaultString, int *out ) { return present; } -qboolean G_SpawnVector( const char *key, const char *defaultString, float *out ) { +qboolean G_SpawnVector( const char *key, const char *defaultString, float *out ) +{ char *s; qboolean present; present = G_SpawnString( key, defaultString, &s ); - sscanf( s, "%f %f %f", &out[0], &out[1], &out[2] ); + sscanf( s, "%f %f %f", &out[ 0 ], &out[ 1 ], &out[ 2 ] ); return present; } -qboolean G_SpawnVector4( const char *key, const char *defaultString, float *out ) { +qboolean G_SpawnVector4( const char *key, const char *defaultString, float *out ) +{ char *s; qboolean present; present = G_SpawnString( key, defaultString, &s ); - sscanf( s, "%f %f %f %f", &out[0], &out[1], &out[2], &out[3] ); + sscanf( s, "%f %f %f %f", &out[ 0 ], &out[ 1 ], &out[ 2 ], &out[ 3 ] ); return present; } @@ -76,7 +84,8 @@ qboolean G_SpawnVector4( const char *key, const char *defaultString, float *out // // fields are needed for spawning from the entity string // -typedef enum { +typedef enum +{ F_INT, F_FLOAT, F_LSTRING, // string on disk, pointer in memory, TAG_LEVEL @@ -98,7 +107,8 @@ typedef struct int flags; } field_t; -field_t fields[] = { +field_t fields[ ] = +{ {"classname", FOFS(classname), F_LSTRING}, {"origin", FOFS(s.origin), F_VECTOR}, {"model", FOFS(model), F_LSTRING}, @@ -131,65 +141,66 @@ field_t fields[] = { }; -typedef struct { +typedef struct +{ char *name; void (*spawn)(gentity_t *ent); } spawn_t; -void SP_info_player_start (gentity_t *ent); -void SP_info_player_deathmatch (gentity_t *ent); -void SP_info_player_intermission (gentity_t *ent); +void SP_info_player_start( gentity_t *ent ); +void SP_info_player_deathmatch( gentity_t *ent ); +void SP_info_player_intermission( gentity_t *ent ); //TA: extra bits void SP_info_alien_intermission( gentity_t *ent ); void SP_info_human_intermission( gentity_t *ent ); -void SP_info_firstplace(gentity_t *ent); -void SP_info_secondplace(gentity_t *ent); -void SP_info_thirdplace(gentity_t *ent); -void SP_info_podium(gentity_t *ent); +void SP_info_firstplace( gentity_t *ent ); +void SP_info_secondplace( gentity_t *ent ); +void SP_info_thirdplace( gentity_t *ent ); +void SP_info_podium( gentity_t *ent ); -void SP_func_plat (gentity_t *ent); -void SP_func_static (gentity_t *ent); -void SP_func_rotating (gentity_t *ent); -void SP_func_bobbing (gentity_t *ent); +void SP_func_plat( gentity_t *ent ); +void SP_func_static( gentity_t *ent ); +void SP_func_rotating( gentity_t *ent ); +void SP_func_bobbing( gentity_t *ent ); void SP_func_pendulum( gentity_t *ent ); -void SP_func_button (gentity_t *ent); -void SP_func_door (gentity_t *ent); -void SP_func_train (gentity_t *ent); -void SP_func_timer (gentity_t *self); +void SP_func_button( gentity_t *ent ); +void SP_func_door( gentity_t *ent ); +void SP_func_train( gentity_t *ent ); +void SP_func_timer( gentity_t *self); -void SP_trigger_always (gentity_t *ent); -void SP_trigger_multiple (gentity_t *ent); -void SP_trigger_push (gentity_t *ent); -void SP_trigger_teleport (gentity_t *ent); -void SP_trigger_hurt (gentity_t *ent); +void SP_trigger_always( gentity_t *ent ); +void SP_trigger_multiple( gentity_t *ent ); +void SP_trigger_push( gentity_t *ent ); +void SP_trigger_teleport( gentity_t *ent ); +void SP_trigger_hurt( gentity_t *ent ); void SP_target_remove_powerups( gentity_t *ent ); -void SP_target_give (gentity_t *ent); -void SP_target_delay (gentity_t *ent); -void SP_target_speaker (gentity_t *ent); -void SP_target_print (gentity_t *ent); -void SP_target_laser (gentity_t *self); -void SP_target_character (gentity_t *ent); +void SP_target_give( gentity_t *ent ); +void SP_target_delay( gentity_t *ent ); +void SP_target_speaker( gentity_t *ent ); +void SP_target_print( gentity_t *ent ); +void SP_target_laser( gentity_t *self); +void SP_target_character( gentity_t *ent ); void SP_target_score( gentity_t *ent ); void SP_target_teleporter( gentity_t *ent ); -void SP_target_relay (gentity_t *ent); -void SP_target_kill (gentity_t *ent); -void SP_target_position (gentity_t *ent); -void SP_target_location (gentity_t *ent); -void SP_target_push (gentity_t *ent); - -void SP_light (gentity_t *self); -void SP_info_null (gentity_t *self); -void SP_info_notnull (gentity_t *self); -void SP_info_camp (gentity_t *self); -void SP_path_corner (gentity_t *self); - -void SP_misc_teleporter_dest (gentity_t *self); -void SP_misc_model(gentity_t *ent); -void SP_misc_portal_camera(gentity_t *ent); -void SP_misc_portal_surface(gentity_t *ent); +void SP_target_relay( gentity_t *ent ); +void SP_target_kill( gentity_t *ent ); +void SP_target_position( gentity_t *ent ); +void SP_target_location( gentity_t *ent ); +void SP_target_push( gentity_t *ent ); + +void SP_light( gentity_t *self ); +void SP_info_null( gentity_t *self ); +void SP_info_notnull( gentity_t *self ); +void SP_info_camp( gentity_t *self ); +void SP_path_corner( gentity_t *self ); + +void SP_misc_teleporter_dest( gentity_t *self ); +void SP_misc_model( gentity_t *ent ); +void SP_misc_portal_camera( gentity_t *ent ); +void SP_misc_portal_surface( gentity_t *ent ); void SP_shooter_rocket( gentity_t *ent ); void SP_shooter_plasma( gentity_t *ent ); @@ -200,7 +211,8 @@ void SP_misc_spriter( gentity_t *ent ); void SP_misc_anim_model( gentity_t *ent ); void SP_misc_light_flare( gentity_t *ent ); -spawn_t spawns[] = { +spawn_t spawns[ ] = +{ // info entities don't do anything at all, but provide positional // information for things controlled by other processes {"info_player_start", SP_info_player_start}, @@ -286,8 +298,9 @@ qboolean G_CallSpawn( gentity_t *ent ) gitem_t *item; buildable_t buildable; - if ( !ent->classname ) { - G_Printf ("G_CallSpawn: NULL classname\n"); + if( !ent->classname ) + { + G_Printf( "G_CallSpawn: NULL classname\n" ); return qfalse; } @@ -321,28 +334,30 @@ Builds a copy of the string, translating \n to real linefeeds so message texts can be multi-line ============= */ -char *G_NewString( const char *string ) { +char *G_NewString( const char *string ) +{ char *newb, *new_p; int i,l; - l = strlen(string) + 1; + l = strlen( string ) + 1; newb = G_Alloc( l ); new_p = newb; // turn \n into a real linefeed - for ( i=0 ; i< l ; i++ ) { - if (string[i] == '\\' && i < l-1) { + for( i = 0 ; i < l ; i++ ) + { + if( string[ i ] == '\\' && i < l - 1 ) + { i++; - if (string[i] == 'n') { + if( string[ i ] == 'n' ) *new_p++ = '\n'; - } else { + else *new_p++ = '\\'; - } - } else { - *new_p++ = string[i]; } + else + *new_p++ = string[ i ]; } return newb; @@ -359,51 +374,62 @@ Takes a key/value pair and sets the binary values in a gentity =============== */ -void G_ParseField( const char *key, const char *value, gentity_t *ent ) { +void G_ParseField( const char *key, const char *value, gentity_t *ent ) +{ field_t *f; byte *b; float v; vec3_t vec; vec4_t vec4; - for ( f=fields ; f->name ; f++ ) { - if ( !Q_stricmp(f->name, key) ) { + for( f = fields; f->name; f++ ) + { + if( !Q_stricmp( f->name, key ) ) + { // found it b = (byte *)ent; - switch( f->type ) { - case F_LSTRING: - *(char **)(b+f->ofs) = G_NewString (value); - break; - case F_VECTOR: - sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); - ((float *)(b+f->ofs))[0] = vec[0]; - ((float *)(b+f->ofs))[1] = vec[1]; - ((float *)(b+f->ofs))[2] = vec[2]; - break; - case F_VECTOR4: - sscanf (value, "%f %f %f %f", &vec4[0], &vec4[1], &vec4[2], &vec4[3]); - ((float *)(b+f->ofs))[0] = vec4[0]; - ((float *)(b+f->ofs))[1] = vec4[1]; - ((float *)(b+f->ofs))[2] = vec4[2]; - ((float *)(b+f->ofs))[3] = vec4[3]; - break; - case F_INT: - *(int *)(b+f->ofs) = atoi(value); - break; - case F_FLOAT: - *(float *)(b+f->ofs) = atof(value); - break; - case F_ANGLEHACK: - v = atof(value); - ((float *)(b+f->ofs))[0] = 0; - ((float *)(b+f->ofs))[1] = v; - ((float *)(b+f->ofs))[2] = 0; - break; - default: - case F_IGNORE: - break; + switch( f->type ) + { + case F_LSTRING: + *(char **)( b + f->ofs ) = G_NewString( value ); + break; + + case F_VECTOR: + sscanf( value, "%f %f %f", &vec[ 0 ], &vec[ 1 ], &vec[ 2 ] ); + ( (float *)( b + f->ofs ) )[ 0 ] = vec[ 0 ]; + ( (float *)( b + f->ofs ) )[ 1 ] = vec[ 1 ]; + ( (float *)( b + f->ofs ) )[ 2 ] = vec[ 2 ]; + break; + + case F_VECTOR4: + sscanf( value, "%f %f %f %f", &vec4[ 0 ], &vec4[ 1 ], &vec4[ 2 ], &vec4[ 3 ] ); + ( (float *)( b + f->ofs ) )[ 0 ] = vec4[ 0 ]; + ( (float *)( b + f->ofs ) )[ 1 ] = vec4[ 1 ]; + ( (float *)( b + f->ofs ) )[ 2 ] = vec4[ 2 ]; + ( (float *)( b + f->ofs ) )[ 3 ] = vec4[ 3 ]; + break; + + case F_INT: + *(int *)( b + f->ofs ) = atoi( value ); + break; + + case F_FLOAT: + *(float *)( b + f->ofs ) = atof( value ); + break; + + case F_ANGLEHACK: + v = atof( value ); + ( (float *)( b + f->ofs ) )[ 0 ] = 0; + ( (float *)( b + f->ofs ) )[ 1 ] = v; + ( (float *)( b + f->ofs ) )[ 2 ] = 0; + break; + + default: + case F_IGNORE: + break; } + return; } } @@ -420,22 +446,25 @@ Spawn an entity and fill in all of the level fields from level.spawnVars[], then call the class specfic spawn function =================== */ -void G_SpawnGEntityFromSpawnVars( void ) { - int i; - gentity_t *ent; - char *s, *value, *gametypeName; - static char *gametypeNames[] = {"ffa", "tournament", "single", "team", "ctf", "oneflag", "obelisk", "harvester", "teamtournament"}; +void G_SpawnGEntityFromSpawnVars( void ) +{ + int i; + gentity_t *ent; + char *s, *value, *gametypeName; + static char *gametypeNames[ ] = { "ffa", "tournament", "single", + "team", "ctf", "oneflag", + "obelisk", "harvester", "teamtournament" }; - // get the next free entity - ent = G_Spawn(); + ent = G_Spawn( ); - for ( i = 0 ; i < level.numSpawnVars ; i++ ) { - G_ParseField( level.spawnVars[i][0], level.spawnVars[i][1], ent ); - } + for( i = 0 ; i < level.numSpawnVars ; i++ ) + G_ParseField( level.spawnVars[ i ][ 0 ], level.spawnVars[ i ][ 1 ], ent ); G_SpawnInt( "notq3a", "0", &i ); - if ( i ) { + + if( i ) + { G_FreeEntity( ent ); return; } @@ -445,9 +474,8 @@ void G_SpawnGEntityFromSpawnVars( void ) { VectorCopy( ent->s.origin, ent->r.currentOrigin ); // if we didn't get a classname, don't bother spawning anything - if ( !G_CallSpawn( ent ) ) { + if ( !G_CallSpawn( ent ) ) G_FreeEntity( ent ); - } } @@ -457,18 +485,17 @@ void G_SpawnGEntityFromSpawnVars( void ) { G_AddSpawnVarToken ==================== */ -char *G_AddSpawnVarToken( const char *string ) { +char *G_AddSpawnVarToken( const char *string ) +{ int l; char *dest; l = strlen( string ); - if ( level.numSpawnVarChars + l + 1 > MAX_SPAWN_VARS_CHARS ) { + if( level.numSpawnVarChars + l + 1 > MAX_SPAWN_VARS_CHARS ) G_Error( "G_AddSpawnVarToken: MAX_SPAWN_CHARS" ); - - } dest = level.spawnVarChars + level.numSpawnVarChars; - memcpy( dest, string, l+1 ); + memcpy( dest, string, l + 1 ); level.numSpawnVarChars += l + 1; @@ -485,46 +512,46 @@ level's entity strings into level.spawnVars[] This does not actually spawn an entity. ==================== */ -qboolean G_ParseSpawnVars( void ) { - char keyname[MAX_TOKEN_CHARS]; - char com_token[MAX_TOKEN_CHARS]; +qboolean G_ParseSpawnVars( void ) +{ + char keyname[ MAX_TOKEN_CHARS ]; + char com_token[ MAX_TOKEN_CHARS ]; level.numSpawnVars = 0; level.numSpawnVarChars = 0; // parse the opening brace - if ( !trap_GetEntityToken( com_token, sizeof( com_token ) ) ) { + if( !trap_GetEntityToken( com_token, sizeof( com_token ) ) ) + { // end of spawn string return qfalse; } - if ( com_token[0] != '{' ) { - G_Error( "G_ParseSpawnVars: found %s when expecting {",com_token ); - } + + if( com_token[ 0 ] != '{' ) + G_Error( "G_ParseSpawnVars: found %s when expecting {", com_token ); // go through all the key / value pairs - while ( 1 ) { + while( 1 ) + { // parse key - if ( !trap_GetEntityToken( keyname, sizeof( keyname ) ) ) { + if( !trap_GetEntityToken( keyname, sizeof( keyname ) ) ) G_Error( "G_ParseSpawnVars: EOF without closing brace" ); - } - if ( keyname[0] == '}' ) { + if( keyname[0] == '}' ) break; - } // parse value - if ( !trap_GetEntityToken( com_token, sizeof( com_token ) ) ) { + if( !trap_GetEntityToken( com_token, sizeof( com_token ) ) ) G_Error( "G_ParseSpawnVars: EOF without closing brace" ); - } - if ( com_token[0] == '}' ) { + if( com_token[0] == '}' ) G_Error( "G_ParseSpawnVars: closing brace without data" ); - } - if ( level.numSpawnVars == MAX_SPAWN_VARS ) { + + if( level.numSpawnVars == MAX_SPAWN_VARS ) G_Error( "G_ParseSpawnVars: MAX_SPAWN_VARS" ); - } - level.spawnVars[ level.numSpawnVars ][0] = G_AddSpawnVarToken( keyname ); - level.spawnVars[ level.numSpawnVars ][1] = G_AddSpawnVarToken( com_token ); + + level.spawnVars[ level.numSpawnVars ][ 0 ] = G_AddSpawnVarToken( keyname ); + level.spawnVars[ level.numSpawnVars ][ 1 ] = G_AddSpawnVarToken( com_token ); level.numSpawnVars++; } @@ -540,18 +567,19 @@ Every map should have exactly one worldspawn. "gravity" 800 is default gravity "message" Text to print during connection process */ -void SP_worldspawn( void ) { - char *s; +void SP_worldspawn( void ) +{ + char *s; G_SpawnString( "classname", "", &s ); - if ( Q_stricmp( s, "worldspawn" ) ) { + + if( Q_stricmp( s, "worldspawn" ) ) G_Error( "SP_worldspawn: The first entity isn't 'worldspawn'" ); - } // make some data visible to connecting client trap_SetConfigstring( CS_GAME_VERSION, GAME_VERSION ); - trap_SetConfigstring( CS_LEVEL_START_TIME, va("%i", level.startTime ) ); + trap_SetConfigstring( CS_LEVEL_START_TIME, va( "%i", level.startTime ) ); G_SpawnString( "music", "", &s ); trap_SetConfigstring( CS_MUSIC, s ); @@ -594,17 +622,21 @@ void SP_worldspawn( void ) { G_SpawnString( "enableBreath", "0", &s ); trap_Cvar_Set( "g_enableBreath", s ); - g_entities[ENTITYNUM_WORLD].s.number = ENTITYNUM_WORLD; - g_entities[ENTITYNUM_WORLD].classname = "worldspawn"; + g_entities[ ENTITYNUM_WORLD ].s.number = ENTITYNUM_WORLD; + g_entities[ ENTITYNUM_WORLD ].classname = "worldspawn"; // see if we want a warmup time trap_SetConfigstring( CS_WARMUP, "" ); - if ( g_restarted.integer ) { + if( g_restarted.integer ) + { trap_Cvar_Set( "g_restarted", "0" ); level.warmupTime = 0; - } else if ( g_doWarmup.integer ) { // Turn it on + } + else if( g_doWarmup.integer ) + { + // Turn it on level.warmupTime = -1; - trap_SetConfigstring( CS_WARMUP, va("%i", level.warmupTime) ); + trap_SetConfigstring( CS_WARMUP, va( "%i", level.warmupTime ) ); G_LogPrintf( "Warmup:\n" ); } @@ -618,7 +650,8 @@ G_SpawnEntitiesFromString Parses textual entity definitions out of an entstring and spawns gentities. ============== */ -void G_SpawnEntitiesFromString( void ) { +void G_SpawnEntitiesFromString( void ) +{ // allow calls to G_Spawn*() level.spawning = qtrue; level.numSpawnVars = 0; @@ -626,15 +659,14 @@ void G_SpawnEntitiesFromString( void ) { // the worldspawn is not an actual entity, but it still // has a "spawn" function to perform any global setup // needed by a level (setting configstrings or cvars, etc) - if ( !G_ParseSpawnVars() ) { + if( !G_ParseSpawnVars( ) ) G_Error( "SpawnEntities: no entities" ); - } - SP_worldspawn(); + + SP_worldspawn( ); // parse ents - while( G_ParseSpawnVars() ) { - G_SpawnGEntityFromSpawnVars(); - } + while( G_ParseSpawnVars( ) ) + G_SpawnGEntityFromSpawnVars( ); level.spawning = qfalse; // any future calls to G_Spawn*() will be errors } diff --git a/src/game/g_svcmds.c b/src/game/g_svcmds.c index 3fb05cf8..7386d90b 100644 --- a/src/game/g_svcmds.c +++ b/src/game/g_svcmds.c @@ -59,47 +59,48 @@ typedef struct ipFilter_s #define MAX_IPFILTERS 1024 -static ipFilter_t ipFilters[MAX_IPFILTERS]; -static int numIPFilters; +static ipFilter_t ipFilters[ MAX_IPFILTERS ]; +static int numIPFilters; /* ================= StringToFilter ================= */ -static qboolean StringToFilter (char *s, ipFilter_t *f) +static qboolean StringToFilter( char *s, ipFilter_t *f ) { - char num[128]; + char num[ 128 ]; int i, j; - byte b[4]; - byte m[4]; + byte b[ 4 ]; + byte m[ 4 ]; - for (i=0 ; i<4 ; i++) + for( i = 0; i < 4; i++ ) { - b[i] = 0; - m[i] = 0; + b[ i ] = 0; + m[ i ] = 0; } - for (i=0 ; i<4 ; i++) + for( i = 0; i < 4; i++ ) { - if (*s < '0' || *s > '9') + if( *s < '0' || *s > '9' ) { G_Printf( "Bad filter address: %s\n", s ); return qfalse; } j = 0; - while (*s >= '0' && *s <= '9') - { - num[j++] = *s++; - } - num[j] = 0; - b[i] = atoi(num); - if (b[i] != 0) - m[i] = 255; - - if (!*s) + while( *s >= '0' && *s <= '9' ) + num[ j++ ] = *s++; + + num[ j ] = 0; + b[ i ] = atoi( num ); + + if( b[ i ] != 0 ) + m[ i ] = 255; + + if( !*s ) break; + s++; } @@ -114,21 +115,22 @@ static qboolean StringToFilter (char *s, ipFilter_t *f) UpdateIPBans ================= */ -static void UpdateIPBans (void) +static void UpdateIPBans( void ) { - byte b[4]; + byte b[ 4 ]; int i; - char iplist[MAX_INFO_STRING]; + char iplist[ MAX_INFO_STRING ]; *iplist = 0; - for (i = 0 ; i < numIPFilters ; i++) + + for( i = 0 ; i < numIPFilters ; i++ ) { - if (ipFilters[i].compare == 0xffffffff) + if( ipFilters[ i ].compare == 0xffffffff ) continue; - *(unsigned *)b = ipFilters[i].compare; - Com_sprintf( iplist + strlen(iplist), sizeof(iplist) - strlen(iplist), - "%i.%i.%i.%i ", b[0], b[1], b[2], b[3]); + *(unsigned *)b = ipFilters[ i ].compare; + Com_sprintf( iplist + strlen( iplist ), sizeof( iplist ) - strlen( iplist ), + "%i.%i.%i.%i ", b[ 0 ], b[ 1 ], b[ 2 ], b[ 3 ] ); } trap_Cvar_Set( "g_banIPs", iplist ); @@ -139,30 +141,34 @@ static void UpdateIPBans (void) G_FilterPacket ================= */ -qboolean G_FilterPacket (char *from) +qboolean G_FilterPacket( char *from ) { - int i; + int i; unsigned in; - byte m[4]; - char *p; + byte m[ 4 ]; + char *p; i = 0; p = from; - while (*p && i < 4) { - m[i] = 0; - while (*p >= '0' && *p <= '9') { - m[i] = m[i]*10 + (*p - '0'); + while( *p && i < 4 ) + { + m[ i ] = 0; + while( *p >= '0' && *p <= '9' ) + { + m[ i ] = m[ i ] * 10 + ( *p - '0' ); p++; } - if (!*p || *p == ':') + + if( !*p || *p == ':' ) break; + i++, p++; } in = *(unsigned *)m; - for (i=0 ; i\n"); + if( trap_Argc( ) < 2 ) + { + G_Printf( "Usage: addip \n" ); return; } trap_Argv( 1, str, sizeof( str ) ); AddIP( str ); - } /* @@ -246,29 +259,32 @@ void Svcmd_AddIP_f (void) Svcmd_RemoveIP_f ================= */ -void Svcmd_RemoveIP_f (void) +void Svcmd_RemoveIP_f( void ) { ipFilter_t f; - int i; - char str[MAX_TOKEN_CHARS]; + int i; + char str[ MAX_TOKEN_CHARS ]; - if ( trap_Argc() < 2 ) { - G_Printf("Usage: sv removeip \n"); + if( trap_Argc( ) < 2 ) + { + G_Printf( "Usage: sv removeip \n" ); return; } trap_Argv( 1, str, sizeof( str ) ); - if (!StringToFilter (str, &f)) + if( !StringToFilter( str, &f ) ) return; - for (i=0 ; iinuse ) { + check = g_entities + 1; + + for( e = 1; e < level.num_entities; e++, check++ ) + { + if( !check->inuse ) continue; - } - G_Printf("%3i:", e); - switch ( check->s.eType ) { - case ET_GENERAL: - G_Printf("ET_GENERAL "); - break; - case ET_PLAYER: - G_Printf("ET_PLAYER "); - break; - case ET_ITEM: - G_Printf("ET_ITEM "); - break; - case ET_BUILDABLE: - G_Printf("ET_BUILDABLE "); - break; - case ET_MISSILE: - G_Printf("ET_MISSILE "); - break; - case ET_MOVER: - G_Printf("ET_MOVER "); - break; - case ET_BEAM: - G_Printf("ET_BEAM "); - break; - case ET_PORTAL: - G_Printf("ET_PORTAL "); - break; - case ET_SPEAKER: - G_Printf("ET_SPEAKER "); - break; - case ET_PUSH_TRIGGER: - G_Printf("ET_PUSH_TRIGGER "); - break; - case ET_TELEPORT_TRIGGER: - G_Printf("ET_TELEPORT_TRIGGER "); - break; - case ET_INVISIBLE: - G_Printf("ET_INVISIBLE "); - break; - case ET_GRAPPLE: - G_Printf("ET_GRAPPLE "); - break; - default: - G_Printf("%3i ", check->s.eType); - break; - } - if ( check->classname ) { - G_Printf("%s", check->classname); + G_Printf( "%3i:", e ); + + switch( check->s.eType ) + { + case ET_GENERAL: + G_Printf( "ET_GENERAL " ); + break; + case ET_PLAYER: + G_Printf( "ET_PLAYER " ); + break; + case ET_ITEM: + G_Printf( "ET_ITEM " ); + break; + case ET_BUILDABLE: + G_Printf( "ET_BUILDABLE " ); + break; + case ET_MISSILE: + G_Printf( "ET_MISSILE " ); + break; + case ET_MOVER: + G_Printf( "ET_MOVER " ); + break; + case ET_BEAM: + G_Printf( "ET_BEAM " ); + break; + case ET_PORTAL: + G_Printf( "ET_PORTAL " ); + break; + case ET_SPEAKER: + G_Printf( "ET_SPEAKER " ); + break; + case ET_PUSH_TRIGGER: + G_Printf( "ET_PUSH_TRIGGER " ); + break; + case ET_TELEPORT_TRIGGER: + G_Printf( "ET_TELEPORT_TRIGGER " ); + break; + case ET_INVISIBLE: + G_Printf( "ET_INVISIBLE " ); + break; + case ET_GRAPPLE: + G_Printf( "ET_GRAPPLE " ); + break; + default: + G_Printf( "%3i ", check->s.eType ); + break; } - G_Printf("\n"); + + if( check->classname ) + G_Printf( "%s", check->classname ); + + G_Printf( "\n" ); } } -gclient_t *ClientForString( const char *s ) { +gclient_t *ClientForString( const char *s ) +{ gclient_t *cl; - int i; - int idnum; + int i; + int idnum; // numeric values are just slot numbers - if ( s[0] >= '0' && s[0] <= '9' ) { + if( s[ 0 ] >= '0' && s[ 0 ] <= '9' ) + { idnum = atoi( s ); - if ( idnum < 0 || idnum >= level.maxclients ) { + + if( idnum < 0 || idnum >= level.maxclients ) + { Com_Printf( "Bad client slot: %i\n", idnum ); return NULL; } - cl = &level.clients[idnum]; - if ( cl->pers.connected == CON_DISCONNECTED ) { + cl = &level.clients[ idnum ]; + + if( cl->pers.connected == CON_DISCONNECTED ) + { G_Printf( "Client %i is not connected\n", idnum ); return NULL; } + return cl; } // check for a name match - for ( i=0 ; i < level.maxclients ; i++ ) { - cl = &level.clients[i]; - if ( cl->pers.connected == CON_DISCONNECTED ) { + for( i = 0; i < level.maxclients; i++ ) + { + cl = &level.clients[ i ]; + if( cl->pers.connected == CON_DISCONNECTED ) continue; - } - if ( !Q_stricmp( cl->pers.netname, s ) ) { + + if( !Q_stricmp( cl->pers.netname, s ) ) return cl; - } } G_Printf( "User %s is not on the server\n", s ); @@ -387,20 +415,22 @@ Svcmd_ForceTeam_f forceteam =================== */ -void Svcmd_ForceTeam_f( void ) { +void Svcmd_ForceTeam_f( void ) +{ gclient_t *cl; - char str[MAX_TOKEN_CHARS]; + char str[ MAX_TOKEN_CHARS ]; // find the player trap_Argv( 1, str, sizeof( str ) ); cl = ClientForString( str ); - if ( !cl ) { + + if( !cl ) return; - } // set the team trap_Argv( 2, str, sizeof( str ) ); /*SetTeam( &g_entities[cl - level.clients], str );*/ + //FIXME: tremulise this } char *ConcatArgs( int start ); @@ -411,48 +441,58 @@ ConsoleCommand ================= */ -qboolean ConsoleCommand( void ) { - char cmd[MAX_TOKEN_CHARS]; +qboolean ConsoleCommand( void ) +{ + char cmd[ MAX_TOKEN_CHARS ]; trap_Argv( 0, cmd, sizeof( cmd ) ); - if ( Q_stricmp (cmd, "entitylist") == 0 ) { - Svcmd_EntityList_f(); + if( Q_stricmp( cmd, "entitylist" ) == 0 ) + { + Svcmd_EntityList_f( ); return qtrue; } - if ( Q_stricmp (cmd, "forceteam") == 0 ) { - Svcmd_ForceTeam_f(); + if( Q_stricmp( cmd, "forceteam" ) == 0 ) + { + Svcmd_ForceTeam_f( ); return qtrue; } - if (Q_stricmp (cmd, "game_memory") == 0) { - Svcmd_GameMem_f(); + if( Q_stricmp( cmd, "game_memory" ) == 0 ) + { + Svcmd_GameMem_f( ); return qtrue; } - if (Q_stricmp (cmd, "addip") == 0) { - Svcmd_AddIP_f(); + if( Q_stricmp( cmd, "addip" ) == 0 ) + { + Svcmd_AddIP_f( ); return qtrue; } - if (Q_stricmp (cmd, "removeip") == 0) { - Svcmd_RemoveIP_f(); + if( Q_stricmp( cmd, "removeip" ) == 0 ) + { + Svcmd_RemoveIP_f( ); return qtrue; } - if (Q_stricmp (cmd, "listip") == 0) { + if( Q_stricmp( cmd, "listip" ) == 0 ) + { trap_SendConsoleCommand( EXEC_NOW, "g_banIPs\n" ); return qtrue; } - if (g_dedicated.integer) { - if (Q_stricmp (cmd, "say") == 0) { - trap_SendServerCommand( -1, va("print \"server: %s\"", ConcatArgs(1) ) ); + if( g_dedicated.integer ) + { + if( Q_stricmp( cmd, "say" ) == 0 ) + { + trap_SendServerCommand( -1, va( "print \"server: %s\"", ConcatArgs( 1 ) ) ); return qtrue; } + // everything else will also be printed as a say command - trap_SendServerCommand( -1, va("print \"server: %s\"", ConcatArgs(0) ) ); + trap_SendServerCommand( -1, va( "print \"server: %s\"", ConcatArgs( 0 ) ) ); return qtrue; } diff --git a/src/game/g_syscalls.asm b/src/game/g_syscalls.asm index e997e293..4fe395d4 100644 --- a/src/game/g_syscalls.asm +++ b/src/game/g_syscalls.asm @@ -1,224 +1,60 @@ code -equ trap_Printf -1 -equ trap_Error -2 -equ trap_Milliseconds -3 -equ trap_Cvar_Register -4 -equ trap_Cvar_Update -5 -equ trap_Cvar_Set -6 +equ trap_Printf -1 +equ trap_Error -2 +equ trap_Milliseconds -3 +equ trap_Cvar_Register -4 +equ trap_Cvar_Update -5 +equ trap_Cvar_Set -6 equ trap_Cvar_VariableIntegerValue -7 equ trap_Cvar_VariableStringBuffer -8 -equ trap_Argc -9 -equ trap_Argv -10 -equ trap_FS_FOpenFile -11 -equ trap_FS_Read -12 -equ trap_FS_Write -13 -equ trap_FS_FCloseFile -14 -equ trap_SendConsoleCommand -15 -equ trap_LocateGameData -16 -equ trap_DropClient -17 -equ trap_SendServerCommand -18 -equ trap_SetConfigstring -19 -equ trap_GetConfigstring -20 -equ trap_GetUserinfo -21 -equ trap_SetUserinfo -22 -equ trap_GetServerinfo -23 -equ trap_SetBrushModel -24 -equ trap_Trace -25 -equ trap_PointContents -26 -equ trap_InPVS -27 -equ trap_InPVSIgnorePortals -28 -equ trap_AdjustAreaPortalState -29 -equ trap_AreasConnected -30 -equ trap_LinkEntity -31 -equ trap_UnlinkEntity -32 -equ trap_EntitiesInBox -33 -equ trap_EntityContact -34 -equ trap_BotAllocateClient -35 -equ trap_BotFreeClient -36 -equ trap_GetUsercmd -37 -equ trap_GetEntityToken -38 -equ trap_FS_GetFileList -39 -equ trap_DebugPolygonCreate -40 -equ trap_DebugPolygonDelete -41 -equ trap_RealTime -42 -equ trap_SnapVector -43 -equ trap_TraceCapsule -44 -equ trap_EntityContactCapsule -45 - - -equ memset -101 -equ memcpy -102 -equ strncpy -103 -equ sin -104 -equ cos -105 -equ atan2 -106 -equ sqrt -107 -equ floor -111 -equ ceil -112 -equ testPrintInt -113 -equ testPrintFloat -114 - - -equ trap_BotLibSetup -201 -equ trap_BotLibShutdown -202 -equ trap_BotLibVarSet -203 -equ trap_BotLibVarGet -204 -equ trap_BotLibDefine -205 -equ trap_BotLibStartFrame -206 -equ trap_BotLibLoadMap -207 -equ trap_BotLibUpdateEntity -208 -equ trap_BotLibTest -209 - -equ trap_BotGetSnapshotEntity -210 -equ trap_BotGetServerCommand -211 -equ trap_BotUserCommand -212 - - - -equ trap_AAS_EnableRoutingArea -301 -equ trap_AAS_BBoxAreas -302 -equ trap_AAS_AreaInfo -303 -equ trap_AAS_EntityInfo -304 - -equ trap_AAS_Initialized -305 -equ trap_AAS_PresenceTypeBoundingBox -306 -equ trap_AAS_Time -307 - -equ trap_AAS_PointAreaNum -308 -equ trap_AAS_TraceAreas -309 - -equ trap_AAS_PointContents -310 -equ trap_AAS_NextBSPEntity -311 -equ trap_AAS_ValueForBSPEpairKey -312 -equ trap_AAS_VectorForBSPEpairKey -313 -equ trap_AAS_FloatForBSPEpairKey -314 -equ trap_AAS_IntForBSPEpairKey -315 - -equ trap_AAS_AreaReachability -316 - -equ trap_AAS_AreaTravelTimeToGoalArea -317 - -equ trap_AAS_Swimming -318 -equ trap_AAS_PredictClientMovement -319 - - - -equ trap_EA_Say -401 -equ trap_EA_SayTeam -402 -equ trap_EA_Command -403 - -equ trap_EA_Action -404 -equ trap_EA_Gesture -405 -equ trap_EA_Talk -406 -equ trap_EA_Attack -407 -equ trap_EA_Use -408 -equ trap_EA_Respawn -409 -equ trap_EA_Crouch -410 -equ trap_EA_MoveUp -411 -equ trap_EA_MoveDown -412 -equ trap_EA_MoveForward -413 -equ trap_EA_MoveBack -414 -equ trap_EA_MoveLeft -415 -equ trap_EA_MoveRight -416 - -equ trap_EA_SelectWeapon -417 -equ trap_EA_Jump -418 -equ trap_EA_DelayedJump -419 -equ trap_EA_Move -420 -equ trap_EA_View -421 - -equ trap_EA_EndRegular -422 -equ trap_EA_GetInput -423 -equ trap_EA_ResetInput -424 - - - -equ trap_BotLoadCharacter -501 -equ trap_BotFreeCharacter -502 -equ trap_Characteristic_Float -503 -equ trap_Characteristic_BFloat -504 -equ trap_Characteristic_Integer -505 -equ trap_Characteristic_BInteger -506 -equ trap_Characteristic_String -507 - -equ trap_BotAllocChatState -508 -equ trap_BotFreeChatState -509 -equ trap_BotQueueConsoleMessage -510 -equ trap_BotRemoveConsoleMessage -511 -equ trap_BotNextConsoleMessage -512 -equ trap_BotNumConsoleMessages -513 -equ trap_BotInitialChat -514 -equ trap_BotReplyChat -515 -equ trap_BotChatLength -516 -equ trap_BotEnterChat -517 -equ trap_StringContains -518 -equ trap_BotFindMatch -519 -equ trap_BotMatchVariable -520 -equ trap_UnifyWhiteSpaces -521 -equ trap_BotReplaceSynonyms -522 -equ trap_BotLoadChatFile -523 -equ trap_BotSetChatGender -524 -equ trap_BotSetChatName -525 - -equ trap_BotResetGoalState -526 -equ trap_BotResetAvoidGoals -527 -equ trap_BotPushGoal -528 -equ trap_BotPopGoal -529 -equ trap_BotEmptyGoalStack -530 -equ trap_BotDumpAvoidGoals -531 -equ trap_BotDumpGoalStack -532 -equ trap_BotGoalName -533 -equ trap_BotGetTopGoal -534 -equ trap_BotGetSecondGoal -535 -equ trap_BotChooseLTGItem -536 -equ trap_BotChooseNBGItem -537 -equ trap_BotTouchingGoal -538 -equ trap_BotItemGoalInVisButNotVisible -539 -equ trap_BotGetLevelItemGoal -540 -equ trap_BotAvoidGoalTime -541 -equ trap_BotInitLevelItems -542 -equ trap_BotUpdateEntityItems -543 -equ trap_BotLoadItemWeights -544 -equ trap_BotFreeItemWeights -546 -equ trap_BotSaveGoalFuzzyLogic -546 -equ trap_BotAllocGoalState -547 -equ trap_BotFreeGoalState -548 - -equ trap_BotResetMoveState -549 -equ trap_BotMoveToGoal -550 -equ trap_BotMoveInDirection -551 -equ trap_BotResetAvoidReach -552 -equ trap_BotResetLastAvoidReach -553 -equ trap_BotReachabilityArea -554 -equ trap_BotMovementViewTarget -555 -equ trap_BotAllocMoveState -556 -equ trap_BotFreeMoveState -557 -equ trap_BotInitMoveState -558 - -equ trap_BotChooseBestFightWeapon -559 -equ trap_BotGetWeaponInfo -560 -equ trap_BotLoadWeaponWeights -561 -equ trap_BotAllocWeaponState -562 -equ trap_BotFreeWeaponState -563 -equ trap_BotResetWeaponState -564 -equ trap_GeneticParentsAndChildSelection -565 -equ trap_BotInterbreedGoalFuzzyLogic -566 -equ trap_BotMutateGoalFuzzyLogic -567 -equ trap_BotGetNextCampSpotGoal -568 -equ trap_BotGetMapLocationGoal -569 -equ trap_BotNumInitialChats -570 -equ trap_BotGetChatMessage -571 -equ trap_BotRemoveFromAvoidGoals -572 -equ trap_BotPredictVisiblePosition -573 -equ trap_BotSetAvoidGoalTime -574 -equ trap_BotAddAvoidSpot -575 -equ trap_AAS_AlternativeRouteGoals -576 -equ trap_AAS_PredictRoute -577 -equ trap_AAS_PointReachabilityAreaIndex -578 - -equ trap_BotLibLoadSource -579 -equ trap_BotLibFreeSource -580 -equ trap_BotLibReadToken -581 -equ trap_BotLibSourceFileAndLine -582 - +equ trap_Argc -9 +equ trap_Argv -10 +equ trap_FS_FOpenFile -11 +equ trap_FS_Read -12 +equ trap_FS_Write -13 +equ trap_FS_FCloseFile -14 +equ trap_SendConsoleCommand -15 +equ trap_LocateGameData -16 +equ trap_DropClient -17 +equ trap_SendServerCommand -18 +equ trap_SetConfigstring -19 +equ trap_GetConfigstring -20 +equ trap_GetUserinfo -21 +equ trap_SetUserinfo -22 +equ trap_GetServerinfo -23 +equ trap_SetBrushModel -24 +equ trap_Trace -25 +equ trap_PointContents -26 +equ trap_InPVS -27 +equ trap_InPVSIgnorePortals -28 +equ trap_AdjustAreaPortalState -29 +equ trap_AreasConnected -30 +equ trap_LinkEntity -31 +equ trap_UnlinkEntity -32 +equ trap_EntitiesInBox -33 +equ trap_EntityContact -34 +equ trap_BotAllocateClient -35 +equ trap_BotFreeClient -36 +equ trap_GetUsercmd -37 +equ trap_GetEntityToken -38 +equ trap_FS_GetFileList -39 +equ trap_DebugPolygonCreate -40 +equ trap_DebugPolygonDelete -41 +equ trap_RealTime -42 +equ trap_SnapVector -43 +equ trap_TraceCapsule -44 +equ trap_EntityContactCapsule -45 + + +equ memset -101 +equ memcpy -102 +equ strncpy -103 +equ sin -104 +equ cos -105 +equ atan2 -106 +equ sqrt -107 +equ floor -111 +equ ceil -112 +equ testPrintInt -113 +equ testPrintFloat -114 diff --git a/src/game/g_syscalls.c b/src/game/g_syscalls.c index 8bbe8ab6..6a3f70c4 100644 --- a/src/game/g_syscalls.c +++ b/src/game/g_syscalls.c @@ -22,756 +22,243 @@ static int (QDECL *syscall)( int arg, ... ) = (int (QDECL *)( int, ...))-1; -void dllEntry( int (QDECL *syscallptr)( int arg,... ) ) { - syscall = syscallptr; +void dllEntry( int (QDECL *syscallptr)( int arg,... ) ) +{ + syscall = syscallptr; } -int PASSFLOAT( float x ) { - float floatTemp; - floatTemp = x; - return *(int *)&floatTemp; +int PASSFLOAT( float x ) +{ + float floatTemp; + floatTemp = x; + return *(int *)&floatTemp; } -void trap_Printf( const char *fmt ) { - syscall( G_PRINT, fmt ); +void trap_Printf( const char *fmt ) +{ + syscall( G_PRINT, fmt ); } -void trap_Error( const char *fmt ) { - syscall( G_ERROR, fmt ); +void trap_Error( const char *fmt ) +{ + syscall( G_ERROR, fmt ); } -int trap_Milliseconds( void ) { - return syscall( G_MILLISECONDS ); +int trap_Milliseconds( void ) +{ + return syscall( G_MILLISECONDS ); } -int trap_Argc( void ) { - return syscall( G_ARGC ); +int trap_Argc( void ) +{ + return syscall( G_ARGC ); } -void trap_Argv( int n, char *buffer, int bufferLength ) { - syscall( G_ARGV, n, buffer, bufferLength ); +void trap_Argv( int n, char *buffer, int bufferLength ) +{ + syscall( G_ARGV, n, buffer, bufferLength ); } -int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ) { - return syscall( G_FS_FOPEN_FILE, qpath, f, mode ); +int trap_FS_FOpenFile( const char *qpath, fileHandle_t *f, fsMode_t mode ) +{ + return syscall( G_FS_FOPEN_FILE, qpath, f, mode ); } -void trap_FS_Read( void *buffer, int len, fileHandle_t f ) { - syscall( G_FS_READ, buffer, len, f ); +void trap_FS_Read( void *buffer, int len, fileHandle_t f ) +{ + syscall( G_FS_READ, buffer, len, f ); } -void trap_FS_Write( const void *buffer, int len, fileHandle_t f ) { - syscall( G_FS_WRITE, buffer, len, f ); +void trap_FS_Write( const void *buffer, int len, fileHandle_t f ) +{ + syscall( G_FS_WRITE, buffer, len, f ); } -void trap_FS_FCloseFile( fileHandle_t f ) { - syscall( G_FS_FCLOSE_FILE, f ); +void trap_FS_FCloseFile( fileHandle_t f ) +{ + syscall( G_FS_FCLOSE_FILE, f ); } -int trap_FS_GetFileList( const char *path, const char *extension, char *listbuf, int bufsize ) { - return syscall( G_FS_GETFILELIST, path, extension, listbuf, bufsize ); +int trap_FS_GetFileList( const char *path, const char *extension, char *listbuf, int bufsize ) +{ + return syscall( G_FS_GETFILELIST, path, extension, listbuf, bufsize ); } -void trap_SendConsoleCommand( int exec_when, const char *text ) { - syscall( G_SEND_CONSOLE_COMMAND, exec_when, text ); +void trap_SendConsoleCommand( int exec_when, const char *text ) +{ + syscall( G_SEND_CONSOLE_COMMAND, exec_when, text ); } -void trap_Cvar_Register( vmCvar_t *cvar, const char *var_name, const char *value, int flags ) { - syscall( G_CVAR_REGISTER, cvar, var_name, value, flags ); +void trap_Cvar_Register( vmCvar_t *cvar, const char *var_name, const char *value, int flags ) +{ + syscall( G_CVAR_REGISTER, cvar, var_name, value, flags ); } -void trap_Cvar_Update( vmCvar_t *cvar ) { - syscall( G_CVAR_UPDATE, cvar ); +void trap_Cvar_Update( vmCvar_t *cvar ) +{ + syscall( G_CVAR_UPDATE, cvar ); } -void trap_Cvar_Set( const char *var_name, const char *value ) { - syscall( G_CVAR_SET, var_name, value ); +void trap_Cvar_Set( const char *var_name, const char *value ) +{ + syscall( G_CVAR_SET, var_name, value ); } -int trap_Cvar_VariableIntegerValue( const char *var_name ) { - return syscall( G_CVAR_VARIABLE_INTEGER_VALUE, var_name ); +int trap_Cvar_VariableIntegerValue( const char *var_name ) +{ + return syscall( G_CVAR_VARIABLE_INTEGER_VALUE, var_name ); } -void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ) { - syscall( G_CVAR_VARIABLE_STRING_BUFFER, var_name, buffer, bufsize ); +void trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize ) +{ + syscall( G_CVAR_VARIABLE_STRING_BUFFER, var_name, buffer, bufsize ); } void trap_LocateGameData( gentity_t *gEnts, int numGEntities, int sizeofGEntity_t, - playerState_t *clients, int sizeofGClient ) { - syscall( G_LOCATE_GAME_DATA, gEnts, numGEntities, sizeofGEntity_t, clients, sizeofGClient ); + playerState_t *clients, int sizeofGClient ) +{ + syscall( G_LOCATE_GAME_DATA, gEnts, numGEntities, sizeofGEntity_t, clients, sizeofGClient ); } -void trap_DropClient( int clientNum, const char *reason ) { - syscall( G_DROP_CLIENT, clientNum, reason ); +void trap_DropClient( int clientNum, const char *reason ) +{ + syscall( G_DROP_CLIENT, clientNum, reason ); } -void trap_SendServerCommand( int clientNum, const char *text ) { - syscall( G_SEND_SERVER_COMMAND, clientNum, text ); +void trap_SendServerCommand( int clientNum, const char *text ) +{ + syscall( G_SEND_SERVER_COMMAND, clientNum, text ); } -void trap_SetConfigstring( int num, const char *string ) { - syscall( G_SET_CONFIGSTRING, num, string ); +void trap_SetConfigstring( int num, const char *string ) +{ + syscall( G_SET_CONFIGSTRING, num, string ); } -void trap_GetConfigstring( int num, char *buffer, int bufferSize ) { - syscall( G_GET_CONFIGSTRING, num, buffer, bufferSize ); +void trap_GetConfigstring( int num, char *buffer, int bufferSize ) +{ + syscall( G_GET_CONFIGSTRING, num, buffer, bufferSize ); } -void trap_GetUserinfo( int num, char *buffer, int bufferSize ) { - syscall( G_GET_USERINFO, num, buffer, bufferSize ); +void trap_GetUserinfo( int num, char *buffer, int bufferSize ) +{ + syscall( G_GET_USERINFO, num, buffer, bufferSize ); } -void trap_SetUserinfo( int num, const char *buffer ) { - syscall( G_SET_USERINFO, num, buffer ); +void trap_SetUserinfo( int num, const char *buffer ) +{ + syscall( G_SET_USERINFO, num, buffer ); } -void trap_GetServerinfo( char *buffer, int bufferSize ) { - syscall( G_GET_SERVERINFO, buffer, bufferSize ); +void trap_GetServerinfo( char *buffer, int bufferSize ) +{ + syscall( G_GET_SERVERINFO, buffer, bufferSize ); } -void trap_SetBrushModel( gentity_t *ent, const char *name ) { - syscall( G_SET_BRUSH_MODEL, ent, name ); +void trap_SetBrushModel( gentity_t *ent, const char *name ) +{ + syscall( G_SET_BRUSH_MODEL, ent, name ); } -void trap_Trace( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask ) { - syscall( G_TRACE, results, start, mins, maxs, end, passEntityNum, contentmask ); +void trap_Trace( trace_t *results, const vec3_t start, const vec3_t mins, + const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask ) +{ + syscall( G_TRACE, results, start, mins, maxs, end, passEntityNum, contentmask ); } -void trap_TraceCapsule( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask ) { +void trap_TraceCapsule( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask ) +{ syscall( G_TRACECAPSULE, results, start, mins, maxs, end, passEntityNum, contentmask ); } -int trap_PointContents( const vec3_t point, int passEntityNum ) { - return syscall( G_POINT_CONTENTS, point, passEntityNum ); +int trap_PointContents( const vec3_t point, int passEntityNum ) +{ + return syscall( G_POINT_CONTENTS, point, passEntityNum ); } -qboolean trap_InPVS( const vec3_t p1, const vec3_t p2 ) { - return syscall( G_IN_PVS, p1, p2 ); +qboolean trap_InPVS( const vec3_t p1, const vec3_t p2 ) +{ + return syscall( G_IN_PVS, p1, p2 ); } -qboolean trap_InPVSIgnorePortals( const vec3_t p1, const vec3_t p2 ) { - return syscall( G_IN_PVS_IGNORE_PORTALS, p1, p2 ); +qboolean trap_InPVSIgnorePortals( const vec3_t p1, const vec3_t p2 ) +{ + return syscall( G_IN_PVS_IGNORE_PORTALS, p1, p2 ); } -void trap_AdjustAreaPortalState( gentity_t *ent, qboolean open ) { - syscall( G_ADJUST_AREA_PORTAL_STATE, ent, open ); +void trap_AdjustAreaPortalState( gentity_t *ent, qboolean open ) +{ + syscall( G_ADJUST_AREA_PORTAL_STATE, ent, open ); } -qboolean trap_AreasConnected( int area1, int area2 ) { - return syscall( G_AREAS_CONNECTED, area1, area2 ); +qboolean trap_AreasConnected( int area1, int area2 ) +{ + return syscall( G_AREAS_CONNECTED, area1, area2 ); } -void trap_LinkEntity( gentity_t *ent ) { - syscall( G_LINKENTITY, ent ); +void trap_LinkEntity( gentity_t *ent ) +{ + syscall( G_LINKENTITY, ent ); } -void trap_UnlinkEntity( gentity_t *ent ) { - syscall( G_UNLINKENTITY, ent ); +void trap_UnlinkEntity( gentity_t *ent ) +{ + syscall( G_UNLINKENTITY, ent ); } -int trap_EntitiesInBox( const vec3_t mins, const vec3_t maxs, int *list, int maxcount ) { - return syscall( G_ENTITIES_IN_BOX, mins, maxs, list, maxcount ); +int trap_EntitiesInBox( const vec3_t mins, const vec3_t maxs, int *list, int maxcount ) +{ + return syscall( G_ENTITIES_IN_BOX, mins, maxs, list, maxcount ); } -qboolean trap_EntityContact( const vec3_t mins, const vec3_t maxs, const gentity_t *ent ) { - return syscall( G_ENTITY_CONTACT, mins, maxs, ent ); +qboolean trap_EntityContact( const vec3_t mins, const vec3_t maxs, const gentity_t *ent ) +{ + return syscall( G_ENTITY_CONTACT, mins, maxs, ent ); } -qboolean trap_EntityContactCapsule( const vec3_t mins, const vec3_t maxs, const gentity_t *ent ) { +qboolean trap_EntityContactCapsule( const vec3_t mins, const vec3_t maxs, const gentity_t *ent ) +{ return syscall( G_ENTITY_CONTACTCAPSULE, mins, maxs, ent ); } -int trap_BotAllocateClient( void ) { - return syscall( G_BOT_ALLOCATE_CLIENT ); +int trap_BotAllocateClient( void ) +{ + return syscall( G_BOT_ALLOCATE_CLIENT ); } -void trap_BotFreeClient( int clientNum ) { - syscall( G_BOT_FREE_CLIENT, clientNum ); +void trap_BotFreeClient( int clientNum ) +{ + syscall( G_BOT_FREE_CLIENT, clientNum ); } -void trap_GetUsercmd( int clientNum, usercmd_t *cmd ) { - syscall( G_GET_USERCMD, clientNum, cmd ); +void trap_GetUsercmd( int clientNum, usercmd_t *cmd ) +{ + syscall( G_GET_USERCMD, clientNum, cmd ); } -qboolean trap_GetEntityToken( char *buffer, int bufferSize ) { - return syscall( G_GET_ENTITY_TOKEN, buffer, bufferSize ); +qboolean trap_GetEntityToken( char *buffer, int bufferSize ) +{ + return syscall( G_GET_ENTITY_TOKEN, buffer, bufferSize ); } -int trap_DebugPolygonCreate(int color, int numPoints, vec3_t *points) { - return syscall( G_DEBUG_POLYGON_CREATE, color, numPoints, points ); +int trap_DebugPolygonCreate(int color, int numPoints, vec3_t *points) +{ + return syscall( G_DEBUG_POLYGON_CREATE, color, numPoints, points ); } -void trap_DebugPolygonDelete(int id) { - syscall( G_DEBUG_POLYGON_DELETE, id ); +void trap_DebugPolygonDelete(int id) +{ + syscall( G_DEBUG_POLYGON_DELETE, id ); } -int trap_RealTime( qtime_t *qtime ) { +int trap_RealTime( qtime_t *qtime ) +{ return syscall( G_REAL_TIME, qtime ); } -void trap_SnapVector( float *v ) { +void trap_SnapVector( float *v ) +{ syscall( G_SNAPVECTOR, v ); return; } - -// BotLib traps start here -int trap_BotLibSetup( void ) { - return syscall( BOTLIB_SETUP ); -} - -int trap_BotLibShutdown( void ) { - return syscall( BOTLIB_SHUTDOWN ); -} - -int trap_BotLibVarSet(char *var_name, char *value) { - return syscall( BOTLIB_LIBVAR_SET, var_name, value ); -} - -int trap_BotLibVarGet(char *var_name, char *value, int size) { - return syscall( BOTLIB_LIBVAR_GET, var_name, value, size ); -} - -int trap_BotLibDefine(char *string) { - return syscall( BOTLIB_PC_ADD_GLOBAL_DEFINE, string ); -} - -int trap_BotLibStartFrame(float time) { - return syscall( BOTLIB_START_FRAME, PASSFLOAT( time ) ); -} - -int trap_BotLibLoadMap(const char *mapname) { - return syscall( BOTLIB_LOAD_MAP, mapname ); -} - -int trap_BotLibUpdateEntity(int ent, void /* struct bot_updateentity_s */ *bue) { - return syscall( BOTLIB_UPDATENTITY, ent, bue ); -} - -int trap_BotLibTest(int parm0, char *parm1, vec3_t parm2, vec3_t parm3) { - return syscall( BOTLIB_TEST, parm0, parm1, parm2, parm3 ); -} - -int trap_BotGetSnapshotEntity( int clientNum, int sequence ) { - return syscall( BOTLIB_GET_SNAPSHOT_ENTITY, clientNum, sequence ); -} - -int trap_BotGetServerCommand(int clientNum, char *message, int size) { - return syscall( BOTLIB_GET_CONSOLE_MESSAGE, clientNum, message, size ); -} - -void trap_BotUserCommand(int clientNum, usercmd_t *ucmd) { - syscall( BOTLIB_USER_COMMAND, clientNum, ucmd ); -} - -void trap_AAS_EntityInfo(int entnum, void /* struct aas_entityinfo_s */ *info) { - syscall( BOTLIB_AAS_ENTITY_INFO, entnum, info ); -} - -int trap_AAS_Initialized(void) { - return syscall( BOTLIB_AAS_INITIALIZED ); -} - -void trap_AAS_PresenceTypeBoundingBox(int presencetype, vec3_t mins, vec3_t maxs) { - syscall( BOTLIB_AAS_PRESENCE_TYPE_BOUNDING_BOX, presencetype, mins, maxs ); -} - -float trap_AAS_Time(void) { - int temp; - temp = syscall( BOTLIB_AAS_TIME ); - return (*(float*)&temp); -} - -int trap_AAS_PointAreaNum(vec3_t point) { - return syscall( BOTLIB_AAS_POINT_AREA_NUM, point ); -} - -int trap_AAS_PointReachabilityAreaIndex(vec3_t point) { - return syscall( BOTLIB_AAS_POINT_REACHABILITY_AREA_INDEX, point ); -} - -int trap_AAS_TraceAreas(vec3_t start, vec3_t end, int *areas, vec3_t *points, int maxareas) { - return syscall( BOTLIB_AAS_TRACE_AREAS, start, end, areas, points, maxareas ); -} - -int trap_AAS_BBoxAreas(vec3_t absmins, vec3_t absmaxs, int *areas, int maxareas) { - return syscall( BOTLIB_AAS_BBOX_AREAS, absmins, absmaxs, areas, maxareas ); -} - -int trap_AAS_AreaInfo( int areanum, void /* struct aas_areainfo_s */ *info ) { - return syscall( BOTLIB_AAS_AREA_INFO, areanum, info ); -} - -int trap_AAS_PointContents(vec3_t point) { - return syscall( BOTLIB_AAS_POINT_CONTENTS, point ); -} - -int trap_AAS_NextBSPEntity(int ent) { - return syscall( BOTLIB_AAS_NEXT_BSP_ENTITY, ent ); -} - -int trap_AAS_ValueForBSPEpairKey(int ent, char *key, char *value, int size) { - return syscall( BOTLIB_AAS_VALUE_FOR_BSP_EPAIR_KEY, ent, key, value, size ); -} - -int trap_AAS_VectorForBSPEpairKey(int ent, char *key, vec3_t v) { - return syscall( BOTLIB_AAS_VECTOR_FOR_BSP_EPAIR_KEY, ent, key, v ); -} - -int trap_AAS_FloatForBSPEpairKey(int ent, char *key, float *value) { - return syscall( BOTLIB_AAS_FLOAT_FOR_BSP_EPAIR_KEY, ent, key, value ); -} - -int trap_AAS_IntForBSPEpairKey(int ent, char *key, int *value) { - return syscall( BOTLIB_AAS_INT_FOR_BSP_EPAIR_KEY, ent, key, value ); -} - -int trap_AAS_AreaReachability(int areanum) { - return syscall( BOTLIB_AAS_AREA_REACHABILITY, areanum ); -} - -int trap_AAS_AreaTravelTimeToGoalArea(int areanum, vec3_t origin, int goalareanum, int travelflags) { - return syscall( BOTLIB_AAS_AREA_TRAVEL_TIME_TO_GOAL_AREA, areanum, origin, goalareanum, travelflags ); -} - -int trap_AAS_EnableRoutingArea( int areanum, int enable ) { - return syscall( BOTLIB_AAS_ENABLE_ROUTING_AREA, areanum, enable ); -} - -int trap_AAS_PredictRoute(void /*struct aas_predictroute_s*/ *route, int areanum, vec3_t origin, - int goalareanum, int travelflags, int maxareas, int maxtime, - int stopevent, int stopcontents, int stoptfl, int stopareanum) { - return syscall( BOTLIB_AAS_PREDICT_ROUTE, route, areanum, origin, goalareanum, travelflags, maxareas, maxtime, stopevent, stopcontents, stoptfl, stopareanum ); -} - -int trap_AAS_AlternativeRouteGoals(vec3_t start, int startareanum, vec3_t goal, int goalareanum, int travelflags, - void /*struct aas_altroutegoal_s*/ *altroutegoals, int maxaltroutegoals, - int type) { - return syscall( BOTLIB_AAS_ALTERNATIVE_ROUTE_GOAL, start, startareanum, goal, goalareanum, travelflags, altroutegoals, maxaltroutegoals, type ); -} - -int trap_AAS_Swimming(vec3_t origin) { - return syscall( BOTLIB_AAS_SWIMMING, origin ); -} - -int trap_AAS_PredictClientMovement(void /* struct aas_clientmove_s */ *move, int entnum, vec3_t origin, int presencetype, int onground, vec3_t velocity, vec3_t cmdmove, int cmdframes, int maxframes, float frametime, int stopevent, int stopareanum, int visualize) { - return syscall( BOTLIB_AAS_PREDICT_CLIENT_MOVEMENT, move, entnum, origin, presencetype, onground, velocity, cmdmove, cmdframes, maxframes, PASSFLOAT(frametime), stopevent, stopareanum, visualize ); -} - -void trap_EA_Say(int client, char *str) { - syscall( BOTLIB_EA_SAY, client, str ); -} - -void trap_EA_SayTeam(int client, char *str) { - syscall( BOTLIB_EA_SAY_TEAM, client, str ); -} - -void trap_EA_Command(int client, char *command) { - syscall( BOTLIB_EA_COMMAND, client, command ); -} - -void trap_EA_Action(int client, int action) { - syscall( BOTLIB_EA_ACTION, client, action ); -} - -void trap_EA_Gesture(int client) { - syscall( BOTLIB_EA_GESTURE, client ); -} - -void trap_EA_Talk(int client) { - syscall( BOTLIB_EA_TALK, client ); -} - -void trap_EA_Attack(int client) { - syscall( BOTLIB_EA_ATTACK, client ); -} - -void trap_EA_Use(int client) { - syscall( BOTLIB_EA_USE, client ); -} - -void trap_EA_Respawn(int client) { - syscall( BOTLIB_EA_RESPAWN, client ); -} - -void trap_EA_Crouch(int client) { - syscall( BOTLIB_EA_CROUCH, client ); -} - -void trap_EA_MoveUp(int client) { - syscall( BOTLIB_EA_MOVE_UP, client ); -} - -void trap_EA_MoveDown(int client) { - syscall( BOTLIB_EA_MOVE_DOWN, client ); -} - -void trap_EA_MoveForward(int client) { - syscall( BOTLIB_EA_MOVE_FORWARD, client ); -} - -void trap_EA_MoveBack(int client) { - syscall( BOTLIB_EA_MOVE_BACK, client ); -} - -void trap_EA_MoveLeft(int client) { - syscall( BOTLIB_EA_MOVE_LEFT, client ); -} - -void trap_EA_MoveRight(int client) { - syscall( BOTLIB_EA_MOVE_RIGHT, client ); -} - -void trap_EA_SelectWeapon(int client, int weapon) { - syscall( BOTLIB_EA_SELECT_WEAPON, client, weapon ); -} - -void trap_EA_Jump(int client) { - syscall( BOTLIB_EA_JUMP, client ); -} - -void trap_EA_DelayedJump(int client) { - syscall( BOTLIB_EA_DELAYED_JUMP, client ); -} - -void trap_EA_Move(int client, vec3_t dir, float speed) { - syscall( BOTLIB_EA_MOVE, client, dir, PASSFLOAT(speed) ); -} - -void trap_EA_View(int client, vec3_t viewangles) { - syscall( BOTLIB_EA_VIEW, client, viewangles ); -} - -void trap_EA_EndRegular(int client, float thinktime) { - syscall( BOTLIB_EA_END_REGULAR, client, PASSFLOAT(thinktime) ); -} - -void trap_EA_GetInput(int client, float thinktime, void /* struct bot_input_s */ *input) { - syscall( BOTLIB_EA_GET_INPUT, client, PASSFLOAT(thinktime), input ); -} - -void trap_EA_ResetInput(int client) { - syscall( BOTLIB_EA_RESET_INPUT, client ); -} - -int trap_BotLoadCharacter(char *charfile, float skill) { - return syscall( BOTLIB_AI_LOAD_CHARACTER, charfile, PASSFLOAT(skill)); -} - -void trap_BotFreeCharacter(int character) { - syscall( BOTLIB_AI_FREE_CHARACTER, character ); -} - -float trap_Characteristic_Float(int character, int index) { - int temp; - temp = syscall( BOTLIB_AI_CHARACTERISTIC_FLOAT, character, index ); - return (*(float*)&temp); -} - -float trap_Characteristic_BFloat(int character, int index, float min, float max) { - int temp; - temp = syscall( BOTLIB_AI_CHARACTERISTIC_BFLOAT, character, index, PASSFLOAT(min), PASSFLOAT(max) ); - return (*(float*)&temp); -} - -int trap_Characteristic_Integer(int character, int index) { - return syscall( BOTLIB_AI_CHARACTERISTIC_INTEGER, character, index ); -} - -int trap_Characteristic_BInteger(int character, int index, int min, int max) { - return syscall( BOTLIB_AI_CHARACTERISTIC_BINTEGER, character, index, min, max ); -} - -void trap_Characteristic_String(int character, int index, char *buf, int size) { - syscall( BOTLIB_AI_CHARACTERISTIC_STRING, character, index, buf, size ); -} - -int trap_BotAllocChatState(void) { - return syscall( BOTLIB_AI_ALLOC_CHAT_STATE ); -} - -void trap_BotFreeChatState(int handle) { - syscall( BOTLIB_AI_FREE_CHAT_STATE, handle ); -} - -void trap_BotQueueConsoleMessage(int chatstate, int type, char *message) { - syscall( BOTLIB_AI_QUEUE_CONSOLE_MESSAGE, chatstate, type, message ); -} - -void trap_BotRemoveConsoleMessage(int chatstate, int handle) { - syscall( BOTLIB_AI_REMOVE_CONSOLE_MESSAGE, chatstate, handle ); -} - -int trap_BotNextConsoleMessage(int chatstate, void /* struct bot_consolemessage_s */ *cm) { - return syscall( BOTLIB_AI_NEXT_CONSOLE_MESSAGE, chatstate, cm ); -} - -int trap_BotNumConsoleMessages(int chatstate) { - return syscall( BOTLIB_AI_NUM_CONSOLE_MESSAGE, chatstate ); -} - -void trap_BotInitialChat(int chatstate, char *type, int mcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7 ) { - syscall( BOTLIB_AI_INITIAL_CHAT, chatstate, type, mcontext, var0, var1, var2, var3, var4, var5, var6, var7 ); -} - -int trap_BotNumInitialChats(int chatstate, char *type) { - return syscall( BOTLIB_AI_NUM_INITIAL_CHATS, chatstate, type ); -} - -int trap_BotReplyChat(int chatstate, char *message, int mcontext, int vcontext, char *var0, char *var1, char *var2, char *var3, char *var4, char *var5, char *var6, char *var7 ) { - return syscall( BOTLIB_AI_REPLY_CHAT, chatstate, message, mcontext, vcontext, var0, var1, var2, var3, var4, var5, var6, var7 ); -} - -int trap_BotChatLength(int chatstate) { - return syscall( BOTLIB_AI_CHAT_LENGTH, chatstate ); -} - -void trap_BotEnterChat(int chatstate, int client, int sendto) { - syscall( BOTLIB_AI_ENTER_CHAT, chatstate, client, sendto ); -} - -void trap_BotGetChatMessage(int chatstate, char *buf, int size) { - syscall( BOTLIB_AI_GET_CHAT_MESSAGE, chatstate, buf, size); -} - -int trap_StringContains(char *str1, char *str2, int casesensitive) { - return syscall( BOTLIB_AI_STRING_CONTAINS, str1, str2, casesensitive ); -} - -int trap_BotFindMatch(char *str, void /* struct bot_match_s */ *match, unsigned long int context) { - return syscall( BOTLIB_AI_FIND_MATCH, str, match, context ); -} - -void trap_BotMatchVariable(void /* struct bot_match_s */ *match, int variable, char *buf, int size) { - syscall( BOTLIB_AI_MATCH_VARIABLE, match, variable, buf, size ); -} - -void trap_UnifyWhiteSpaces(char *string) { - syscall( BOTLIB_AI_UNIFY_WHITE_SPACES, string ); -} - -void trap_BotReplaceSynonyms(char *string, unsigned long int context) { - syscall( BOTLIB_AI_REPLACE_SYNONYMS, string, context ); -} - -int trap_BotLoadChatFile(int chatstate, char *chatfile, char *chatname) { - return syscall( BOTLIB_AI_LOAD_CHAT_FILE, chatstate, chatfile, chatname ); -} - -void trap_BotSetChatGender(int chatstate, int gender) { - syscall( BOTLIB_AI_SET_CHAT_GENDER, chatstate, gender ); -} - -void trap_BotSetChatName(int chatstate, char *name, int client) { - syscall( BOTLIB_AI_SET_CHAT_NAME, chatstate, name, client ); -} - -void trap_BotResetGoalState(int goalstate) { - syscall( BOTLIB_AI_RESET_GOAL_STATE, goalstate ); -} - -void trap_BotResetAvoidGoals(int goalstate) { - syscall( BOTLIB_AI_RESET_AVOID_GOALS, goalstate ); -} - -void trap_BotRemoveFromAvoidGoals(int goalstate, int number) { - syscall( BOTLIB_AI_REMOVE_FROM_AVOID_GOALS, goalstate, number); -} - -void trap_BotPushGoal(int goalstate, void /* struct bot_goal_s */ *goal) { - syscall( BOTLIB_AI_PUSH_GOAL, goalstate, goal ); -} - -void trap_BotPopGoal(int goalstate) { - syscall( BOTLIB_AI_POP_GOAL, goalstate ); -} - -void trap_BotEmptyGoalStack(int goalstate) { - syscall( BOTLIB_AI_EMPTY_GOAL_STACK, goalstate ); -} - -void trap_BotDumpAvoidGoals(int goalstate) { - syscall( BOTLIB_AI_DUMP_AVOID_GOALS, goalstate ); -} - -void trap_BotDumpGoalStack(int goalstate) { - syscall( BOTLIB_AI_DUMP_GOAL_STACK, goalstate ); -} - -void trap_BotGoalName(int number, char *name, int size) { - syscall( BOTLIB_AI_GOAL_NAME, number, name, size ); -} - -int trap_BotGetTopGoal(int goalstate, void /* struct bot_goal_s */ *goal) { - return syscall( BOTLIB_AI_GET_TOP_GOAL, goalstate, goal ); -} - -int trap_BotGetSecondGoal(int goalstate, void /* struct bot_goal_s */ *goal) { - return syscall( BOTLIB_AI_GET_SECOND_GOAL, goalstate, goal ); -} - -int trap_BotChooseLTGItem(int goalstate, vec3_t origin, int *inventory, int travelflags) { - return syscall( BOTLIB_AI_CHOOSE_LTG_ITEM, goalstate, origin, inventory, travelflags ); -} - -int trap_BotChooseNBGItem(int goalstate, vec3_t origin, int *inventory, int travelflags, void /* struct bot_goal_s */ *ltg, float maxtime) { - return syscall( BOTLIB_AI_CHOOSE_NBG_ITEM, goalstate, origin, inventory, travelflags, ltg, PASSFLOAT(maxtime) ); -} - -int trap_BotTouchingGoal(vec3_t origin, void /* struct bot_goal_s */ *goal) { - return syscall( BOTLIB_AI_TOUCHING_GOAL, origin, goal ); -} - -int trap_BotItemGoalInVisButNotVisible(int viewer, vec3_t eye, vec3_t viewangles, void /* struct bot_goal_s */ *goal) { - return syscall( BOTLIB_AI_ITEM_GOAL_IN_VIS_BUT_NOT_VISIBLE, viewer, eye, viewangles, goal ); -} - -int trap_BotGetLevelItemGoal(int index, char *classname, void /* struct bot_goal_s */ *goal) { - return syscall( BOTLIB_AI_GET_LEVEL_ITEM_GOAL, index, classname, goal ); -} - -int trap_BotGetNextCampSpotGoal(int num, void /* struct bot_goal_s */ *goal) { - return syscall( BOTLIB_AI_GET_NEXT_CAMP_SPOT_GOAL, num, goal ); -} - -int trap_BotGetMapLocationGoal(char *name, void /* struct bot_goal_s */ *goal) { - return syscall( BOTLIB_AI_GET_MAP_LOCATION_GOAL, name, goal ); -} - -float trap_BotAvoidGoalTime(int goalstate, int number) { - int temp; - temp = syscall( BOTLIB_AI_AVOID_GOAL_TIME, goalstate, number ); - return (*(float*)&temp); -} - -void trap_BotSetAvoidGoalTime(int goalstate, int number, float avoidtime) { - syscall( BOTLIB_AI_SET_AVOID_GOAL_TIME, goalstate, number, PASSFLOAT(avoidtime)); -} - -void trap_BotInitLevelItems(void) { - syscall( BOTLIB_AI_INIT_LEVEL_ITEMS ); -} - -void trap_BotUpdateEntityItems(void) { - syscall( BOTLIB_AI_UPDATE_ENTITY_ITEMS ); -} - -int trap_BotLoadItemWeights(int goalstate, char *filename) { - return syscall( BOTLIB_AI_LOAD_ITEM_WEIGHTS, goalstate, filename ); -} - -void trap_BotFreeItemWeights(int goalstate) { - syscall( BOTLIB_AI_FREE_ITEM_WEIGHTS, goalstate ); -} - -void trap_BotInterbreedGoalFuzzyLogic(int parent1, int parent2, int child) { - syscall( BOTLIB_AI_INTERBREED_GOAL_FUZZY_LOGIC, parent1, parent2, child ); -} - -void trap_BotSaveGoalFuzzyLogic(int goalstate, char *filename) { - syscall( BOTLIB_AI_SAVE_GOAL_FUZZY_LOGIC, goalstate, filename ); -} - -void trap_BotMutateGoalFuzzyLogic(int goalstate, float range) { - syscall( BOTLIB_AI_MUTATE_GOAL_FUZZY_LOGIC, goalstate, range ); -} - -int trap_BotAllocGoalState(int state) { - return syscall( BOTLIB_AI_ALLOC_GOAL_STATE, state ); -} - -void trap_BotFreeGoalState(int handle) { - syscall( BOTLIB_AI_FREE_GOAL_STATE, handle ); -} - -void trap_BotResetMoveState(int movestate) { - syscall( BOTLIB_AI_RESET_MOVE_STATE, movestate ); -} - -void trap_BotAddAvoidSpot(int movestate, vec3_t origin, float radius, int type) { - syscall( BOTLIB_AI_ADD_AVOID_SPOT, movestate, origin, PASSFLOAT(radius), type); -} - -void trap_BotMoveToGoal(void /* struct bot_moveresult_s */ *result, int movestate, void /* struct bot_goal_s */ *goal, int travelflags) { - syscall( BOTLIB_AI_MOVE_TO_GOAL, result, movestate, goal, travelflags ); -} - -int trap_BotMoveInDirection(int movestate, vec3_t dir, float speed, int type) { - return syscall( BOTLIB_AI_MOVE_IN_DIRECTION, movestate, dir, PASSFLOAT(speed), type ); -} - -void trap_BotResetAvoidReach(int movestate) { - syscall( BOTLIB_AI_RESET_AVOID_REACH, movestate ); -} - -void trap_BotResetLastAvoidReach(int movestate) { - syscall( BOTLIB_AI_RESET_LAST_AVOID_REACH,movestate ); -} - -int trap_BotReachabilityArea(vec3_t origin, int testground) { - return syscall( BOTLIB_AI_REACHABILITY_AREA, origin, testground ); -} - -int trap_BotMovementViewTarget(int movestate, void /* struct bot_goal_s */ *goal, int travelflags, float lookahead, vec3_t target) { - return syscall( BOTLIB_AI_MOVEMENT_VIEW_TARGET, movestate, goal, travelflags, PASSFLOAT(lookahead), target ); -} - -int trap_BotPredictVisiblePosition(vec3_t origin, int areanum, void /* struct bot_goal_s */ *goal, int travelflags, vec3_t target) { - return syscall( BOTLIB_AI_PREDICT_VISIBLE_POSITION, origin, areanum, goal, travelflags, target ); -} - -int trap_BotAllocMoveState(void) { - return syscall( BOTLIB_AI_ALLOC_MOVE_STATE ); -} - -void trap_BotFreeMoveState(int handle) { - syscall( BOTLIB_AI_FREE_MOVE_STATE, handle ); -} - -void trap_BotInitMoveState(int handle, void /* struct bot_initmove_s */ *initmove) { - syscall( BOTLIB_AI_INIT_MOVE_STATE, handle, initmove ); -} - -int trap_BotChooseBestFightWeapon(int weaponstate, int *inventory) { - return syscall( BOTLIB_AI_CHOOSE_BEST_FIGHT_WEAPON, weaponstate, inventory ); -} - -void trap_BotGetWeaponInfo(int weaponstate, int weapon, void /* struct weaponinfo_s */ *weaponinfo) { - syscall( BOTLIB_AI_GET_WEAPON_INFO, weaponstate, weapon, weaponinfo ); -} - -int trap_BotLoadWeaponWeights(int weaponstate, char *filename) { - return syscall( BOTLIB_AI_LOAD_WEAPON_WEIGHTS, weaponstate, filename ); -} - -int trap_BotAllocWeaponState(void) { - return syscall( BOTLIB_AI_ALLOC_WEAPON_STATE ); -} - -void trap_BotFreeWeaponState(int weaponstate) { - syscall( BOTLIB_AI_FREE_WEAPON_STATE, weaponstate ); -} - -void trap_BotResetWeaponState(int weaponstate) { - syscall( BOTLIB_AI_RESET_WEAPON_STATE, weaponstate ); -} - -int trap_GeneticParentsAndChildSelection(int numranks, float *ranks, int *parent1, int *parent2, int *child) { - return syscall( BOTLIB_AI_GENETIC_PARENTS_AND_CHILD_SELECTION, numranks, ranks, parent1, parent2, child ); -} - -int trap_PC_LoadSource( const char *filename ) { - return syscall( BOTLIB_PC_LOAD_SOURCE, filename ); -} - -int trap_PC_FreeSource( int handle ) { - return syscall( BOTLIB_PC_FREE_SOURCE, handle ); -} - -int trap_PC_ReadToken( int handle, pc_token_t *pc_token ) { - return syscall( BOTLIB_PC_READ_TOKEN, handle, pc_token ); -} - -int trap_PC_SourceFileAndLine( int handle, char *filename, int *line ) { - return syscall( BOTLIB_PC_SOURCE_FILE_AND_LINE, handle, filename, line ); -} diff --git a/src/game/g_target.c b/src/game/g_target.c index 2f938a65..249d120a 100644 --- a/src/game/g_target.c +++ b/src/game/g_target.c @@ -58,15 +58,16 @@ void SP_target_give( gentity_t *ent ) takes away all the activators powerups. Used to drop flight powerups into death puts. */ -void Use_target_remove_powerups( gentity_t *ent, gentity_t *other, gentity_t *activator ) { - if( !activator->client ) { +void Use_target_remove_powerups( gentity_t *ent, gentity_t *other, gentity_t *activator ) +{ + if( !activator->client ) return; - } memset( activator->client->ps.powerups, 0, sizeof( activator->client->ps.powerups ) ); } -void SP_target_remove_powerups( gentity_t *ent ) { +void SP_target_remove_powerups( gentity_t *ent ) +{ ent->use = Use_target_remove_powerups; } @@ -77,25 +78,27 @@ void SP_target_remove_powerups( gentity_t *ent ) { "wait" seconds to pause before firing targets. "random" delay variance, total delay = delay +/- random seconds */ -void Think_Target_Delay( gentity_t *ent ) { +void Think_Target_Delay( gentity_t *ent ) +{ G_UseTargets( ent, ent->activator ); } -void Use_Target_Delay( gentity_t *ent, gentity_t *other, gentity_t *activator ) { - ent->nextthink = level.time + ( ent->wait + ent->random * crandom() ) * 1000; +void Use_Target_Delay( gentity_t *ent, gentity_t *other, gentity_t *activator ) +{ + ent->nextthink = level.time + ( ent->wait + ent->random * crandom( ) ) * 1000; ent->think = Think_Target_Delay; ent->activator = activator; } -void SP_target_delay( gentity_t *ent ) { +void SP_target_delay( gentity_t *ent ) +{ // check delay for backwards compatability - if ( !G_SpawnFloat( "delay", "0", &ent->wait ) ) { + if( !G_SpawnFloat( "delay", "0", &ent->wait ) ) G_SpawnFloat( "wait", "1", &ent->wait ); - } - if ( !ent->wait ) { + if( !ent->wait ) ent->wait = 1; - } + ent->use = Use_Target_Delay; } @@ -107,14 +110,16 @@ void SP_target_delay( gentity_t *ent ) { The activator is given this many points. */ -void Use_Target_Score (gentity_t *ent, gentity_t *other, gentity_t *activator) { +void Use_Target_Score( gentity_t *ent, gentity_t *other, gentity_t *activator ) +{ AddScore( activator, ent->count ); } -void SP_target_score( gentity_t *ent ) { - if ( !ent->count ) { +void SP_target_score( gentity_t *ent ) +{ + if( !ent->count ) ent->count = 1; - } + ent->use = Use_Target_Score; } @@ -125,7 +130,7 @@ void SP_target_score( gentity_t *ent ) { "message" text to print If "private", only the activator gets the message. If no checks, all clients get the message. */ -void Use_Target_Print (gentity_t *ent, gentity_t *other, gentity_t *activator) +void Use_Target_Print( gentity_t *ent, gentity_t *other, gentity_t *activator ) { if( activator->client && ( ent->spawnflags & 4 ) ) { @@ -146,7 +151,8 @@ void Use_Target_Print (gentity_t *ent, gentity_t *other, gentity_t *activator) trap_SendServerCommand( -1, va("cp \"%s\"", ent->message ) ); } -void SP_target_print( gentity_t *ent ) { +void SP_target_print( gentity_t *ent ) +{ ent->use = Use_Target_Print; } @@ -166,46 +172,49 @@ Multiple identical looping sounds will just increase volume without any speed co "wait" : Seconds between auto triggerings, 0 = don't auto trigger "random" wait variance, default is 0 */ -void Use_Target_Speaker (gentity_t *ent, gentity_t *other, gentity_t *activator) { - if (ent->spawnflags & 3) { // looping sound toggles - if (ent->s.loopSound) +void Use_Target_Speaker( gentity_t *ent, gentity_t *other, gentity_t *activator ) +{ + if( ent->spawnflags & 3 ) + { // looping sound toggles + if( ent->s.loopSound ) ent->s.loopSound = 0; // turn it off else ent->s.loopSound = ent->noise_index; // start it - }else { // normal sound - if ( ent->spawnflags & 8 ) { + } + else + { + // normal sound + if( ent->spawnflags & 8 ) G_AddEvent( activator, EV_GENERAL_SOUND, ent->noise_index ); - } else if (ent->spawnflags & 4) { + else if( ent->spawnflags & 4 ) G_AddEvent( ent, EV_GLOBAL_SOUND, ent->noise_index ); - } else { + else G_AddEvent( ent, EV_GENERAL_SOUND, ent->noise_index ); - } } } -void SP_target_speaker( gentity_t *ent ) { - char buffer[MAX_QPATH]; +void SP_target_speaker( gentity_t *ent ) +{ + char buffer[ MAX_QPATH ]; char *s; G_SpawnFloat( "wait", "0", &ent->wait ); G_SpawnFloat( "random", "0", &ent->random ); - if ( !G_SpawnString( "noise", "NOSOUND", &s ) ) { + if( !G_SpawnString( "noise", "NOSOUND", &s ) ) G_Error( "target_speaker without a noise key at %s", vtos( ent->s.origin ) ); - } // force all client reletive sounds to be "activator" speakers that // play on the entity that activates it - if ( s[0] == '*' ) { + if( s[ 0 ] == '*' ) ent->spawnflags |= 8; - } - if (!strstr( s, ".wav" )) { - Com_sprintf (buffer, sizeof(buffer), "%s.wav", s ); - } else { - Q_strncpyz( buffer, s, sizeof(buffer) ); - } - ent->noise_index = G_SoundIndex(buffer); + if( !strstr( s, ".wav" ) ) + Com_sprintf( buffer, sizeof( buffer ), "%s.wav", s ); + else + Q_strncpyz( buffer, s, sizeof( buffer ) ); + + ent->noise_index = G_SoundIndex( buffer ); // a repeating speaker can be done completely client side ent->s.eType = ET_SPEAKER; @@ -215,15 +224,13 @@ void SP_target_speaker( gentity_t *ent ) { // check for prestarted looping sound - if ( ent->spawnflags & 1 ) { + if( ent->spawnflags & 1 ) ent->s.loopSound = ent->noise_index; - } ent->use = Use_Target_Speaker; - if (ent->spawnflags & 4) { + if( ent->spawnflags & 4 ) ent->r.svFlags |= SVF_BROADCAST; - } VectorCopy( ent->s.origin, ent->s.pos.trBase ); @@ -239,88 +246,94 @@ void SP_target_speaker( gentity_t *ent ) { /*QUAKED target_laser (0 .5 .8) (-8 -8 -8) (8 8 8) START_ON When triggered, fires a laser. You can either set a target or a direction. */ -void target_laser_think (gentity_t *self) { +void target_laser_think( gentity_t *self ) +{ vec3_t end; trace_t tr; vec3_t point; // if pointed at another entity, set movedir to point at it - if ( self->enemy ) { - VectorMA (self->enemy->s.origin, 0.5, self->enemy->r.mins, point); - VectorMA (point, 0.5, self->enemy->r.maxs, point); - VectorSubtract (point, self->s.origin, self->movedir); - VectorNormalize (self->movedir); + if( self->enemy ) + { + VectorMA( self->enemy->s.origin, 0.5, self->enemy->r.mins, point ); + VectorMA( point, 0.5, self->enemy->r.maxs, point ); + VectorSubtract( point, self->s.origin, self->movedir ); + VectorNormalize( self->movedir ); } // fire forward and see what we hit - VectorMA (self->s.origin, 2048, self->movedir, end); + VectorMA( self->s.origin, 2048, self->movedir, end ); - trap_Trace( &tr, self->s.origin, NULL, NULL, end, self->s.number, CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE); + trap_Trace( &tr, self->s.origin, NULL, NULL, end, self->s.number, + CONTENTS_SOLID | CONTENTS_BODY | CONTENTS_CORPSE ); - if ( tr.entityNum ) { + if( tr.entityNum ) + { // hurt it if we can - G_Damage ( &g_entities[tr.entityNum], self, self->activator, self->movedir, - tr.endpos, self->damage, DAMAGE_NO_KNOCKBACK, MOD_TARGET_LASER); + G_Damage( &g_entities[ tr.entityNum ], self, self->activator, self->movedir, + tr.endpos, self->damage, DAMAGE_NO_KNOCKBACK, MOD_TARGET_LASER ); } - VectorCopy (tr.endpos, self->s.origin2); + VectorCopy( tr.endpos, self->s.origin2 ); trap_LinkEntity( self ); self->nextthink = level.time + FRAMETIME; } -void target_laser_on (gentity_t *self) +void target_laser_on( gentity_t *self ) { - if (!self->activator) + if( !self->activator ) self->activator = self; - target_laser_think (self); + + target_laser_think( self ); } -void target_laser_off (gentity_t *self) +void target_laser_off( gentity_t *self ) { trap_UnlinkEntity( self ); self->nextthink = 0; } -void target_laser_use (gentity_t *self, gentity_t *other, gentity_t *activator) +void target_laser_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { self->activator = activator; - if ( self->nextthink > 0 ) - target_laser_off (self); + if( self->nextthink > 0 ) + target_laser_off( self ); else - target_laser_on (self); + target_laser_on( self ); } -void target_laser_start (gentity_t *self) +void target_laser_start( gentity_t *self ) { gentity_t *ent; self->s.eType = ET_BEAM; - if (self->target) { - ent = G_Find (NULL, FOFS(targetname), self->target); - if (!ent) { - G_Printf ("%s at %s: %s is a bad target\n", self->classname, vtos(self->s.origin), self->target); - } + if( self->target ) + { + ent = G_Find( NULL, FOFS( targetname ), self->target ); + + if( !ent ) + G_Printf ( "%s at %s: %s is a bad target\n", self->classname, vtos( self->s.origin ), self->target ); + self->enemy = ent; - } else { - G_SetMovedir (self->s.angles, self->movedir); } + else + G_SetMovedir( self->s.angles, self->movedir ); self->use = target_laser_use; self->think = target_laser_think; - if ( !self->damage ) { + if( !self->damage ) self->damage = 1; - } - if (self->spawnflags & 1) - target_laser_on (self); + if( self->spawnflags & 1 ) + target_laser_on( self ); else - target_laser_off (self); + target_laser_off( self ); } -void SP_target_laser (gentity_t *self) +void SP_target_laser( gentity_t *self ) { // let everything else get spawned before we start firing self->think = target_laser_start; @@ -330,14 +343,18 @@ void SP_target_laser (gentity_t *self) //========================================================== -void target_teleporter_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { +void target_teleporter_use( gentity_t *self, gentity_t *other, gentity_t *activator ) +{ gentity_t *dest; - if (!activator->client) + if( !activator->client ) return; + dest = G_PickTarget( self->target ); - if (!dest) { - G_Printf ("Couldn't find teleporter destination\n"); + + if( !dest ) + { + G_Printf( "Couldn't find teleporter destination\n" ); return; } @@ -347,9 +364,10 @@ void target_teleporter_use( gentity_t *self, gentity_t *other, gentity_t *activa /*QUAKED target_teleporter (1 0 0) (-8 -8 -8) (8 8 8) The activator will be teleported away. */ -void SP_target_teleporter( gentity_t *self ) { - if (!self->targetname) - G_Printf("untargeted %s at %s\n", self->classname, vtos(self->s.origin)); +void SP_target_teleporter( gentity_t *self ) +{ + if( !self->targetname ) + G_Printf( "untargeted %s at %s\n", self->classname, vtos( self->s.origin ) ); self->use = target_teleporter_use; } @@ -397,27 +415,30 @@ void SP_target_relay( gentity_t *self ) /*QUAKED target_kill (.5 .5 .5) (-8 -8 -8) (8 8 8) Kills the activator. */ -void target_kill_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { - G_Damage ( activator, NULL, NULL, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG); +void target_kill_use( gentity_t *self, gentity_t *other, gentity_t *activator ) +{ + G_Damage( activator, NULL, NULL, NULL, NULL, 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG ); } -void SP_target_kill( gentity_t *self ) { +void SP_target_kill( gentity_t *self ) +{ self->use = target_kill_use; } /*QUAKED target_position (0 0.5 0) (-4 -4 -4) (4 4 4) Used as a positional target for in-game calculation, like jumppad targets. */ -void SP_target_position( gentity_t *self ){ +void SP_target_position( gentity_t *self ) +{ G_SetOrigin( self, self->s.origin ); } -static void target_location_linkup(gentity_t *ent) +static void target_location_linkup( gentity_t *ent ) { int i; int n; - if (level.locationLinked) + if( level.locationLinked ) return; level.locationLinked = qtrue; @@ -426,10 +447,10 @@ static void target_location_linkup(gentity_t *ent) trap_SetConfigstring( CS_LOCATIONS, "unknown" ); - for (i = 0, ent = g_entities, n = 1; - i < level.num_entities; - i++, ent++) { - if (ent->classname && !Q_stricmp(ent->classname, "target_location")) { + for( i = 0, ent = g_entities, n = 1; i < level.num_entities; i++, ent++) + { + if( ent->classname && !Q_stricmp( ent->classname, "target_location" ) ) + { // lets overload some variables! ent->health = n; // use for location marking trap_SetConfigstring( CS_LOCATIONS + n, ent->message ); @@ -438,7 +459,6 @@ static void target_location_linkup(gentity_t *ent) level.locationHead = ent; } } - // All linked together now } @@ -450,7 +470,8 @@ Set "count" to 0-7 for color. Closest target_location in sight used for the location, if none in site, closest in distance */ -void SP_target_location( gentity_t *self ){ +void SP_target_location( gentity_t *self ) +{ self->think = target_location_linkup; self->nextthink = level.time + 200; // Let them all spawn first diff --git a/src/game/g_team.c b/src/game/g_team.c index 33292381..538a29e2 100644 --- a/src/game/g_team.c +++ b/src/game/g_team.c @@ -16,39 +16,25 @@ #include "g_local.h" -typedef struct teamgame_s { - float last_flag_capture; - int last_capture_team; - flagStatus_t redStatus; // CTF - flagStatus_t blueStatus; // CTF - flagStatus_t flagStatus; // One Flag CTF - int redTakenTime; - int blueTakenTime; - int redObeliskAttackedTime; - int blueObeliskAttackedTime; -} teamgame_t; - -teamgame_t teamgame; - -void Team_SetFlagStatus( int team, flagStatus_t status ); - // NULL for everyone -void QDECL PrintMsg( gentity_t *ent, const char *fmt, ... ) { - char msg[1024]; - va_list argptr; +void QDECL PrintMsg( gentity_t *ent, const char *fmt, ... ) +{ + char msg[ 1024 ]; + va_list argptr; char *p; - va_start (argptr,fmt); - if (vsprintf (msg, fmt, argptr) > sizeof(msg)) { + va_start( argptr,fmt ); + + if( vsprintf( msg, fmt, argptr ) > sizeof( msg ) ) G_Error ( "PrintMsg overrun" ); - } - va_end (argptr); + + va_end( argptr ); // double quotes are bad - while ((p = strchr(msg, '"')) != NULL) + while( ( p = strchr( msg, '"' ) ) != NULL ) *p = '\''; - trap_SendServerCommand ( ( (ent == NULL) ? -1 : ent-g_entities ), va("print \"%s\"", msg )); + trap_SendServerCommand( ( ( ent == NULL ) ? -1 : ent-g_entities ), va( "print \"%s\"", msg ) ); } @@ -156,60 +142,69 @@ Format: ================== */ -void TeamplayInfoMessage( gentity_t *ent ) { - char entry[1024]; - char string[8192]; - int stringlength; - int i, j; +void TeamplayInfoMessage( gentity_t *ent ) +{ + char entry[ 1024 ]; + char string[ 8192 ]; + int stringlength; + int i, j; gentity_t *player; - int cnt; - int h, a = 0; - int clients[TEAM_MAXOVERLAY]; + int cnt; + int h, a = 0; + int clients[ TEAM_MAXOVERLAY ]; - if ( ! ent->client->pers.teamInfo ) + if( ! ent->client->pers.teamInfo ) return; // figure out what client should be on the display // we are limited to 8, but we want to use the top eight players // but in client order (so they don't keep changing position on the overlay) - for (i = 0, cnt = 0; i < g_maxclients.integer && cnt < TEAM_MAXOVERLAY; i++) { - player = g_entities + level.sortedClients[i]; - if (player->inuse && player->client->sess.sessionTeam == - ent->client->sess.sessionTeam ) { - clients[cnt++] = level.sortedClients[i]; - } + for( i = 0, cnt = 0; i < g_maxclients.integer && cnt < TEAM_MAXOVERLAY; i++ ) + { + player = g_entities + level.sortedClients[ i ]; + + if( player->inuse && player->client->sess.sessionTeam == + ent->client->sess.sessionTeam ) + clients[ cnt++ ] = level.sortedClients[ i ]; } // We have the top eight players, sort them by clientNum - qsort( clients, cnt, sizeof( clients[0] ), SortClients ); + qsort( clients, cnt, sizeof( clients[ 0 ] ), SortClients ); // send the latest information on all clients - string[0] = 0; + string[ 0 ] = 0; stringlength = 0; - for (i = 0, cnt = 0; i < g_maxclients.integer && cnt < TEAM_MAXOVERLAY; i++) { + for( i = 0, cnt = 0; i < g_maxclients.integer && cnt < TEAM_MAXOVERLAY; i++) + { player = g_entities + i; - if (player->inuse && player->client->sess.sessionTeam == - ent->client->sess.sessionTeam ) { - - h = player->client->ps.stats[STAT_HEALTH]; - if (h < 0) h = 0; + + if( player->inuse && player->client->sess.sessionTeam == + ent->client->sess.sessionTeam ) + { + h = player->client->ps.stats[ STAT_HEALTH ]; + + if( h < 0 ) + h = 0; - Com_sprintf (entry, sizeof(entry), + Com_sprintf( entry, sizeof( entry ), " %i %i %i %i %i %i", // level.sortedClients[i], player->client->pers.teamState.location, h, a, i, player->client->pers.teamState.location, h, a, - player->client->ps.weapon, player->s.powerups); - j = strlen(entry); - if (stringlength + j > sizeof(string)) + player->client->ps.weapon, player->s.powerups ); + + j = strlen( entry ); + + if( stringlength + j > sizeof( string ) ) break; - strcpy (string + stringlength, entry); + + strcpy( string + stringlength, entry ); stringlength += j; cnt++; } } - trap_SendServerCommand( ent-g_entities, va("tinfo %i %s", cnt, string) ); + trap_SendServerCommand( ent - g_entities, va( "tinfo %i %s", cnt, string ) ); } void CheckTeamStatus( void ) diff --git a/src/game/g_trigger.c b/src/game/g_trigger.c index 27b136c6..95359f7a 100644 --- a/src/game/g_trigger.c +++ b/src/game/g_trigger.c @@ -17,9 +17,10 @@ #include "g_local.h" -void InitTrigger( gentity_t *self ) { - if (!VectorCompare (self->s.angles, vec3_origin)) - G_SetMovedir (self->s.angles, self->movedir); +void InitTrigger( gentity_t *self ) +{ + if( !VectorCompare( self->s.angles, vec3_origin ) ) + G_SetMovedir( self->s.angles, self->movedir ); trap_SetBrushModel( self, self->model ); self->r.contents = CONTENTS_TRIGGER; // replaces the -1 from trap_SetBrushModel @@ -28,7 +29,8 @@ void InitTrigger( gentity_t *self ) { // the wait time has passed, so set back up for another activation -void multi_wait( gentity_t *ent ) { +void multi_wait( gentity_t *ent ) +{ ent->nextthink = 0; } @@ -70,14 +72,16 @@ void multi_trigger( gentity_t *ent, gentity_t *activator ) } } -void Use_Multi( gentity_t *ent, gentity_t *other, gentity_t *activator ) { +void Use_Multi( gentity_t *ent, gentity_t *other, gentity_t *activator ) +{ multi_trigger( ent, activator ); } -void Touch_Multi( gentity_t *self, gentity_t *other, trace_t *trace ) { - if( !other->client ) { +void Touch_Multi( gentity_t *self, gentity_t *other, trace_t *trace ) +{ + if( !other->client ) return; - } + multi_trigger( self, other ); } @@ -88,11 +92,13 @@ Variable sized repeatable trigger. Must be targeted at one or more entities. so, the basic time between firing is a random time between (wait - random) and (wait + random) */ -void SP_trigger_multiple( gentity_t *ent ) { +void SP_trigger_multiple( gentity_t *ent ) +{ G_SpawnFloat( "wait", "0.5", &ent->wait ); G_SpawnFloat( "random", "0", &ent->random ); - if ( ent->random >= ent->wait && ent->wait >= 0 ) { + if( ent->random >= ent->wait && ent->wait >= 0 ) + { ent->random = ent->wait - FRAMETIME; G_Printf( "trigger_multiple has random >= wait\n" ); } @@ -101,7 +107,7 @@ void SP_trigger_multiple( gentity_t *ent ) { ent->use = Use_Multi; InitTrigger( ent ); - trap_LinkEntity (ent); + trap_LinkEntity( ent ); } @@ -114,15 +120,17 @@ trigger_always ============================================================================== */ -void trigger_always_think( gentity_t *ent ) { - G_UseTargets(ent, ent); +void trigger_always_think( gentity_t *ent ) +{ + G_UseTargets( ent, ent ); G_FreeEntity( ent ); } /*QUAKED trigger_always (.5 .5 .5) (-8 -8 -8) (8 8 8) This trigger will always fire. It is activated by the world. */ -void SP_trigger_always (gentity_t *ent) { +void SP_trigger_always( gentity_t *ent ) +{ // we must have some delay to make sure our use targets are present ent->nextthink = level.time + 300; ent->think = trigger_always_think; @@ -137,10 +145,10 @@ trigger_push ============================================================================== */ -void trigger_push_touch (gentity_t *self, gentity_t *other, trace_t *trace ) { - if ( !other->client ) { +void trigger_push_touch( gentity_t *self, gentity_t *other, trace_t *trace ) +{ + if( !other->client ) return; - } BG_TouchJumpPad( &other->client->ps, &self->s ); } @@ -153,38 +161,43 @@ AimAtTarget Calculate origin2 so the target apogee will be hit ================= */ -void AimAtTarget( gentity_t *self ) { +void AimAtTarget( gentity_t *self ) +{ gentity_t *ent; vec3_t origin; - float height, gravity, time, forward; - float dist; + float height, gravity, time, forward; + float dist; VectorAdd( self->r.absmin, self->r.absmax, origin ); - VectorScale ( origin, 0.5, origin ); + VectorScale( origin, 0.5, origin ); ent = G_PickTarget( self->target ); - if ( !ent ) { + + if( !ent ) + { G_FreeEntity( self ); return; } - height = ent->s.origin[2] - origin[2]; + height = ent->s.origin[ 2 ] - origin[ 2 ]; gravity = g_gravity.value; - time = sqrt( height / ( .5 * gravity ) ); - if ( !time ) { + time = sqrt( height / ( 0.5 * gravity ) ); + + if( !time ) + { G_FreeEntity( self ); return; } // set s.origin2 to the push velocity - VectorSubtract ( ent->s.origin, origin, self->s.origin2 ); - self->s.origin2[2] = 0; - dist = VectorNormalize( self->s.origin2); + VectorSubtract( ent->s.origin, origin, self->s.origin2 ); + self->s.origin2[ 2 ] = 0; + dist = VectorNormalize( self->s.origin2 ); forward = dist / time; VectorScale( self->s.origin2, forward, self->s.origin2 ); - self->s.origin2[2] = time * gravity; + self->s.origin2[ 2 ] = time * gravity; } @@ -192,39 +205,37 @@ void AimAtTarget( gentity_t *self ) { Must point at a target_position, which will be the apex of the leap. This will be client side predicted, unlike target_push */ -void SP_trigger_push( gentity_t *self ) { - InitTrigger (self); +void SP_trigger_push( gentity_t *self ) +{ + InitTrigger( self ); // unlike other triggers, we need to send this one to the client self->r.svFlags &= ~SVF_NOCLIENT; // make sure the client precaches this sound - G_SoundIndex("sound/world/jumppad.wav"); + G_SoundIndex( "sound/world/jumppad.wav" ); self->s.eType = ET_PUSH_TRIGGER; self->touch = trigger_push_touch; self->think = AimAtTarget; self->nextthink = level.time + FRAMETIME; - trap_LinkEntity (self); + trap_LinkEntity( self ); } -void Use_target_push( gentity_t *self, gentity_t *other, gentity_t *activator ) { - if ( !activator->client ) { +void Use_target_push( gentity_t *self, gentity_t *other, gentity_t *activator ) +{ + if( !activator->client ) return; - } - if ( activator->client->ps.pm_type != PM_NORMAL ) { + if( activator->client->ps.pm_type != PM_NORMAL ) return; - } - /*if ( activator->client->ps.powerups[PW_FLIGHT] ) { - return; - }*/ - VectorCopy (self->s.origin2, activator->client->ps.velocity); + VectorCopy( self->s.origin2, activator->client->ps.velocity ); // play fly sound every 1.5 seconds - if ( activator->fly_sound_debounce_time < level.time ) { + if( activator->fly_sound_debounce_time < level.time ) + { activator->fly_sound_debounce_time = level.time + 1500; G_Sound( activator, CHAN_AUTO, self->noise_index ); } @@ -235,24 +246,27 @@ Pushes the activator in the direction.of angle, or towards a target apex. "speed" defaults to 1000 if "bouncepad", play bounce noise instead of windfly */ -void SP_target_push( gentity_t *self ) { - if (!self->speed) { +void SP_target_push( gentity_t *self ) +{ + if( !self->speed ) self->speed = 1000; - } - G_SetMovedir (self->s.angles, self->s.origin2); - VectorScale (self->s.origin2, self->speed, self->s.origin2); - if ( self->spawnflags & 1 ) { - self->noise_index = G_SoundIndex("sound/world/jumppad.wav"); - } else { - self->noise_index = G_SoundIndex("sound/misc/windfly.wav"); - } - if ( self->target ) { + G_SetMovedir( self->s.angles, self->s.origin2 ); + VectorScale( self->s.origin2, self->speed, self->s.origin2 ); + + if( self->spawnflags & 1 ) + self->noise_index = G_SoundIndex( "sound/world/jumppad.wav" ); + else + self->noise_index = G_SoundIndex( "sound/misc/windfly.wav" ); + + if( self->target ) + { VectorCopy( self->s.origin, self->r.absmin ); VectorCopy( self->s.origin, self->r.absmax ); self->think = AimAtTarget; self->nextthink = level.time + FRAMETIME; } + self->use = Use_target_push; } @@ -264,25 +278,27 @@ trigger_teleport ============================================================================== */ -void trigger_teleporter_touch (gentity_t *self, gentity_t *other, trace_t *trace ) { +void trigger_teleporter_touch( gentity_t *self, gentity_t *other, trace_t *trace ) +{ gentity_t *dest; - if ( !other->client ) { + if( !other->client ) return; - } - if ( other->client->ps.pm_type == PM_DEAD ) { + + if( other->client->ps.pm_type == PM_DEAD ) return; - } + // Spectators only? - if ( ( self->spawnflags & 1 ) && - other->client->sess.sessionTeam != TEAM_SPECTATOR ) { + if( ( self->spawnflags & 1 ) && + other->client->sess.sessionTeam != TEAM_SPECTATOR ) return; - } - dest = G_PickTarget( self->target ); - if (!dest) { - G_Printf ("Couldn't find teleporter destination\n"); + dest = G_PickTarget( self->target ); + + if( !dest ) + { + G_Printf( "Couldn't find teleporter destination\n" ); return; } @@ -298,24 +314,24 @@ If spectator is set, only spectators can use this teleport Spectator teleporters are not normally placed in the editor, but are created automatically near doors to allow spectators to move through them */ -void SP_trigger_teleport( gentity_t *self ) { - InitTrigger (self); +void SP_trigger_teleport( gentity_t *self ) +{ + InitTrigger( self ); // unlike other triggers, we need to send this one to the client // unless is a spectator trigger - if ( self->spawnflags & 1 ) { + if( self->spawnflags & 1 ) self->r.svFlags |= SVF_NOCLIENT; - } else { + else self->r.svFlags &= ~SVF_NOCLIENT; - } // make sure the client precaches this sound - G_SoundIndex("sound/world/jumppad.wav"); + G_SoundIndex( "sound/world/jumppad.wav" ); self->s.eType = ET_TELEPORT_TRIGGER; self->touch = trigger_teleporter_touch; - trap_LinkEntity (self); + trap_LinkEntity( self ); } @@ -339,63 +355,59 @@ NO_PROTECTION *nothing* stops the damage "dmg" default 5 (whole numbers only) */ -void hurt_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { - if ( self->r.linked ) { +void hurt_use( gentity_t *self, gentity_t *other, gentity_t *activator ) +{ + if( self->r.linked ) trap_UnlinkEntity( self ); - } else { + else trap_LinkEntity( self ); - } } -void hurt_touch( gentity_t *self, gentity_t *other, trace_t *trace ) { +void hurt_touch( gentity_t *self, gentity_t *other, trace_t *trace ) +{ int dflags; - if ( !other->takedamage ) { + if( !other->takedamage ) return; - } - if ( self->timestamp > level.time ) { + if( self->timestamp > level.time ) return; - } - if ( self->spawnflags & 16 ) { + if( self->spawnflags & 16 ) self->timestamp = level.time + 1000; - } else { + else self->timestamp = level.time + FRAMETIME; - } // play sound - if ( !(self->spawnflags & 4) ) { + if( !( self->spawnflags & 4 ) ) G_Sound( other, CHAN_AUTO, self->noise_index ); - } - if (self->spawnflags & 8) + if( self->spawnflags & 8 ) dflags = DAMAGE_NO_PROTECTION; else dflags = 0; - G_Damage (other, self, self, NULL, NULL, self->damage, dflags, MOD_TRIGGER_HURT); + + G_Damage( other, self, self, NULL, NULL, self->damage, dflags, MOD_TRIGGER_HURT ); } -void SP_trigger_hurt( gentity_t *self ) { - InitTrigger (self); +void SP_trigger_hurt( gentity_t *self ) +{ + InitTrigger( self ); self->noise_index = G_SoundIndex( "sound/world/electro.wav" ); self->touch = hurt_touch; - if ( !self->damage ) { + if( !self->damage ) self->damage = 5; - } self->r.contents = CONTENTS_TRIGGER; - if ( self->spawnflags & 2 ) { + if( self->spawnflags & 2 ) self->use = hurt_use; - } // link in to the world if starting active - if ( ! (self->spawnflags & 1) ) { - trap_LinkEntity (self); - } + if( !( self->spawnflags & 1 ) ) + trap_LinkEntity( self ); } @@ -419,38 +431,44 @@ so, the basic time between firing is a random time between (wait - random) and (wait + random) */ -void func_timer_think( gentity_t *self ) { - G_UseTargets (self, self->activator); +void func_timer_think( gentity_t *self ) +{ + G_UseTargets( self, self->activator ); // set time before next firing - self->nextthink = level.time + 1000 * ( self->wait + crandom() * self->random ); + self->nextthink = level.time + 1000 * ( self->wait + crandom( ) * self->random ); } -void func_timer_use( gentity_t *self, gentity_t *other, gentity_t *activator ) { +void func_timer_use( gentity_t *self, gentity_t *other, gentity_t *activator ) +{ self->activator = activator; // if on, turn it off - if ( self->nextthink ) { + if( self->nextthink ) + { self->nextthink = 0; return; } // turn it on - func_timer_think (self); + func_timer_think( self ); } -void SP_func_timer( gentity_t *self ) { - G_SpawnFloat( "random", "1", &self->random); +void SP_func_timer( gentity_t *self ) +{ + G_SpawnFloat( "random", "1", &self->random ); G_SpawnFloat( "wait", "1", &self->wait ); self->use = func_timer_use; self->think = func_timer_think; - if ( self->random >= self->wait ) { + if( self->random >= self->wait ) + { self->random = self->wait - FRAMETIME; G_Printf( "func_timer at %s has random >= wait\n", vtos( self->s.origin ) ); } - if ( self->spawnflags & 1 ) { + if( self->spawnflags & 1 ) + { self->nextthink = level.time + FRAMETIME; self->activator = self; } diff --git a/src/game/g_utils.c b/src/game/g_utils.c index 14a1b9fa..708c3799 100644 --- a/src/game/g_utils.c +++ b/src/game/g_utils.c @@ -17,45 +17,55 @@ #include "g_local.h" -typedef struct { - char oldShader[MAX_QPATH]; - char newShader[MAX_QPATH]; +typedef struct +{ + char oldShader[ MAX_QPATH ]; + char newShader[ MAX_QPATH ]; float timeOffset; } shaderRemap_t; #define MAX_SHADER_REMAPS 128 int remapCount = 0; -shaderRemap_t remappedShaders[MAX_SHADER_REMAPS]; +shaderRemap_t remappedShaders[ MAX_SHADER_REMAPS ]; -void AddRemap(const char *oldShader, const char *newShader, float timeOffset) { +void AddRemap( const char *oldShader, const char *newShader, float timeOffset ) +{ int i; - for (i = 0; i < remapCount; i++) { - if (Q_stricmp(oldShader, remappedShaders[i].oldShader) == 0) { + for( i = 0; i < remapCount; i++ ) + { + if( Q_stricmp( oldShader, remappedShaders[ i ].oldShader ) == 0 ) + { // found it, just update this one - strcpy(remappedShaders[i].newShader,newShader); - remappedShaders[i].timeOffset = timeOffset; + strcpy( remappedShaders[ i ].newShader,newShader ); + remappedShaders[ i ].timeOffset = timeOffset; return; } } - if (remapCount < MAX_SHADER_REMAPS) { - strcpy(remappedShaders[remapCount].newShader,newShader); - strcpy(remappedShaders[remapCount].oldShader,oldShader); - remappedShaders[remapCount].timeOffset = timeOffset; + + if( remapCount < MAX_SHADER_REMAPS ) + { + strcpy( remappedShaders[ remapCount ].newShader,newShader ); + strcpy( remappedShaders[ remapCount ].oldShader,oldShader ); + remappedShaders[ remapCount ].timeOffset = timeOffset; remapCount++; } } -const char *BuildShaderStateConfig() { - static char buff[MAX_STRING_CHARS*4]; - char out[(MAX_QPATH * 2) + 5]; - int i; +const char *BuildShaderStateConfig( ) +{ + static char buff[ MAX_STRING_CHARS * 4 ]; + char out[ ( MAX_QPATH * 2 ) + 5 ]; + int i; + + memset( buff, 0, MAX_STRING_CHARS ); - memset(buff, 0, MAX_STRING_CHARS); - for (i = 0; i < remapCount; i++) { - Com_sprintf(out, (MAX_QPATH * 2) + 5, "%s=%s:%5.2f@", remappedShaders[i].oldShader, remappedShaders[i].newShader, remappedShaders[i].timeOffset); - Q_strcat( buff, sizeof( buff ), out); + for( i = 0; i < remapCount; i++ ) + { + Com_sprintf( out, ( MAX_QPATH * 2 ) + 5, "%s=%s:%5.2f@", remappedShaders[ i ].oldShader, + remappedShaders[ i ].newShader, remappedShaders[ i ].timeOffset ); + Q_strcat( buff, sizeof( buff ), out ); } return buff; } @@ -75,48 +85,49 @@ G_FindConfigstringIndex ================ */ -int G_FindConfigstringIndex( char *name, int start, int max, qboolean create ) { - int i; - char s[MAX_STRING_CHARS]; - - if ( !name || !name[0] ) { - return 0; - } - - for ( i=1 ; iinuse) - continue; - s = *(char **) ((byte *)from + fieldofs); - if (!s) - continue; - if (!Q_stricmp (s, match)) - return from; - } - - return NULL; + char *s; + + if( !from ) + from = g_entities; + else + from++; + + for( ; from < &g_entities[ level.num_entities ]; from++ ) + { + if( !from->inuse ) + continue; + s = *(char **)( (byte *)from + fieldofs ); + + if( !s ) + continue; + + if( !Q_stricmp( s, match ) ) + return from; + } + + return NULL; } @@ -187,37 +200,40 @@ G_PickTarget Selects a random entity from among the targets ============= */ -#define MAXCHOICES 32 +#define MAXCHOICES 32 -gentity_t *G_PickTarget (char *targetname) +gentity_t *G_PickTarget( char *targetname ) { - gentity_t *ent = NULL; - int num_choices = 0; - gentity_t *choice[MAXCHOICES]; - - if (!targetname) - { - G_Printf("G_PickTarget called with NULL targetname\n"); - return NULL; - } - - while(1) - { - ent = G_Find (ent, FOFS(targetname), targetname); - if (!ent) - break; - choice[num_choices++] = ent; - if (num_choices == MAXCHOICES) - break; - } - - if (!num_choices) - { - G_Printf("G_PickTarget: target %s not found\n", targetname); - return NULL; - } - - return choice[rand() % num_choices]; + gentity_t *ent = NULL; + int num_choices = 0; + gentity_t *choice[ MAXCHOICES ]; + + if( !targetname ) + { + G_Printf("G_PickTarget called with NULL targetname\n"); + return NULL; + } + + while( 1 ) + { + ent = G_Find( ent, FOFS( targetname ), targetname ); + + if( !ent ) + break; + + choice[ num_choices++ ] = ent; + + if( num_choices == MAXCHOICES ) + break; + } + + if( !num_choices ) + { + G_Printf( "G_PickTarget: target %s not found\n", targetname ); + return NULL; + } + + return choice[ rand( ) % num_choices ]; } @@ -232,37 +248,40 @@ match (string)self.target and call their .use function ============================== */ -void G_UseTargets( gentity_t *ent, gentity_t *activator ) { - gentity_t *t; - - if ( !ent ) { - return; - } - - if (ent->targetShaderName && ent->targetShaderNewName) { +void G_UseTargets( gentity_t *ent, gentity_t *activator ) +{ + gentity_t *t; + + if( !ent ) + return; + + if( ent->targetShaderName && ent->targetShaderNewName ) + { float f = level.time * 0.001; - AddRemap(ent->targetShaderName, ent->targetShaderNewName, f); - trap_SetConfigstring(CS_SHADERSTATE, BuildShaderStateConfig()); + AddRemap( ent->targetShaderName, ent->targetShaderNewName, f ); + trap_SetConfigstring( CS_SHADERSTATE, BuildShaderStateConfig( ) ); } - if ( !ent->target ) { - return; - } - - t = NULL; - while ( (t = G_Find (t, FOFS(targetname), ent->target)) != NULL ) { - if ( t == ent ) { - G_Printf ("WARNING: Entity used itself.\n"); - } else { - if ( t->use ) { - t->use (t, ent, activator); - } - } - if ( !ent->inuse ) { - G_Printf("entity was removed while using targets\n"); - return; - } - } + if( !ent->target ) + return; + + t = NULL; + while( ( t = G_Find( t, FOFS( targetname ), ent->target) ) != NULL ) + { + if( t == ent ) + G_Printf( "WARNING: Entity used itself.\n" ); + else + { + if( t->use ) + t->use( t, ent, activator ); + } + + if( !ent->inuse ) + { + G_Printf( "entity was removed while using targets\n" ); + return; + } + } } @@ -274,21 +293,22 @@ This is just a convenience function for making temporary vectors for function calls ============= */ -float *tv( float x, float y, float z ) { - static int index; - static vec3_t vecs[8]; - float *v; +float *tv( float x, float y, float z ) +{ + static int index; + static vec3_t vecs[ 8 ]; + float *v; - // use an array so that multiple tempvectors won't collide - // for a while - v = vecs[index]; - index = (index + 1)&7; + // use an array so that multiple tempvectors won't collide + // for a while + v = vecs[ index ]; + index = ( index + 1 ) & 7; - v[0] = x; - v[1] = y; - v[2] = z; + v[ 0 ] = x; + v[ 1 ] = y; + v[ 2 ] = z; - return v; + return v; } @@ -300,18 +320,19 @@ This is just a convenience function for printing vectors ============= */ -char *vtos( const vec3_t v ) { - static int index; - static char str[8][32]; - char *s; +char *vtos( const vec3_t v ) +{ + static int index; + static char str[ 8 ][ 32 ]; + char *s; - // use an array so that multiple vtos won't collide - s = str[index]; - index = (index + 1)&7; + // use an array so that multiple vtos won't collide + s = str[ index ]; + index = ( index + 1 ) & 7; - Com_sprintf (s, 32, "(%i %i %i)", (int)v[0], (int)v[1], (int)v[2]); + Com_sprintf( s, 32, "(%i %i %i)", (int)v[ 0 ], (int)v[ 1 ], (int)v[ 2 ] ); - return s; + return s; } @@ -325,50 +346,55 @@ Angles will be cleared, because it is being used to represent a direction instead of an orientation. =============== */ -void G_SetMovedir( vec3_t angles, vec3_t movedir ) { - static vec3_t VEC_UP = {0, -1, 0}; - static vec3_t MOVEDIR_UP = {0, 0, 1}; - static vec3_t VEC_DOWN = {0, -2, 0}; - static vec3_t MOVEDIR_DOWN = {0, 0, -1}; - - if ( VectorCompare (angles, VEC_UP) ) { - VectorCopy (MOVEDIR_UP, movedir); - } else if ( VectorCompare (angles, VEC_DOWN) ) { - VectorCopy (MOVEDIR_DOWN, movedir); - } else { - AngleVectors (angles, movedir, NULL, NULL); - } - VectorClear( angles ); +void G_SetMovedir( vec3_t angles, vec3_t movedir ) +{ + static vec3_t VEC_UP = { 0, -1, 0 }; + static vec3_t MOVEDIR_UP = { 0, 0, 1 }; + static vec3_t VEC_DOWN = { 0, -2, 0 }; + static vec3_t MOVEDIR_DOWN = { 0, 0, -1 }; + + if( VectorCompare( angles, VEC_UP ) ) + VectorCopy( MOVEDIR_UP, movedir ); + else if( VectorCompare( angles, VEC_DOWN ) ) + VectorCopy( MOVEDIR_DOWN, movedir ); + else + AngleVectors( angles, movedir, NULL, NULL ); + + VectorClear( angles ); } -float vectoyaw( const vec3_t vec ) { - float yaw; - - if (vec[YAW] == 0 && vec[PITCH] == 0) { - yaw = 0; - } else { - if (vec[PITCH]) { - yaw = ( atan2( vec[YAW], vec[PITCH]) * 180 / M_PI ); - } else if (vec[YAW] > 0) { - yaw = 90; - } else { - yaw = 270; - } - if (yaw < 0) { - yaw += 360; - } - } - - return yaw; +float vectoyaw( const vec3_t vec ) +{ + float yaw; + + if( vec[ YAW ] == 0 && vec[ PITCH ] == 0 ) + { + yaw = 0; + } + else + { + if( vec[ PITCH ] ) + yaw = ( atan2( vec[ YAW ], vec[ PITCH ] ) * 180 / M_PI ); + else if( vec[ YAW ] > 0 ) + yaw = 90; + else + yaw = 270; + + if( yaw < 0 ) + yaw += 360; + } + + return yaw; } -void G_InitGentity( gentity_t *e ) { - e->inuse = qtrue; - e->classname = "noclass"; - e->s.number = e - g_entities; - e->r.ownerNum = ENTITYNUM_NONE; +void G_InitGentity( gentity_t *e ) +{ + e->inuse = qtrue; + e->classname = "noclass"; + e->s.number = e - g_entities; + e->r.ownerNum = ENTITYNUM_NONE; } /* @@ -386,51 +412,56 @@ instead of being removed and recreated, which can cause interpolated angles and bad trails. ================= */ -gentity_t *G_Spawn( void ) { - int i, force; - gentity_t *e; - - e = NULL; // shut up warning - i = 0; // shut up warning - for ( force = 0 ; force < 2 ; force++ ) { - // if we go through all entities and can't find one to free, - // override the normal minimum times before use - e = &g_entities[MAX_CLIENTS]; - for ( i = MAX_CLIENTS ; iinuse ) { - continue; - } - - // the first couple seconds of server time can involve a lot of - // freeing and allocating, so relax the replacement policy - if ( !force && e->freetime > level.startTime + 2000 && level.time - e->freetime < 1000 ) { - continue; - } - - // reuse this slot - G_InitGentity( e ); - return e; - } - if ( i != MAX_GENTITIES ) { - break; - } - } - if ( i == ENTITYNUM_MAX_NORMAL ) { - for (i = 0; i < MAX_GENTITIES; i++) { - G_Printf("%4i: %s\n", i, g_entities[i].classname); +gentity_t *G_Spawn( void ) +{ + int i, force; + gentity_t *e; + + e = NULL; // shut up warning + i = 0; // shut up warning + + for( force = 0; force < 2; force++ ) + { + // if we go through all entities and can't find one to free, + // override the normal minimum times before use + e = &g_entities[ MAX_CLIENTS ]; + + for( i = MAX_CLIENTS; i < level.num_entities; i++, e++ ) + { + if( e->inuse ) + continue; + + // the first couple seconds of server time can involve a lot of + // freeing and allocating, so relax the replacement policy + if( !force && e->freetime > level.startTime + 2000 && level.time - e->freetime < 1000 ) + continue; + + // reuse this slot + G_InitGentity( e ); + return e; } - G_Error( "G_Spawn: no free entities" ); - } - - // open up a new slot - level.num_entities++; - - // let the server system know that there are more entities - trap_LocateGameData( level.gentities, level.num_entities, sizeof( gentity_t ), - &level.clients[0].ps, sizeof( level.clients[0] ) ); - - G_InitGentity( e ); - return e; + + if( i != MAX_GENTITIES ) + break; + } + + if( i == ENTITYNUM_MAX_NORMAL ) + { + for( i = 0; i < MAX_GENTITIES; i++ ) + G_Printf( "%4i: %s\n", i, g_entities[ i ].classname ); + + G_Error( "G_Spawn: no free entities" ); + } + + // open up a new slot + level.num_entities++; + + // let the server system know that there are more entities + trap_LocateGameData( level.gentities, level.num_entities, sizeof( gentity_t ), + &level.clients[ 0 ].ps, sizeof( level.clients[ 0 ] ) ); + + G_InitGentity( e ); + return e; } @@ -439,18 +470,22 @@ gentity_t *G_Spawn( void ) { G_EntitiesFree ================= */ -qboolean G_EntitiesFree( void ) { +qboolean G_EntitiesFree( void ) +{ int i; gentity_t *e; - e = &g_entities[MAX_CLIENTS]; - for ( i = MAX_CLIENTS; i < level.num_entities; i++, e++) { - if ( e->inuse ) { + e = &g_entities[ MAX_CLIENTS ]; + + for( i = MAX_CLIENTS; i < level.num_entities; i++, e++ ) + { + if( e->inuse ) continue; - } + // slot available return qtrue; } + return qfalse; } @@ -462,17 +497,17 @@ G_FreeEntity Marks the entity as free ================= */ -void G_FreeEntity( gentity_t *ed ) { - trap_UnlinkEntity (ed); // unlink from world +void G_FreeEntity( gentity_t *ent ) +{ + trap_UnlinkEntity( ent ); // unlink from world - if ( ed->neverFree ) { - return; - } + if( ent->neverFree ) + return; - memset (ed, 0, sizeof(*ed)); - ed->classname = "freed"; - ed->freetime = level.time; - ed->inuse = qfalse; + memset( ent, 0, sizeof( *ent ) ); + ent->classname = "freent"; + ent->freetime = level.time; + ent->inuse = qfalse; } /* @@ -484,25 +519,26 @@ The origin will be snapped to save net bandwidth, so care must be taken if the origin is right on a surface (snap towards start vector first) ================= */ -gentity_t *G_TempEntity( vec3_t origin, int event ) { - gentity_t *e; - vec3_t snapped; +gentity_t *G_TempEntity( vec3_t origin, int event ) +{ + gentity_t *e; + vec3_t snapped; - e = G_Spawn(); - e->s.eType = ET_EVENTS + event; + e = G_Spawn( ); + e->s.eType = ET_EVENTS + event; - e->classname = "tempEntity"; - e->eventTime = level.time; - e->freeAfterEvent = qtrue; + e->classname = "tempEntity"; + e->eventTime = level.time; + e->freeAfterEvent = qtrue; - VectorCopy( origin, snapped ); - SnapVector( snapped ); // save network bandwidth - G_SetOrigin( e, snapped ); + VectorCopy( origin, snapped ); + SnapVector( snapped ); // save network bandwidth + G_SetOrigin( e, snapped ); - // find cluster for PVS - trap_LinkEntity( e ); + // find cluster for PVS + trap_LinkEntity( e ); - return e; + return e; } @@ -523,29 +559,32 @@ Kills all entities that would touch the proposed new positioning of ent. Ent should be unlinked before calling this! ================= */ -void G_KillBox (gentity_t *ent) { - int i, num; - int touch[MAX_GENTITIES]; - gentity_t *hit; - vec3_t mins, maxs; +void G_KillBox( gentity_t *ent ) +{ + int i, num; + int touch[ MAX_GENTITIES ]; + gentity_t *hit; + vec3_t mins, maxs; - VectorAdd( ent->client->ps.origin, ent->r.mins, mins ); - VectorAdd( ent->client->ps.origin, ent->r.maxs, maxs ); - num = trap_EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); + VectorAdd( ent->client->ps.origin, ent->r.mins, mins ); + VectorAdd( ent->client->ps.origin, ent->r.maxs, maxs ); + num = trap_EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); - for (i=0 ; iclient ) - continue; + for( i = 0; i < num; i++ ) + { + hit = &g_entities[ touch[ i ] ]; + + if( !hit->client ) + continue; //TA: impossible to telefrag self if( ent == hit ) continue; - // nail it - G_Damage ( hit, ent, ent, NULL, NULL, - 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG); - } + // nail it + G_Damage( hit, ent, ent, NULL, NULL, + 100000, DAMAGE_NO_PROTECTION, MOD_TELEFRAG ); + } } @@ -560,11 +599,12 @@ client side: jumppads and item pickups Adds an event+parm and twiddles the event counter =============== */ -void G_AddPredictableEvent( gentity_t *ent, int event, int eventParm ) { - if ( !ent->client ) { - return; - } - BG_AddPredictableEventToPlayerstate( event, eventParm, &ent->client->ps ); +void G_AddPredictableEvent( gentity_t *ent, int event, int eventParm ) +{ + if( !ent->client ) + return; + + BG_AddPredictableEventToPlayerstate( event, eventParm, &ent->client->ps ); } @@ -575,28 +615,34 @@ G_AddEvent Adds an event+parm and twiddles the event counter =============== */ -void G_AddEvent( gentity_t *ent, int event, int eventParm ) { - int bits; - - if ( !event ) { - G_Printf( "G_AddEvent: zero event added for entity %i\n", ent->s.number ); - return; - } - - // clients need to add the event in playerState_t instead of entityState_t - if ( ent->client ) { - bits = ent->client->ps.externalEvent & EV_EVENT_BITS; - bits = ( bits + EV_EVENT_BIT1 ) & EV_EVENT_BITS; - ent->client->ps.externalEvent = event | bits; - ent->client->ps.externalEventParm = eventParm; - ent->client->ps.externalEventTime = level.time; - } else { - bits = ent->s.event & EV_EVENT_BITS; - bits = ( bits + EV_EVENT_BIT1 ) & EV_EVENT_BITS; - ent->s.event = event | bits; - ent->s.eventParm = eventParm; - } - ent->eventTime = level.time; +void G_AddEvent( gentity_t *ent, int event, int eventParm ) +{ + int bits; + + if( !event ) + { + G_Printf( "G_AddEvent: zero event added for entity %i\n", ent->s.number ); + return; + } + + // clients need to add the event in playerState_t instead of entityState_t + if( ent->client ) + { + bits = ent->client->ps.externalEvent & EV_EVENT_BITS; + bits = ( bits + EV_EVENT_BIT1 ) & EV_EVENT_BITS; + ent->client->ps.externalEvent = event | bits; + ent->client->ps.externalEventParm = eventParm; + ent->client->ps.externalEventTime = level.time; + } + else + { + bits = ent->s.event & EV_EVENT_BITS; + bits = ( bits + EV_EVENT_BIT1 ) & EV_EVENT_BITS; + ent->s.event = event | bits; + ent->s.eventParm = eventParm; + } + + ent->eventTime = level.time; } @@ -605,11 +651,12 @@ void G_AddEvent( gentity_t *ent, int event, int eventParm ) { G_Sound ============= */ -void G_Sound( gentity_t *ent, int channel, int soundIndex ) { - gentity_t *te; +void G_Sound( gentity_t *ent, int channel, int soundIndex ) +{ + gentity_t *te; - te = G_TempEntity( ent->r.currentOrigin, EV_GENERAL_SOUND ); - te->s.eventParm = soundIndex; + te = G_TempEntity( ent->r.currentOrigin, EV_GENERAL_SOUND ); + te->s.eventParm = soundIndex; } @@ -625,14 +672,14 @@ Sets the pos trajectory for a fixed position */ void G_SetOrigin( gentity_t *ent, vec3_t origin ) { - VectorCopy( origin, ent->s.pos.trBase ); - ent->s.pos.trType = TR_STATIONARY; - ent->s.pos.trTime = 0; - ent->s.pos.trDuration = 0; - VectorClear( ent->s.pos.trDelta ); - - VectorCopy( origin, ent->r.currentOrigin ); - VectorCopy( origin, ent->s.origin ); //TA: if shit breaks - blame this line + VectorCopy( origin, ent->s.pos.trBase ); + ent->s.pos.trType = TR_STATIONARY; + ent->s.pos.trTime = 0; + ent->s.pos.trDuration = 0; + VectorClear( ent->s.pos.trDelta ); + + VectorCopy( origin, ent->r.currentOrigin ); + VectorCopy( origin, ent->s.origin ); //TA: if shit breaks - blame this line } //TA: from quakestyle.telefragged.com @@ -688,31 +735,35 @@ DebugLine with r_debugSurface set to 2 ================ */ -int DebugLine(vec3_t start, vec3_t end, int color) { - vec3_t points[4], dir, cross, up = {0, 0, 1}; - float dot; +int DebugLine( vec3_t start, vec3_t end, int color ) +{ + vec3_t points[ 4 ], dir, cross, up = { 0, 0, 1 }; + float dot; - VectorCopy(start, points[0]); - VectorCopy(start, points[1]); + VectorCopy( start, points[ 0 ] ); + VectorCopy( start, points[ 1 ] ); //points[1][2] -= 2; - VectorCopy(end, points[2]); + VectorCopy( end, points[ 2 ] ); //points[2][2] -= 2; - VectorCopy(end, points[3]); + VectorCopy( end, points[ 3 ] ); - VectorSubtract(end, start, dir); - VectorNormalize(dir); - dot = DotProduct(dir, up); - if (dot > 0.99 || dot < -0.99) VectorSet(cross, 1, 0, 0); - else CrossProduct(dir, up, cross); + VectorSubtract( end, start, dir ); + VectorNormalize( dir ); + dot = DotProduct( dir, up ); + + if( dot > 0.99 || dot < -0.99 ) + VectorSet( cross, 1, 0, 0 ); + else + CrossProduct( dir, up, cross ); - VectorNormalize(cross); + VectorNormalize( cross ); - VectorMA(points[0], 2, cross, points[0]); - VectorMA(points[1], -2, cross, points[1]); - VectorMA(points[2], -2, cross, points[2]); - VectorMA(points[3], 2, cross, points[3]); + VectorMA(points[ 0 ], 2, cross, points[ 0 ] ); + VectorMA(points[ 1 ], -2, cross, points[ 1 ] ); + VectorMA(points[ 2 ], -2, cross, points[ 2 ] ); + VectorMA(points[ 3 ], 2, cross, points[ 3 ] ); - return trap_DebugPolygonCreate(color, 4, points); + return trap_DebugPolygonCreate( color, 4, points ); } diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index fc32b16c..24cce9dd 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -219,23 +219,6 @@ void lockBlobLauncherFire( gentity_t *ent ) /* ====================================================================== -PLASMAGUN - -====================================================================== -*/ - -void plasmaFire( gentity_t *ent ) -{ - gentity_t *m; - - m = fire_plasma (ent, muzzle, forward); - -// VectorAdd( m->s.pos.trDelta, ent->client->ps.velocity, m->s.pos.trDelta ); // "real" physics -} - -/* -====================================================================== - PULSE RIFLE ====================================================================== @@ -1069,9 +1052,6 @@ void FireWeapon( gentity_t *ent ) case WP_FLAMER: flamerFire( ent ); break; - case WP_PLASMAGUN: - plasmaFire( ent ); - break; case WP_PULSE_RIFLE: pulseRifleFire( ent ); break; diff --git a/src/game/q_math.c b/src/game/q_math.c index a23a3456..f4b737ec 100644 --- a/src/game/q_math.c +++ b/src/game/q_math.c @@ -156,8 +156,9 @@ int VectorCompare( const vec3_t v1, const vec3_t v2 ) { return 1; } -vec_t VectorLength( const vec3_t v ) { - return (vec_t)sqrt (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); +vec_t VectorLength( const vec3_t v ) +{ + return (vec_t)sqrt( v[ 0 ] * v[ 0 ] + v[ 1 ] * v[ 1 ] + v[ 2 ] * v[ 2 ] ); } vec_t VectorLengthSquared( const vec3_t v ) { @@ -228,20 +229,22 @@ signed short ClampShort( int i ) { // this isn't a real cheap function to call! -int DirToByte( vec3_t dir ) { +int DirToByte( vec3_t dir ) +{ int i, best; float d, bestd; - if ( !dir ) { + if( !dir ) return 0; - } bestd = 0; best = 0; - for (i=0 ; i bestd) + d = DotProduct( dir, bytedirs[ i ] ); + + if( d > bestd ) { bestd = d; best = i; @@ -251,12 +254,15 @@ int DirToByte( vec3_t dir ) { return best; } -void ByteToDir( int b, vec3_t dir ) { - if ( b < 0 || b >= NUMVERTEXNORMALS ) { +void ByteToDir( int b, vec3_t dir ) +{ + if( b < 0 || b >= NUMVERTEXNORMALS ) + { VectorCopy( vec3_origin, dir ); return; } - VectorCopy (bytedirs[b], dir); + + VectorCopy( bytedirs[ b ], dir); } @@ -389,67 +395,64 @@ void RotatePointAroundVector(vec3_t dst, const vec3_t dir, const vec3_t point, f RotateAroundDirection =============== */ -void RotateAroundDirection(vec3_t axis[3], vec_t angle) +void RotateAroundDirection( vec3_t axis[ 3 ], vec_t angle ) { vec_t scale; - angle = DEG2RAD(angle); + angle = DEG2RAD( angle ); // create an arbitrary axis[1] - PerpendicularVector(axis[1], axis[0]); + PerpendicularVector( axis[ 1 ], axis[ 0 ] ); // cross to get axis[2] - CrossProduct(axis[0], axis[1], axis[2]); + CrossProduct( axis[ 0 ], axis[ 1 ], axis[ 2 ] ); // rotate - scale = cos(angle); - VectorScale(axis[1], scale, axis[1]); + scale = cos( angle ); + VectorScale( axis[ 1 ], scale, axis[ 1 ] ); - scale = sin(angle); - VectorMA(axis[1], scale, axis[2], axis[1]); + scale = sin( angle ); + VectorMA( axis[ 1 ], scale, axis[ 2 ], axis[ 1 ] ); // recalculate axis[2] - CrossProduct(axis[0], axis[1], axis[2]); + CrossProduct( axis[ 0 ], axis[ 1 ], axis[ 2 ] ); } -void vectoangles( const vec3_t value1, vec3_t angles ) { +void vectoangles( const vec3_t value1, vec3_t angles ) +{ float forward; float yaw, pitch; - if ( value1[1] == 0 && value1[0] == 0 ) { + if( value1[ 1 ] == 0 && value1[ 0 ] == 0 ) + { yaw = 0; - if ( value1[2] > 0 ) { + if( value1[ 2 ] > 0 ) pitch = 90; - } - else { + else pitch = 270; - } } - else { - if ( value1[0] ) { - yaw = ( atan2 ( value1[1], value1[0] ) * 180 / M_PI ); - } - else if ( value1[1] > 0 ) { + else + { + if( value1[ 0 ] ) + yaw = ( atan2 ( value1[ 1 ], value1[ 0 ] ) * 180 / M_PI ); + else if( value1[ 1 ] > 0 ) yaw = 90; - } - else { + else yaw = 270; - } - if ( yaw < 0 ) { + + if( yaw < 0 ) yaw += 360; - } - forward = sqrt ( value1[0]*value1[0] + value1[1]*value1[1] ); - pitch = ( atan2(value1[2], forward) * 180 / M_PI ); - if ( pitch < 0 ) { + forward = sqrt( value1[ 0 ] * value1[ 0 ] + value1[ 1 ] * value1[ 1 ] ); + pitch = ( atan2( value1[ 2 ], forward ) * 180 / M_PI ); + if( pitch < 0 ) pitch += 360; - } } - angles[PITCH] = -pitch; - angles[YAW] = yaw; - angles[ROLL] = 0; + angles[ PITCH ] = -pitch; + angles[ YAW ] = yaw; + angles[ ROLL ] = 0; } @@ -517,16 +520,17 @@ void AnglesToAxis( const vec3_t angles, vec3_t axis[3] ) { VectorSubtract( vec3_origin, right, axis[1] ); } -void AxisClear( vec3_t axis[3] ) { - axis[0][0] = 1; - axis[0][1] = 0; - axis[0][2] = 0; - axis[1][0] = 0; - axis[1][1] = 1; - axis[1][2] = 0; - axis[2][0] = 0; - axis[2][1] = 0; - axis[2][2] = 1; +void AxisClear( vec3_t axis[ 3 ] ) +{ + axis[ 0 ][ 0 ] = 1; + axis[ 0 ][ 1 ] = 0; + axis[ 0 ][ 2 ] = 0; + axis[ 1 ][ 0 ] = 0; + axis[ 1 ][ 1 ] = 1; + axis[ 1 ][ 2 ] = 0; + axis[ 2 ][ 0 ] = 0; + axis[ 2 ][ 1 ] = 0; + axis[ 2 ][ 2 ] = 1; } void AxisCopy( vec3_t in[3], vec3_t out[3] ) { @@ -677,8 +681,9 @@ void AnglesSubtract( vec3_t v1, vec3_t v2, vec3_t v3 ) { } -float AngleMod(float a) { - a = (360.0/65536) * ((int)(a*(65536/360.0)) & 65535); +float AngleMod( float a ) +{ + a = ( 360.0 / 65536 ) * ( (int)( a * ( 65536 / 360.0 ) ) & 65535 ); return a; } @@ -1252,60 +1257,64 @@ int PlaneTypeForNormal (vec3_t normal) { MatrixMultiply ================ */ -void MatrixMultiply(float in1[3][3], float in2[3][3], float out[3][3]) { - out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + - in1[0][2] * in2[2][0]; - out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + - in1[0][2] * in2[2][1]; - out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + - in1[0][2] * in2[2][2]; - out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + - in1[1][2] * in2[2][0]; - out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + - in1[1][2] * in2[2][1]; - out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + - in1[1][2] * in2[2][2]; - out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + - in1[2][2] * in2[2][0]; - out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + - in1[2][2] * in2[2][1]; - out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + - in1[2][2] * in2[2][2]; +void MatrixMultiply( float in1[ 3 ][ 3 ], float in2[ 3 ][ 3 ], float out[ 3 ][ 3 ] ) +{ + out[ 0 ][ 0 ] = in1[ 0 ][ 0 ] * in2[ 0 ][ 0 ] + in1[ 0 ][ 1 ] * in2[ 1 ][ 0 ] + + in1[ 0 ][ 2 ] * in2[ 2 ][ 0 ]; + out[ 0 ][ 1 ] = in1[ 0 ][ 0 ] * in2[ 0 ][ 1 ] + in1[ 0 ][ 1 ] * in2[ 1 ][ 1 ] + + in1[ 0 ][ 2 ] * in2[ 2 ][ 1 ]; + out[ 0 ][ 2 ] = in1[ 0 ][ 0 ] * in2[ 0 ][ 2 ] + in1[ 0 ][ 1 ] * in2[ 1 ][ 2 ] + + in1[ 0 ][ 2 ] * in2[ 2 ][ 2 ]; + out[ 1 ][ 0 ] = in1[ 1 ][ 0 ] * in2[ 0 ][ 0 ] + in1[ 1 ][ 1 ] * in2[ 1 ][ 0 ] + + in1[ 1 ][ 2 ] * in2[ 2 ][ 0 ]; + out[ 1 ][ 1 ] = in1[ 1 ][ 0 ] * in2[ 0 ][ 1 ] + in1[ 1 ][ 1 ] * in2[ 1 ][ 1 ] + + in1[ 1 ][ 2 ] * in2[ 2 ][ 1 ]; + out[ 1 ][ 2 ] = in1[ 1 ][ 0 ] * in2[ 0 ][ 2 ] + in1[ 1 ][ 1 ] * in2[ 1 ][ 2 ] + + in1[ 1 ][ 2 ] * in2[ 2 ][ 2 ]; + out[ 2 ][ 0 ] = in1[ 2 ][ 0 ] * in2[ 0 ][ 0 ] + in1[ 2 ][ 1 ] * in2[ 1 ][ 0 ] + + in1[ 2 ][ 2 ] * in2[ 2 ][ 0 ]; + out[ 2 ][ 1 ] = in1[ 2 ][ 0 ] * in2[ 0 ][ 1 ] + in1[ 2 ][ 1 ] * in2[ 1 ][ 1 ] + + in1[ 2 ][ 2 ] * in2[ 2 ][ 1 ]; + out[ 2 ][ 2 ] = in1[ 2 ][ 0 ] * in2[ 0 ][ 2 ] + in1[ 2 ][ 1 ] * in2[ 1 ][ 2 ] + + in1[ 2 ][ 2 ] * in2[ 2 ][ 2 ]; } -void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up) { - float angle; - static float sr, sp, sy, cr, cp, cy; +void AngleVectors( const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up) +{ + float angle; + static float sr, sp, sy, cr, cp, cy; // static to help MS compiler fp bugs - angle = angles[YAW] * (M_PI*2 / 360); - sy = sin(angle); - cy = cos(angle); - angle = angles[PITCH] * (M_PI*2 / 360); - sp = sin(angle); - cp = cos(angle); - angle = angles[ROLL] * (M_PI*2 / 360); - sr = sin(angle); - cr = cos(angle); - - if (forward) + angle = angles[ YAW ] * ( M_PI * 2 / 360 ); + sy = sin( angle ); + cy = cos( angle ); + angle = angles[ PITCH ] * ( M_PI * 2 / 360 ); + sp = sin( angle ); + cp = cos( angle ); + angle = angles[ ROLL ] * ( M_PI * 2 / 360 ); + sr = sin( angle ); + cr = cos( angle ); + + if( forward ) { - forward[0] = cp*cy; - forward[1] = cp*sy; - forward[2] = -sp; + forward[ 0 ] = cp * cy; + forward[ 1 ] = cp * sy; + forward[ 2 ] = -sp; } - if (right) + + if( right ) { - right[0] = (-1*sr*sp*cy+-1*cr*-sy); - right[1] = (-1*sr*sp*sy+-1*cr*cy); - right[2] = -1*sr*cp; + right[ 0 ] = ( -1 * sr * sp * cy + -1 * cr * -sy ); + right[ 1 ] = ( -1 * sr * sp * sy + -1 * cr * cy ); + right[ 2 ] = -1 * sr * cp; } - if (up) + + if( up ) { - up[0] = (cr*sp*cy+-sr*-sy); - up[1] = (cr*sp*sy+-sr*cy); - up[2] = cr*cp; + up[ 0 ] = ( cr * sp * cy + -sr * -sy ); + up[ 1 ] = ( cr * sp * sy + -sr * cy ); + up[ 2 ] = cr * cp; } } diff --git a/src/game/q_shared.c b/src/game/q_shared.c index 4bf77a8d..bd133ab9 100644 --- a/src/game/q_shared.c +++ b/src/game/q_shared.c @@ -307,72 +307,98 @@ static char *SkipWhitespace( char *data, qboolean *hasNewLines ) { } -int COM_Compress( char *data_p ) { - char *in, *out; - int c; - qboolean newline = qfalse, whitespace = qfalse; - - in = out = data_p; - if (in) { - while ((c = *in) != 0) { - // skip double slash comments - if ( c == '/' && in[1] == '/' ) { - while (*in && *in != '\n') { - in++; - } - // skip /* */ comments - } else if ( c == '/' && in[1] == '*' ) { - while ( *in && ( *in != '*' || in[1] != '/' ) ) - in++; - if ( *in ) - in += 2; - // record when we hit a newline - } else if ( c == '\n' || c == '\r' ) { - newline = qtrue; - in++; - // record when we hit whitespace - } else if ( c == ' ' || c == '\t') { - whitespace = qtrue; - in++; - // an actual token - } else { - // if we have a pending newline, emit it (and it counts as whitespace) - if (newline) { - *out++ = '\n'; - newline = qfalse; - whitespace = qfalse; - } if (whitespace) { - *out++ = ' '; - whitespace = qfalse; - } - - // copy quoted strings unmolested - if (c == '"') { - *out++ = c; - in++; - while (1) { - c = *in; - if (c && c != '"') { - *out++ = c; - in++; - } else { - break; - } - } - if (c == '"') { - *out++ = c; - in++; - } - } else { - *out = c; - out++; - in++; - } - } - } - } - *out = 0; - return out - data_p; +int COM_Compress( char *data_p ) +{ + char *in, *out; + int c; + qboolean newline = qfalse, whitespace = qfalse; + + in = out = data_p; + if( in ) + { + while( ( c = *in ) != 0 ) + { + // skip double slash comments + if( c == '/' && in[ 1 ] == '/' ) + { + while( *in && *in != '\n' ) + in++; + // skip /* */ comments + } + else if( c == '/' && in[ 1 ] == '*' ) + { + while( *in && ( *in != '*' || in[ 1 ] != '/' ) ) + in++; + + if( *in ) + in += 2; + // record when we hit a newline + } + else if( c == '\n' || c == '\r' ) + { + newline = qtrue; + in++; + // record when we hit whitespace + } + else if( c == ' ' || c == '\t') + { + whitespace = qtrue; + in++; + // an actual token + } + else + { + // if we have a pending newline, emit it (and it counts as whitespace) + if( newline ) + { + *out++ = '\n'; + newline = qfalse; + whitespace = qfalse; + } + + if( whitespace ) + { + *out++ = ' '; + whitespace = qfalse; + } + + // copy quoted strings unmolested + if( c == '"' ) + { + *out++ = c; + in++; + + while( 1 ) + { + c = *in; + + if( c && c != '"' ) + { + *out++ = c; + in++; + } + else + break; + } + + if( c == '"' ) + { + *out++ = c; + in++; + } + } + else + { + *out = c; + out++; + in++; + } + } + } + } + + *out = 0; + return out - data_p; } char *COM_ParseExt( char **data_p, qboolean allowLineBreaks ) @@ -703,55 +729,57 @@ Q_strncpyz Safe strncpy that ensures a trailing zero ============= */ -void Q_strncpyz( char *dest, const char *src, int destsize ) { +void Q_strncpyz( char *dest, const char *src, int destsize ) +{ // bk001129 - also NULL dest - if ( !dest ) { + if( !dest ) Com_Error( ERR_FATAL, "Q_strncpyz: NULL dest" ); - } - if ( !src ) { + + if( !src ) Com_Error( ERR_FATAL, "Q_strncpyz: NULL src" ); - } - if ( destsize < 1 ) { - Com_Error(ERR_FATAL,"Q_strncpyz: destsize < 1" ); - } - strncpy( dest, src, destsize-1 ); - dest[destsize-1] = 0; + if( destsize < 1 ) + Com_Error( ERR_FATAL, "Q_strncpyz: destsize < 1" ); + + strncpy( dest, src, destsize - 1 ); + dest[ destsize - 1 ] = 0; } -int Q_stricmpn (const char *s1, const char *s2, int n) { +int Q_stricmpn( const char *s1, const char *s2, int n ) +{ int c1, c2; // bk001129 - moved in 1.17 fix not in id codebase - if ( s1 == NULL ) { - if ( s2 == NULL ) + if( s1 == NULL ) + { + if( s2 == NULL ) return 0; else return -1; } - else if ( s2==NULL ) + else if( s2==NULL ) return 1; - do { + do + { c1 = *s1++; c2 = *s2++; - if (!n--) { + if( !n-- ) return 0; // strings are equal until end point - } - if (c1 != c2) { - if (c1 >= 'a' && c1 <= 'z') { - c1 -= ('a' - 'A'); - } - if (c2 >= 'a' && c2 <= 'z') { - c2 -= ('a' - 'A'); - } - if (c1 != c2) { + if( c1 != c2 ) + { + if( c1 >= 'a' && c1 <= 'z' ) + c1 -= ( 'a' - 'A' ); + + if( c2 >= 'a' && c2 <= 'z' ) + c2 -= ( 'a' - 'A' ); + + if( c1 != c2 ) return c1 < c2 ? -1 : 1; - } } - } while (c1); + } while( c1 ); return 0; // strings are equal } @@ -775,8 +803,9 @@ int Q_strncmp (const char *s1, const char *s2, int n) { return 0; // strings are equal } -int Q_stricmp (const char *s1, const char *s2) { - return (s1 && s2) ? Q_stricmpn (s1, s2, 99999) : -1; +int Q_stricmp( const char *s1, const char *s2 ) +{ + return ( s1 && s2 ) ? Q_stricmpn( s1, s2, 99999 ) : -1; } @@ -804,13 +833,14 @@ char *Q_strupr( char *s1 ) { // never goes past bounds or leaves without a terminating 0 -void Q_strcat( char *dest, int size, const char *src ) { +void Q_strcat( char *dest, int size, const char *src ) +{ int l1; l1 = strlen( dest ); - if ( l1 >= size ) { + if( l1 >= size ) Com_Error( ERR_FATAL, "Q_strcat: already overflowed" ); - } + Q_strncpyz( dest + l1, src, size - l1 ); } @@ -860,26 +890,28 @@ char *Q_CleanStr( char *string ) { } -void QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) { - int len; - va_list argptr; - char bigbuffer[32000]; // big, but small enough to fit in PPC stack +void QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) +{ + int len; + va_list argptr; + char bigbuffer[ 32000 ]; // big, but small enough to fit in PPC stack - va_start (argptr,fmt); - len = vsprintf (bigbuffer,fmt,argptr); - va_end (argptr); - if ( len >= sizeof( bigbuffer ) ) { + va_start( argptr, fmt ); + len = vsprintf( bigbuffer, fmt, argptr ); + va_end( argptr ); + + if( len >= sizeof( bigbuffer ) ) Com_Error( ERR_FATAL, "Com_sprintf: overflowed bigbuffer" ); - } - if (len >= size) { - Com_Printf ("Com_sprintf: overflow of %i in %i\n", len, size); - } + + if( len >= size ) + Com_Printf( "Com_sprintf: overflow of %i in %i\n", len, size ); + #ifdef _DEBUG __asm { int 3; } #endif - Q_strncpyz (dest, bigbuffer, size ); + Q_strncpyz( dest, bigbuffer, size ); } @@ -926,49 +958,52 @@ key and returns the associated value, or an empty string. FIXME: overflow check? =============== */ -char *Info_ValueForKey( const char *s, const char *key ) { - char pkey[BIG_INFO_KEY]; - static char value[2][BIG_INFO_VALUE]; // use two buffers so compares +char *Info_ValueForKey( const char *s, const char *key ) +{ + char pkey[ BIG_INFO_KEY ]; + static char value[ 2 ][ BIG_INFO_VALUE ]; // use two buffers so compares // work without stomping on each other - static int valueindex = 0; - char *o; + static int valueindex = 0; + char *o; - if ( !s || !key ) { + if( !s || !key ) return ""; - } - if ( strlen( s ) >= BIG_INFO_STRING ) { + if( strlen( s ) >= BIG_INFO_STRING ) Com_Error( ERR_DROP, "Info_ValueForKey: oversize infostring" ); - } valueindex ^= 1; - if (*s == '\\') + + if( *s == '\\' ) s++; - while (1) + + while( 1 ) { o = pkey; - while (*s != '\\') + while( *s != '\\' ) { - if (!*s) + if( !*s ) return ""; + *o++ = *s++; } + *o = 0; s++; - o = value[valueindex]; + o = value[ valueindex ]; - while (*s != '\\' && *s) - { + while( *s != '\\' && *s ) *o++ = *s++; - } + *o = 0; - if (!Q_stricmp (key, pkey) ) - return value[valueindex]; + if( !Q_stricmp( key, pkey ) ) + return value[ valueindex ]; - if (!*s) + if( !*s ) break; + s++; } @@ -1137,13 +1172,14 @@ Some characters are illegal in info strings because they can mess up the server's parsing ================== */ -qboolean Info_Validate( const char *s ) { - if ( strchr( s, '\"' ) ) { +qboolean Info_Validate( const char *s ) +{ + if( strchr( s, '\"' ) ) return qfalse; - } - if ( strchr( s, ';' ) ) { + + if( strchr( s, ';' ) ) return qfalse; - } + return qtrue; } -- cgit