diff --git a/Source/Client/Draw.c b/Source/Client/Draw.c index 2bd3d538..02c36213 100755 --- a/Source/Client/Draw.c +++ b/Source/Client/Draw.c @@ -233,7 +233,11 @@ void CSQC_UpdateView( float fWinWidth, float fWinHeight, float fGameFocus ) { if ( pSeat->fCameraTime > time ) { setproperty( VF_ORIGIN, pSeat->vCameraPos ) ; } else { - setproperty( VF_ORIGIN, pSeat->vPlayerOrigin + [ 0, 0, getstatf( STAT_VIEWHEIGHT ) ] ); + if ( getstatf( STAT_HEALTH ) ) { + setproperty( VF_ORIGIN, pSeat->vPlayerOrigin + [ 0, 0, getstatf( STAT_VIEWHEIGHT ) ] ); + } else { + setproperty( VF_ORIGIN, pSeat->vPlayerOrigin ); + } View_DrawViewModel(); } diff --git a/Source/Client/Entities.c b/Source/Client/Entities.c index 4b9be00f..967ff00f 100755 --- a/Source/Client/Entities.c +++ b/Source/Client/Entities.c @@ -18,9 +18,28 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -void CSQC_ambient_generic( string sSample, float fVolume, float fAttenuation ) { +void CSQC_ambient_generic( string sSample, float fVolume, float fAttenuation, float fLoop, float lFORate ) { //print( sprintf( "SOUND: %s, %f, %d\n%d %d %d", sSample, fVolume, fAttenuation, self.origin_x, self.origin_y, self.origin_z ) ); - sound( self, CHAN_VOICE, sSample, fVolume, fAttenuation, 0, SOUNDFLAG_FORCELOOP ); + static void LFOHack (void) { + sound( self, CHAN_VOICE, self.classname, self.movetype, self.style, 0, 0 ); + self.nextthink = self.solid + time; + } + // Hack + if ( lFORate ) { + self.classname = sSample; + self.movetype = fVolume; + self.style = fAttenuation; + self.think = LFOHack; + self.solid = lFORate / 10; + self.nextthink = self.solid + time; + fLoop = FALSE; + } + + if ( fLoop ) { + sound( self, CHAN_VOICE, sSample, fVolume, fAttenuation, 0, SOUNDFLAG_FORCELOOP ); + } else { + sound( self, CHAN_VOICE, sSample, fVolume, fAttenuation, 0, 0 ); + } } /* @@ -73,7 +92,7 @@ void CSQC_Ent_Update( float flIsNew ) { setorigin( self, self.origin ); - CSQC_ambient_generic( readstring(), readfloat(), readbyte() ); + CSQC_ambient_generic( readstring(), readfloat(), readbyte(), readbyte(), readbyte() ); } else if ( fEntType == ENT_SPRITE ) { self.origin_x = readcoord(); self.origin_y = readcoord(); diff --git a/Source/Math.h b/Source/Math.h index ab957269..e4eef322 100755 --- a/Source/Math.h +++ b/Source/Math.h @@ -103,6 +103,7 @@ void runplayerphysics(void) self.maxs = VEC_HULL_MAX; self.view_ofs = VEC_PLAYER_VIEWPOS; } + self.maxspeed = Game_GetMaxSpeed( self.weapon ); runstandardplayerphysics( self ); if ( ( self.flags & FL_ONGROUND ) && self.movetype == MOVETYPE_WALK && ( fallvel > 100 )) { diff --git a/Source/Menu/Draw.c b/Source/Menu/Draw.c index 6a046d95..3fa50fce 100755 --- a/Source/Menu/Draw.c +++ b/Source/Menu/Draw.c @@ -62,5 +62,6 @@ void m_draw( vector vScreenSize ) { fcsMain[ iMenu ].vMenu(); Header_Draw(); - drawstring( '16 16', sprintf( "FreeCS Version: %s\n", __DATE__ ), FONTSIZE, '1 1 1', 1.0f, 0 ); + //drawstring( '16 16', , FONTSIZE, '1 1 1', 1.0f, 0 ); + Object_Label_Right( [ 640 - 16, 480 - 16 ], sprintf( "FreeCS Version: %s", __DATE__ ), FONTSIZE ); } diff --git a/Source/Menu/Init.c b/Source/Menu/Init.c index 8be1cc8a..3c0661ce 100755 --- a/Source/Menu/Init.c +++ b/Source/Menu/Init.c @@ -29,6 +29,8 @@ void Menu_Configuration_Init( void ); void m_init( void ) { precache_pic( "gfx/shell/splash" ); precache_pic( "gfx/shell/btns_main" ); + precache_pic( "gfx/shell/cb_empty" ); + precache_pic( "gfx/shell/cb_checked" ); Menu_Configuration_Init(); diff --git a/Source/Menu/MenuMain.c b/Source/Menu/MenuMain.c index ff85bac6..150b58e2 100755 --- a/Source/Menu/MenuMain.c +++ b/Source/Menu/MenuMain.c @@ -55,6 +55,13 @@ void Menu_Main( void ) { Object_Button( '72 384', BTN_README, __NULL__, fButtonAlpha[4] ); Object_Button( '72 412', BTN_VISITWEB, __NULL__, fButtonAlpha[5] ); Object_Button( '72 440', BTN_QUIT, Main_ButtonQuit, fButtonAlpha[6] ); + + Object_Desc( '244 282', "Change Counter-Strike's video, audio and control settings.", FONTSIZE ); + Object_Desc( '244 338', "Get online and play Counter-Strike with others around the world.", FONTSIZE ); + Object_Desc( '244 366', "Play/download other mods, or go back to Counter-Strike.", FONTSIZE ); + Object_Desc( '244 394', "Read Counter-Strike's readme.txt.", FONTSIZE ); + Object_Desc( '244 422', "Read the official Counter-Strike manual, learn how to play.", FONTSIZE ); + Object_Desc( '244 450', "Quit Counter-Strike.", FONTSIZE ); } /* diff --git a/Source/Menu/Objects.c b/Source/Menu/Objects.c index 27de7721..0078c605 100755 --- a/Source/Menu/Objects.c +++ b/Source/Menu/Objects.c @@ -207,6 +207,18 @@ void Object_Label_Right( vector vPosition, string sLabel, vector vSize ) { Object_Label( vPosition, sLabel, vSize ); } +/* +================= +Object_Desc + +A label in a grey scheme +================= +*/ +void Object_Desc( vector vPosition, string sLabel, vector vSize ) { + vPosition += vMenuOffset; + drawstring( vPosition, sLabel, vSize, '0.68 0.68 0.68', 1.0f, 0 ); +} + /* ================= Object_Scrollbar @@ -293,7 +305,7 @@ void Object_CvarToggle( vector vPosition, string sLabel, string sCvar ) { int iWidth = stringwidth( sLabel, FALSE ); vPosition += vMenuOffset; - if ( Menu_InputCheckMouse( vPosition, [ iWidth + 32, 12 ] ) == TRUE ) { + if ( Menu_InputCheckMouse( vPosition, [ iWidth + 32, 19 ] ) == TRUE ) { fAlpha = 1.0f; if ( fMouseClick == TRUE ) { if ( cvar( sCvar ) == 0 ) { @@ -305,12 +317,14 @@ void Object_CvarToggle( vector vPosition, string sLabel, string sCvar ) { } } - drawfill( vPosition + '-2 -2', [ iWidth + 36, 16 ], '0 0 0', 0.8f ); + drawfill( vPosition + '-2 -2', [ iWidth + 48, 19 ], '0 0 0', 0.8f ); if ( cvar( sCvar ) == 0 ) { - drawstring( vPosition, sprintf( "[ ] %s", sLabel ), FONTSIZE, autocvar_menu_fgcolor, fAlpha, 0 ); + drawpic( vPosition, "gfx/shell/cb_empty", '19 19', '1 1 1', 1.0f, 0 ); + drawstring( vPosition+[24,4], sLabel, FONTSIZE, autocvar_menu_fgcolor, fAlpha, 0 ); } else { - drawstring( vPosition, sprintf( "[X] %s", sLabel ), FONTSIZE, autocvar_menu_fgcolor, fAlpha, 0 ); + drawpic( vPosition, "gfx/shell/cb_checked", '19 19', '1 1 1', 1.0f, 0 ); + drawstring( vPosition+[24,4], sLabel, FONTSIZE, autocvar_menu_fgcolor, fAlpha, 0 ); } } @@ -326,7 +340,7 @@ void Object_FuncToggle( vector vPosition, string sLabel, void( void ) vFunc, int int iWidth = stringwidth( sLabel, FALSE ); vPosition += vMenuOffset; - if ( Menu_InputCheckMouse( vPosition, [ iWidth + 32, 12 ] ) == TRUE ) { + if ( Menu_InputCheckMouse( vPosition, [ iWidth + 32, 19 ] ) == TRUE ) { fAlpha = 1.0f; if ( fMouseClick == TRUE ) { vFunc(); @@ -334,12 +348,14 @@ void Object_FuncToggle( vector vPosition, string sLabel, void( void ) vFunc, int } } - drawfill( vPosition + '-2 -2', [ iWidth + 36, 16 ], '0 0 0', 0.8f ); + drawfill( vPosition + '-2 -2', [ iWidth + 48, 19 ], '0 0 0', 0.8f ); if ( iValue == 0 ) { - drawstring( vPosition, sprintf( "[ ] %s", sLabel ), FONTSIZE, autocvar_menu_fgcolor, fAlpha, 0 ); + drawpic( vPosition, "gfx/shell/cb_empty", '19 19', '1 1 1', 1.0f, 0 ); + drawstring( vPosition+[24,4], sLabel, FONTSIZE, autocvar_menu_fgcolor, fAlpha, 0 ); } else { - drawstring( vPosition, sprintf( "[X] %s", sLabel ), FONTSIZE, autocvar_menu_fgcolor, fAlpha, 0 ); + drawpic( vPosition, "gfx/shell/cb_checked", '19 19', '1 1 1', 1.0f, 0 ); + drawstring( vPosition+[24,4], sLabel, FONTSIZE, autocvar_menu_fgcolor, fAlpha, 0 ); } } diff --git a/Source/Server/AmbientSound.c b/Source/Server/AmbientSound.c index 052c8056..48877f2c 100755 --- a/Source/Server/AmbientSound.c +++ b/Source/Server/AmbientSound.c @@ -41,6 +41,8 @@ Not Toggled (32) - Older FGDs show this as Not Looped. Note that actual looping depends purely on cue points defined in the .wav file (see notes). */ .float pitch; +.float loop; +.float lforate; void ambient_generic( void ) { static float ambient_generic_send( entity ePEnt, float fChanged ) { WriteByte( MSG_ENTITY, ENT_AMBIENTSOUND ); @@ -50,6 +52,8 @@ void ambient_generic( void ) { WriteString( MSG_ENTITY, self.message ); WriteFloat( MSG_ENTITY, self.health ); WriteByte( MSG_ENTITY, self.style ); + WriteByte( MSG_ENTITY, self.loop ); + WriteByte( MSG_ENTITY, self.lforate ); return TRUE; } static void ambient_generic_use( void ) { @@ -72,11 +76,11 @@ void ambient_generic( void ) { ambient_generic_useloop(); } } - + precache_sound( self.message ); setorigin( self, self.origin ); self.health = self.health / 10; - + if ( self.spawnflags & 1 ) { self.style = ATTN_NONE; } else if ( self.spawnflags & 2 ) { @@ -89,7 +93,13 @@ void ambient_generic( void ) { self.style = ATTN_STATIC; } - if( self.spawnflags & 32 ) { + if ( self.spawnflags & 32 ) { + self.loop = FALSE; + } else { + self.loop = TRUE; + } + + if( self.spawnflags & 16 ) { self.vUse = ambient_generic_use; } else { self.noise = self.message; // Needed later for resuming diff --git a/Source/Server/EntHostage.c b/Source/Server/EntHostage.c index 10bfdcd8..306e8c8b 100755 --- a/Source/Server/EntHostage.c +++ b/Source/Server/EntHostage.c @@ -28,6 +28,51 @@ enum { HOSTAGE_RUN }; +enum { + A_WALK, + A_WALKSCARED, + A_RUN, + A_RUNSCARED, + A_RUNLOOK, + A_180LEFT, + A_180RIGHT, + A_FLINCH, + A_PAIN, + A_PAINLEFT, + A_PAINRIGHT, + A_PAINLEGLEFT, + A_PAINLEGRIGHT, + A_IDLE1, + A_IDLE2, + A_IDLE3, + A_IDLE4, + A_IDLE5, + A_IDLE6, + A_SCARED_END, + A_SCARED1, + A_SCARED2, + A_SCARED3, + A_PANIC, + A_FEAR1, + A_FEAR2, + A_CRY, + A_SCI1, + A_SCI2, + A_SCI3, + A_DIE_SIMPLE, + A_DIE_FORWARD1, + A_DIE_FORWARD2, + A_DIE_BACKWARD, + A_DIE_HEADSHOT, + A_DIE_GUTSHOT, + A_LYING1, + A_LYING2, + A_DEADSIT, + A_DEADTABLE1, + A_DEADTABLE2, + A_DEADTABLE3 +}; + /* ================= hostage_waypoint @@ -73,7 +118,7 @@ Called whenever a hostage is shot ================= */ void hostage_pain( int iHitBody ) { - self.frame = 13 - floor( random( 1, 6 ) ); + self.frame = A_PAIN + floor( random( 0, 5 ) ); } /* @@ -85,7 +130,7 @@ hosdown.wav */ void hostage_die( int iHitBody ) { Radio_BroadcastMessage( RADIO_HOSDOWN ); - self.frame = 30 + floor( random( 1, 6 ) ); + self.frame = A_DIE_SIMPLE + floor( random( 0, 6 ) ); self.solid = SOLID_NOT; self.takedamage = DAMAGE_NO; @@ -140,7 +185,6 @@ void hostage_physics( void ) { // Slowly turn towards target float fTurn = Math_LerpAngle( self.v_angle_y, vEndAngle_y, frametime * 4 ); self.v_angle_y += fTurn; - self.v_angle_y = Math_FixDelta( self.v_angle_y ); // Is the waypoint close? if so, remove and go set the next one! @@ -189,20 +233,20 @@ void hostage_physics( void ) { } if ( fTurn > 0.01 ) { - self.frame = 5; + self.frame = A_180LEFT; } else if ( fTurn < -0.01 ){ - self.frame = 6; + self.frame = A_180RIGHT; } else { - self.frame = 13; + self.frame = A_IDLE1; } // Decide speed and stuff if ( self.style == HOSTAGE_WALK ) { - self.frame = 0; + self.frame = A_WALK; input_movevalues_x = 110; } else if ( self.style == HOSTAGE_RUN ) { input_movevalues_x = 220; - self.frame = 2; + self.frame = A_RUN; } else { input_movevalues_x = 0; } @@ -250,11 +294,20 @@ void hostage_entity( void ) { self.vDeath = hostage_die; self.style = HOSTAGE_IDLE; - self.frame = 13; // Idle frame + self.frame = A_IDLE1; self.health = 100; self.velocity = '0 0 0'; self.iHasBeenUsed = FALSE; } + + // Path hack + if ( self.model == "/models/hostage.mdl" ) { + self.model = ""; + } + + if ( !self.model ) { + self.model = "models/hostage.mdl"; + } precache_model( self.model ); hostage_entity_respawn(); diff --git a/Source/Server/Main.c b/Source/Server/Main.c index dc16ac2b..238277b5 100755 --- a/Source/Server/Main.c +++ b/Source/Server/Main.c @@ -48,15 +48,15 @@ chat messages and handle distribution ourselves. */ void SV_ParseClientCommand( string sCommand ) { tokenize( sCommand ); - - string chat = substring( sCommand, 4, strlen( sCommand ) - 4 ) - + if ( argv( 1 ) == "timeleft" ) { float fTimeLeft = cvar( "mp_timelimit" ) - ( time / 60 ); Vox_Singlecast( self, sprintf( "we have %s minutes remaining", Vox_TimeToString( fTimeLeft ) ) ); return; } + string chat = substring( sCommand, 4, strlen( sCommand ) - 4 ); + // Players talk to players, spectators to spectators. if ( self.health ) { if ( argv( 0 ) == "say" ) { diff --git a/freecs/csprogs.dat b/freecs/csprogs.dat index 0d4d1a41..b7c2e734 100644 Binary files a/freecs/csprogs.dat and b/freecs/csprogs.dat differ diff --git a/freecs/menu.dat b/freecs/menu.dat index 15f1c0c6..c84434df 100755 Binary files a/freecs/menu.dat and b/freecs/menu.dat differ diff --git a/freecs/progs.dat b/freecs/progs.dat index a068f14f..2b40d9a6 100644 Binary files a/freecs/progs.dat and b/freecs/progs.dat differ