diff options
-rw-r--r-- | Makefile | 4 | ||||
-rwxr-xr-x | configure | 125 | ||||
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | debian/control | 24 | ||||
-rw-r--r-- | debian/q2pro-client.install | 2 | ||||
-rw-r--r-- | debian/q2pro-server.install | 1 | ||||
-rwxr-xr-x | debian/rules | 4 | ||||
-rw-r--r-- | source/common.c | 2 | ||||
-rw-r--r-- | source/sv_ac.c | 2 | ||||
-rw-r--r-- | source/sv_ccmds.c | 36 | ||||
-rw-r--r-- | source/sv_init.c | 3 | ||||
-rw-r--r-- | source/sv_local.h | 1 | ||||
-rw-r--r-- | source/sv_main.c | 168 | ||||
-rw-r--r-- | source/sys_unix.c | 15 | ||||
-rw-r--r-- | wiki/contact.mdwn | 2 |
15 files changed, 226 insertions, 169 deletions
@@ -21,6 +21,8 @@ distclean: clean rm -f config.mk config.h rm -f tags +ifndef SINGLEUSER + install: for t in $(EXECUTABLES) ; do \ install -m 755 -D $$t $(DESTDIR)$(BINDIR)/$$t ; \ @@ -30,6 +32,8 @@ install: done install -m 644 -D $(SRCDIR)/q2pro.6 $(DESTDIR)$(MANDIR)/q2pro.6 +endif # SINGLEUSER + strip: for t in $(BINARIES) ; do \ $(STRIP) $$t ; \ @@ -11,6 +11,11 @@ if [ "$sources" = "." ]; then fi outdir=`pwd` prefix="/usr/local" +datadir="share/games/quake2" +libdir="lib/games/quake2" +refdir="lib/games/q2pro" +bindir="games" +mandir="share/man/man6" cross_prefix="" cc="gcc" make="make" @@ -42,9 +47,10 @@ libraries="" hardlink="no" asm="no" anticheat="no" +singleuser="no" gldriver="libGL.so" indriver="" -homedir=".q2pro" +homedir="~/.q2pro" defcfg="/etc/default/q2pro" asmflags="" logfile="console.log" @@ -55,7 +61,7 @@ histfile=".conhistory" democache=".democache" screenshots="screenshots" scoreshots="scoreshots" -revision="169" +revision="170" tmpc="/tmp/q2pro-${RANDOM}.c" tmpo="/tmp/q2pro-${RANDOM}.o" @@ -154,6 +160,20 @@ for opt do ;; --enable-anticheat) anticheat="yes" ;; + --single-user) singleuser="yes" + ;; + --datadir=*) datadir=`echo $opt | cut -d '=' -f 2` + ;; + --libdir=*) libdir=`echo $opt | cut -d '=' -f 2` + ;; + --refdir=*) refdir=`echo $opt | cut -d '=' -f 2` + ;; + --bindir=*) bindir=`echo $opt | cut -d '=' -f 2` + ;; + --mandir=*) mandir=`echo $opt | cut -d '=' -f 2` + ;; + --homedir=*) homedir=`echo $opt | cut -d '=' -f 2` + ;; *) echo "Unknown option: $opt (try --help)" && exit 1 ;; esac @@ -163,32 +183,49 @@ if [ "$help" = "yes" ]; then echo "Usage: $0 [options]" echo "" echo "Options:" -echo " --help print this message" -echo " --prefix=PREFIX install in PREFIX [$prefix]" -echo " --cross-prefix=PREFIX add PREFIX to compile tools [$cross_prefix]" -echo " --cc=CC use C compiler [$cc]" -echo " --make=MAKE use MAKE processor [$make]" -echo " --windres=WINDRES use RC compiler [$windres]" -echo " --hardlink link client with ref_gl and mod_ui" -echo " --disable-client do not build client" -echo " --enable-server build dedicated server" -echo " --enable-openffa build OpenFFA deathmatch mod" -echo " --enable-mingw enable Windows build" -echo " --enable-dsound enable DirectSound driver" -echo " --enable-dinput enable DirectInput driver" -echo " --disable-wave disable WAVE sound driver" -echo " --disable-oss disable OSS driver" -echo " --disable-evdev disable Evdev driver" -echo " --disable-zlib disable linking with zlib" -echo " --enable-png enable linking with PNG library" -echo " --enable-jpeg enable linking with JPEG library" -echo " --disable-asm disable i386 assembly optimizations" -echo " --enable-anticheat enable r1ch.net anticheat server interface" +echo " --help print this message" +echo " --cross-prefix=PREFIX add PREFIX to compile tools [$cross_prefix]" +echo " --cc=CC use C compiler [$cc]" +echo " --make=MAKE use MAKE processor [$make]" +echo " --windres=WINDRES use RC compiler [$windres]" +echo " --hardlink link client with ref_gl and mod_ui" +echo " --disable-client do not build client" +echo " --enable-server build dedicated server" +echo " --enable-openffa build OpenFFA deathmatch mod" +echo " --enable-mingw enable Windows build" +echo " --enable-dsound enable DirectSound driver" +echo " --enable-dinput enable DirectInput driver" +echo " --disable-wave disable WAVE sound driver" +echo " --disable-oss disable OSS driver" +echo " --disable-evdev disable Evdev driver" +echo " --disable-zlib disable linking with zlib" +echo " --enable-png enable linking with PNG library" +echo " --enable-jpeg enable linking with JPEG library" +echo " --disable-asm disable i386 assembly optimizations" +echo " --enable-anticheat enable r1ch.net anticheat server interface" +echo " --single-user assume to be installed in home dir" +echo " --prefix=PREFIX install in PREFIX [$prefix]" +echo " --datadir=DIR game data tree [$datadir]" +echo " --libdir=DIR game libraries tree [$libdir]" +echo " --refdir=DIR refresh libraries directory [$refdir]" +echo " --bindir=DIR executables directory [$bindir]" +echo " --mandir=DIR manpages directory [$mandir]" +echo " --homedir=DIR home directory [$homedir]" echo "" echo "Object files are built in the directory from which configure is run." exit 1 fi +if [ "$singleuser" = "yes" ]; then + prefix="" + datadir="." + libdir="." + refdir="." + bindir="" + mandir="" + homedir="" +fi + if [ "$mingw" = "yes" ]; then targetos="Windows" pathsep='\\' @@ -210,11 +247,13 @@ else gamelib="game$cpu.so" exported="__attribute__((visibility(\"default\")))" - datadir="$prefix/share/games/quake2" - libdir="$prefix/lib/games/quake2" - refdir="$prefix/lib/games/q2pro" - bindir="$prefix/games" - mandir="$prefix/share/man/man6" + if [ ! -z "$prefix" ]; then + datadir="$prefix/$datadir" + libdir="$prefix/$libdir" + refdir="$prefix/$refdir" + bindir="$prefix/$bindir" + mandir="$prefix/$mandir" + fi # check if -fvisibility is supported echo "int main(){return 0;}" > $tmpc @@ -246,14 +285,18 @@ fi echo "Build server $server" echo "Build OpenFFA $openffa" if [ "$mingw" = "no" ]; then - echo "Install prefix $prefix" - echo "Data directory $datadir" - echo "Game libraries $libdir" - if [ "$client" = "yes" ]; then - echo "Refresh libraries $refdir" + if [ "$singleuser" = "yes" ]; then + echo "Single user $singleuser" + else + echo "Data directory $datadir" + echo "Game libraries $libdir" + if [ "$client" = "yes" ]; then + echo "Refresh libraries $refdir" + fi + echo "Binaries $bindir" + echo "Man pages $mandir" + echo "Home directory $homedir" fi - echo "Binaries $bindir" - echo "Man pages $mandir" fi echo "zlib support $zlib" if [ "$client" = "yes" ]; then @@ -348,12 +391,14 @@ if [ "$mingw" = "no" ]; then echo "REFDIR=$refdir" >> $config_mk echo "#define REFDIR \"$refdir\"" >> $config_h - echo "BINDIR=$bindir" >> $config_mk - echo "#define BINDIR \"$bindir\"" >> $config_h - - echo "MANDIR=$mandir" >> $config_mk - echo "#define HOMEDIR \"$homedir\"" >> $config_h + + if [ "$singleuser" = "yes" ]; then + echo "SINGLEUSER=$singleuser" >> $config_mk + else + echo "BINDIR=$bindir" >> $config_mk + echo "MANDIR=$mandir" >> $config_mk + fi fi echo "#define EXPORTED $exported" >> $config_h diff --git a/debian/changelog b/debian/changelog index d632fde..6587729 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +q2pro (0.170) unstable; urgency=low + + * New release. + + -- Andrey Nazarov <skuller-vidnoe@yandex.ru> Fri, 28 Dec 2007 00:14:34 +0300 + q2pro (0.166) unstable; urgency=low * Initial Release. diff --git a/debian/control b/debian/control index af7d6c0..82bdfc3 100644 --- a/debian/control +++ b/debian/control @@ -6,12 +6,12 @@ Build-Depends: cdbs, debhelper (>= 5), libx11-dev, libsdl1.2-dev, libpng12-dev, libjpeg62-dev, zlib1g-dev, mesa-common-dev Standards-Version: 3.7.2 -Package: q2pro +Package: q2pro-client Architecture: i386 Depends: ${shlibs:Depends}, quake2-data -Description: Enhanced Quake II engine for multiplayer - Q2PRO is a Quake II engine modification designed for online play, - fully compatible with original Quake II clients and servers. +Description: Enhanced Quake 2 client for multiplayer + Q2PRO is a Quake 2 engine modification designed for online play, + fully compatible with original Quake 2 clients and servers. . Q2PRO features enhanced graphical console, support for 32-bit textures and MD3 models, network protocol optimizations, freely resizable windows, @@ -23,3 +23,19 @@ Description: Enhanced Quake II engine for multiplayer take most of Q2PRO features. . Homepage: http://q2pro.sourceforge.net/ + +Package: q2pro-server +Architecture: i386 +Depends: ${shlibs:Depends} +Description: Dedicated Quake 2 server + Q2PRO is a Quake 2 engine modification designed for online play, + fully compatible with original Quake 2 clients and servers. + . + Q2PRO dedicated server features multi-view demo recording capabilities, + game television support, network protocol optimizations, increased security + and overall performance. + . + This package contains streamlined server executable, with all client side + code stripped out. Use it for hosting long running Quake 2 servers. + . + Homepage: http://q2pro.sourceforge.net/ diff --git a/debian/q2pro-client.install b/debian/q2pro-client.install new file mode 100644 index 0000000..a7aebbf --- /dev/null +++ b/debian/q2pro-client.install @@ -0,0 +1,2 @@ +usr/lib/games/q2pro/* +usr/games/q2pro diff --git a/debian/q2pro-server.install b/debian/q2pro-server.install new file mode 100644 index 0000000..56aafce --- /dev/null +++ b/debian/q2pro-server.install @@ -0,0 +1 @@ +usr/games/q2proded diff --git a/debian/rules b/debian/rules index 3da138a..1bd114e 100755 --- a/debian/rules +++ b/debian/rules @@ -3,6 +3,8 @@ include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/autotools.mk +DEB_DH_INSTALL_SOURCEDIR := debian/tmp + DEB_CONFIGURE_NORMAL_ARGS := --prefix=$(DEB_CONFIGURE_PREFIX) \ - --enable-png --enable-jpeg + --enable-png --enable-jpeg --enable-server --enable-anticheat diff --git a/source/common.c b/source/common.c index 61f33b5..b655300 100644 --- a/source/common.c +++ b/source/common.c @@ -50,7 +50,6 @@ cvar_t *sv_paused; cvar_t *cl_running; cvar_t *cl_paused; cvar_t *com_timedemo; -cvar_t *com_sleep; cvar_t *com_date_format; cvar_t *com_time_format; cvar_t *com_debug_break; @@ -1262,7 +1261,6 @@ void Qcommon_Init( int argc, char **argv ) { cl_running = Cvar_Get( "cl_running", "0", CVAR_ROM ); cl_paused = Cvar_Get( "cl_paused", "0", CVAR_ROM ); com_timedemo = Cvar_Get( "timedemo", "0", CVAR_CHEAT ); - com_sleep = Cvar_Get( "com_sleep", "1", 0 ); com_date_format = Cvar_Get( "com_date_format", "%Y-%m-%d", 0 ); #ifdef _WIN32 com_time_format = Cvar_Get( "com_time_format", "%H.%M", 0 ); diff --git a/source/sv_ac.c b/source/sv_ac.c index 611ac0c..c92292d 100644 --- a/source/sv_ac.c +++ b/source/sv_ac.c @@ -193,7 +193,7 @@ static const ac_cvarop_t ac_cvarops[] = { { "eq", OP_STREQUAL, 254 }, { "ne", OP_STRNEQUAL, 254 }, { "~", OP_STRSTR, 254 }, - { 0 } + { "" } }; diff --git a/source/sv_ccmds.c b/source/sv_ccmds.c index 54dcd80..2476775 100644 --- a/source/sv_ccmds.c +++ b/source/sv_ccmds.c @@ -36,40 +36,36 @@ SV_SetMaster_f Specify a list of master servers ==================== */ -void SV_SetMaster_f (void) -{ +static void SV_SetMaster_f( void ) { int i, slot; // only dedicated servers send heartbeats - if (!dedicated->integer) - { - Com_Printf ("Only dedicated servers use masters.\n"); + if( !dedicated->integer ) { + Com_Printf( "Only dedicated servers use masters.\n" ); return; } // make sure the server is listed public - Cvar_Set ("public", "1"); + Cvar_Set( "public", "1" ); - for (i=0 ; i<MAX_MASTERS ; i++) - memset (&master_adr[i], 0, sizeof(master_adr[0])); + for( i = 0; i < MAX_MASTERS; i++ ) + memset( &master_adr[i], 0, sizeof( master_adr[0] ) ); slot = 0; - for (i=1 ; i<Cmd_Argc() ; i++) - { - if (slot == MAX_MASTERS) { - Com_Printf ("Too many masters.\n"); + for( i = 1; i < Cmd_Argc(); i++) { + if( slot == MAX_MASTERS ) { + Com_Printf( "Too many masters.\n" ); break; } - if (!NET_StringToAdr (Cmd_Argv(i), &master_adr[slot])) - { - Com_Printf ("Bad address: %s\n", Cmd_Argv(i)); + if( !NET_StringToAdr( Cmd_Argv( i ), &master_adr[slot] ) ) { + Com_Printf( "Bad address: %s\n", Cmd_Argv( i ) ); continue; } - if (master_adr[slot].port == 0) - master_adr[slot].port = BigShort (PORT_MASTER); + if( master_adr[slot].port == 0 ) + master_adr[slot].port = BigShort( PORT_MASTER ); - Com_Printf ("Master server at %s\n", NET_AdrToString (&master_adr[slot])); + Com_Printf( "Master server at %s\n", NET_AdrToString( &master_adr[slot] ) ); //Com_Printf ("Sending a ping.\n"); @@ -78,7 +74,7 @@ void SV_SetMaster_f (void) slot++; } - svs.last_heartbeat = -9999999; + svs.last_heartbeat = 0; } static const char *SV_SetPlayer_g( const char *partial, int state ) { @@ -451,7 +447,7 @@ SV_Heartbeat_f ================== */ static void SV_Heartbeat_f( void ) { - svs.last_heartbeat = -9999999; + svs.last_heartbeat = 0; } diff --git a/source/sv_init.c b/source/sv_init.c index f2c9d93..0271269 100644 --- a/source/sv_init.c +++ b/source/sv_init.c @@ -263,9 +263,6 @@ void SV_InitGame( qboolean ismvd ){ } #endif - // heartbeats will always be sent to the id master - svs.last_heartbeat = -99999; // send immediately - // init game if( ismvd ) { if( ge ) { diff --git a/source/sv_local.h b/source/sv_local.h index 569306f..762fa86 100644 --- a/source/sv_local.h +++ b/source/sv_local.h @@ -308,7 +308,6 @@ typedef struct server_static_s { uint32 nextEntityStates; // next entityState to use entity_state_t *entityStates; // [numEntityStates] - list_t tcp_client_pool; list_t tcp_client_list; diff --git a/source/sv_main.c b/source/sv_main.c index c5fb882..79a2124 100644 --- a/source/sv_main.c +++ b/source/sv_main.c @@ -84,9 +84,6 @@ cvar_t *sv_badauth_time; cvar_t *sv_nextserver; -void Master_Shutdown (void); - - //============================================================================ void SV_RemoveClient( client_t *client ) { @@ -1356,6 +1353,78 @@ static void SV_RunGameFrame( void ) { } /* +================ +SV_MasterHeartbeat + +Send a message to the master every few minutes to +let it know we are alive, and log information +================ +*/ +#define HEARTBEAT_SECONDS 300 +static void SV_MasterHeartbeat( void ) { + char buffer[MAX_PACKETLEN_DEFAULT]; + int length; + int i; + + if( !dedicated->integer ) + return; // only dedicated servers send heartbeats + + if( !sv_public->integer ) + return; // a private dedicated game + + // check for time wraparound + if( svs.last_heartbeat > svs.realtime ) + svs.last_heartbeat = svs.realtime; + + if( svs.realtime - svs.last_heartbeat < HEARTBEAT_SECONDS*1000 ) + return; // not time to send yet + + svs.last_heartbeat = svs.realtime; + + // write the packet header + memcpy( buffer, "\xff\xff\xff\xffheartbeat\n", 14 ); + + // send the same string that we would give for a status OOB command + length = SV_StatusString( buffer + 14 ); + + // send to group master + for( i = 0; i < MAX_MASTERS; i++ ) { + if( master_adr[i].port ) { + Com_Printf( "Sending heartbeat to %s\n", + NET_AdrToString( &master_adr[i] ) ); + NET_SendPacket( NS_SERVER, &master_adr[i], length + 14, buffer ); + } + } +} + +/* +================= +SV_MasterShutdown + +Informs all masters that this server is going down +================= +*/ +static void SV_MasterShutdown( void ) { + int i; + + if( !dedicated->integer ) + return; // only dedicated servers send heartbeats + + if( !sv_public->integer ) + return; // a private dedicated game + + // send to group master + for( i = 0; i < MAX_MASTERS; i++ ) { + if( master_adr[i].port ) { + Com_Printf( "Sending shutdown to %s\n", + NET_AdrToString( &master_adr[i] ) ); + OOB_PRINT( NS_SERVER, &master_adr[i], "shutdown" ); + } + } +} + + +/* ================== SV_Frame @@ -1373,7 +1442,7 @@ void SV_Frame( int msec ) { // if server is not active, do nothing if( !svs.initialized ) { if( dedicated->integer ) { - NET_Sleep( 1 ); + Sys_Sleep( 1 ); } return; } @@ -1424,12 +1493,8 @@ void SV_Frame( int msec ) { Com_Printf( "sv lowclamp\n" ); svs.realtime = sv.time - 100; } - if( dedicated->integer && com_sleep->integer ) { - if( com_sleep->integer > 1 ) { - NET_Sleep( sv.time - svs.realtime ); - } else { - NET_Sleep( 1 ); - } + if( dedicated->integer ) { + NET_Sleep( sv.time - svs.realtime ); } return; } @@ -1447,7 +1512,7 @@ void SV_Frame( int msec ) { SV_SendClientMessages (); // send a heartbeat to the master if needed - Master_Heartbeat (); + SV_MasterHeartbeat (); // clear teleport flags, etc for next frame if( sv.state != ss_broadcast ) { @@ -1458,83 +1523,6 @@ void SV_Frame( int msec ) { //============================================================================ /* -================ -Master_Heartbeat - -Send a message to the master every few minutes to -let it know we are alive, and log information -================ -*/ -#define HEARTBEAT_SECONDS 300 -void Master_Heartbeat (void) { - char buffer[MAX_PACKETLEN_DEFAULT]; - int length; - int i; - - // pgm post3.19 change, cvar pointer not validated before dereferencing - if (!dedicated || !dedicated->integer) - return; // only dedicated servers send heartbeats - - // pgm post3.19 change, cvar pointer not validated before dereferencing - if (!sv_public || !sv_public->integer) - return; // a private dedicated game - - // check for time wraparound - if (svs.last_heartbeat > svs.realtime) - svs.last_heartbeat = svs.realtime; - - if (svs.realtime - svs.last_heartbeat < HEARTBEAT_SECONDS*1000) - return; // not time to send yet - - svs.last_heartbeat = svs.realtime; - - // write the packet header - memcpy( buffer, "\xff\xff\xff\xffheartbeat\n", 14 ); - - // send the same string that we would give for a status OOB command - length = SV_StatusString( buffer + 14 ); - - // send to group master - for( i = 0; i < MAX_MASTERS; i++ ) { - if( master_adr[i].port ) { - Com_Printf( "Sending heartbeat to %s\n", - NET_AdrToString( &master_adr[i] ) ); - NET_SendPacket( NS_SERVER, &master_adr[i], length + 14, buffer ); - } - } -} - -/* -================= -Master_Shutdown - -Informs all masters that this server is going down -================= -*/ -void Master_Shutdown( void ) { - int i; - - // pgm post3.19 change, cvar pointer not validated before dereferencing - if (!dedicated || !dedicated->integer) - return; // only dedicated servers send heartbeats - - // pgm post3.19 change, cvar pointer not validated before dereferencing - if (!sv_public || !sv_public->integer) - return; // a private dedicated game - - // send to group master - for( i = 0; i < MAX_MASTERS; i++ ) { - if( master_adr[i].port ) { - Com_Printf( "Sending shutdown to %s\n", - NET_AdrToString( &master_adr[i] ) ); - OOB_PRINT( NS_SERVER, &master_adr[i], "shutdown" ); - } - } -} - -//============================================================================ - -/* ================= SV_UpdateUserinfo @@ -1709,7 +1697,7 @@ void SV_Init( void ) { sv_noreload = Cvar_Get ("sv_noreload", "0", 0); sv_airaccelerate = Cvar_Get("sv_airaccelerate", "0", CVAR_LATCH); sv_qwmod = Cvar_Get( "sv_qwmod", "0", CVAR_LATCH ); //atu QWMod - sv_public = Cvar_Get ("public", "0", 0); + sv_public = Cvar_Get( "public", "0", CVAR_LATCH ); rcon_password = Cvar_Get( "rcon_password", "", CVAR_PRIVATE ); sv_password = Cvar_Get( "sv_password", "", CVAR_PRIVATE ); sv_reserved_password = Cvar_Get( "sv_reserved_password", "", CVAR_PRIVATE ); @@ -1863,7 +1851,7 @@ void SV_Shutdown( const char *finalmsg, killtype_t type ) { SV_FinalMessage( finalmsg, svc_disconnect ); } - Master_Shutdown(); + SV_MasterShutdown(); SV_ShutdownGameProgs(); // free current level diff --git a/source/sys_unix.c b/source/sys_unix.c index 071c9c4..8c10db9 100644 --- a/source/sys_unix.c +++ b/source/sys_unix.c @@ -762,8 +762,7 @@ Sys_Init ================= */ void Sys_Init( void ) { - char homedir[MAX_OSPATH]; - char *s; + char *homedir; signal( SIGTERM, Sys_Kill ); signal( SIGINT, Sys_Kill ); @@ -777,11 +776,15 @@ void Sys_Init( void ) { // homedir <path> // specifies per-user writable directory for demos, screenshots, etc - s = getenv( "HOME" ); - if( s && *s ) { - Q_concat( homedir, sizeof( homedir ), s, "/" HOMEDIR, NULL ); + if( HOMEDIR[0] == '~' ) { + char *s = getenv( "HOME" ); + if( s && *s ) { + homedir = va( "%s%s", s, HOMEDIR + 1 ); + } else { + homedir = ""; + } } else { - homedir[0] = 0; + homedir = HOMEDIR; } sys_homedir = Cvar_Get( "homedir", homedir, CVAR_NOSET ); diff --git a/wiki/contact.mdwn b/wiki/contact.mdwn index 6288a55..8550dba 100644 --- a/wiki/contact.mdwn +++ b/wiki/contact.mdwn @@ -11,7 +11,7 @@ available (in Russian), hosted by the [Russian Quake2 Portal](http://quake2.com. Q2PRO author (SkulleR) can be contacted directly in the following ways: * email: skuller-vidnoe at yandex.ru -* jabber: skuller at amessage.info +* jabber/email: skuller32 at gmail.com Author's GPG key: |