summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rwxr-xr-xconfigure125
-rw-r--r--debian/changelog6
-rw-r--r--debian/control24
-rw-r--r--debian/q2pro-client.install2
-rw-r--r--debian/q2pro-server.install1
-rwxr-xr-xdebian/rules4
-rw-r--r--source/common.c2
-rw-r--r--source/sv_ac.c2
-rw-r--r--source/sv_ccmds.c36
-rw-r--r--source/sv_init.c3
-rw-r--r--source/sv_local.h1
-rw-r--r--source/sv_main.c168
-rw-r--r--source/sys_unix.c15
-rw-r--r--wiki/contact.mdwn2
15 files changed, 226 insertions, 169 deletions
diff --git a/Makefile b/Makefile
index 89def2b..0adc1be 100644
--- a/Makefile
+++ b/Makefile
@@ -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 ; \
diff --git a/configure b/configure
index d169f06..e0ea2f9 100755
--- a/configure
+++ b/configure
@@ -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: