diff --git a/Source/Client/Defs.h b/Source/Client/Defs.h
index ef1673ed..7406eb96 100755
--- a/Source/Client/Defs.h
+++ b/Source/Client/Defs.h
@@ -59,10 +59,55 @@ vector vHUDColor; // Defined in HUD_Draw (HUD.c)
vector vVGUIColor; // Defined in HUD_Draw (VGUI.c)
vector vCrossColor; // Defined in HUD_Draw (HUDCrosshair.c)
-float fVGUI_Display; // The VGUI menu currently being drawn
+struct
+{
+//Viewmodel stuff
+ entity eViewModel;
+ entity eMuzzleflash;
+ float fNumBones;
+ vector vPunchAngle;
+ float fLastWeapon;
+ float fBobTime;
+ float fBob;
+
+//Player fields
+ entity ePlayer;
+ vector vPlayerOrigin;
+ vector vPlayerOriginOld;
+ vector vPlayerVelocity;
+
+// Camera Fields
+ //entity ePlayerEnt;
+ vector vCameraPos;
+ vector vCameraAngle;
+ float fCameraTime;
+
+// Flashbang'd
+ float fFlashTime;
+ float fFlashAlpha;
+
+//UI fields
+ float fVGUI_Display; // The VGUI menu currently being drawn
+ int iShowScores; // This is seperated from the other VGUI stuff so we can check scores while buying and whatnot
+
+//crosshair
+ int iOldShotMultiplier;
+ float fCrosshairDistance;
+ float fDecreaseShotTime;
+ int iShotMultiplier;
+
+//buy menu
+ // We can only carry one item per slot, so this is hacking around the last one
+ int iHUDGrenades;
+ int iHUDGrenadesSelected;
+ float fHUDWeaponSelectTime;
+ float fHUDWeaponSelected;
+} seats[4], *pSeat;
+
float fInputSendNext;
-vector vVideoResolution; // Updated every frame
+vector vVideoMins; //
+vector vVideoResolution; // Updated every frame
// Input globals, feel free to use them since they are updated upon input
float fInputKeyCode;
@@ -79,27 +124,14 @@ float fMouseClick;
vector vMousePos;
// Sound Stuff
-.string sSoundSample;
-.float fVolume;
-
-// Camera Fields
-//entity ePlayerEnt;
-vector vCameraPos;
-vector vCameraAngle;
-float fCameraTime;
-
-vector vPlayerOrigin;
-vector vPlayerOriginOld;
-vector vPlayerVelocity;
-
-vector vPunchAngle;
+//.string sSoundSample;
+//.float fVolume;
void View_AddPunchAngle( vector vAdd );
void View_PlayAnimation( int iSequence );
string HUD_GetChatColorHEX( float fTeam );
// This actually belongs in Builtins.h since its an undocumented global
-vector pmove_vel;
.float weapon;
.float maxframe;
@@ -109,10 +141,6 @@ float fWeaponEventPlayer;
.float fWeaponLast;
.float fWeaponBoneID;
-// Flashbang'd
-var float fFlashTime;
-var float fFlashAlpha;
-
void Animation_ShootWeapon( entity ePlayer );
void Animation_ReloadWeapon( entity ePlayer );
diff --git a/Source/Client/Draw.c b/Source/Client/Draw.c
index 51d22c6f..85b3969f 100755
--- a/Source/Client/Draw.c
+++ b/Source/Client/Draw.c
@@ -64,7 +64,7 @@ Just prints whatever is in the chat buffer and removes lines after some time.
=================
*/
void CSQC_DrawChat( void ) {
- vector vChatPos = [ 16, vVideoResolution_y - 128 ];
+ vector vChatPos = vVideoMins + [ 16, vVideoResolution_y - 128 ];
// Remove messages after a fChatTime has passed
if ( fChatTime < time ) {
@@ -111,9 +111,10 @@ void CSQC_DrawCenterprint( void ) {
}
}
- vCenterPrintPos_y = ( vVideoResolution_y / 2 ) - ( fCenterPrintLines - 4 );
+ vCenterPrintPos_y = vVideoMins_y + ( vVideoResolution_y / 2 ) - ( fCenterPrintLines - 4 );
+
for ( int i = 0; i < ( fCenterPrintLines ); i++ ) {
- vCenterPrintPos_x = ( vVideoResolution_x / 2 ) - ( stringwidth( sCenterPrintBuffer[ i ], FALSE ) / 2 );
+ vCenterPrintPos_x = vVideoMins_x + ( vVideoResolution_x / 2 ) - ( stringwidth( sCenterPrintBuffer[ i ], FALSE ) / 2 );
drawstring( vCenterPrintPos + '1 1', sCenterPrintBuffer[ i ], '8 8', '0 0 0', fCenterPrintAlpha, 0 );
drawstring( vCenterPrintPos, sCenterPrintBuffer[ i ], '8 8', '1 1 1', fCenterPrintAlpha, 0 );
vCenterPrintPos_y += 8;
@@ -150,6 +151,8 @@ Entry point for drawing on the client
=================
*/
void CSQC_UpdateView( float fWinWidth, float fWinHeight, float fGameFocus ) {
+ float needcursor;
+ int s;
vVideoResolution_x = fWinWidth;
vVideoResolution_y = fWinHeight;
@@ -157,48 +160,108 @@ void CSQC_UpdateView( float fWinWidth, float fWinHeight, float fGameFocus ) {
setproperty( VF_DRAWENGINESBAR, 0 );
setproperty( VF_DRAWCROSSHAIR, 0 );
+ //just in case...
+ if ( numclientseats > seats.length ) {
+ numclientseats = seats.length;
+ }
+
+ for ( s = seats.length; s-- > numclientseats; ) {
+ pSeat = &seats[ s ];
+ pSeat->fVGUI_Display = VGUI_MOTD;
+ pSeat->ePlayer = world;
+ }
+ for ( s = numclientseats; s-- > 0; ) {
+ pSeat = &seats[ s ];
+ setproperty( VF_ACTIVESEAT, (float)s );
+ pSeat->ePlayer = self = findfloat( world, entnum, player_localentnum );
+ if ( self ) {
+ Player_Predict();
+ }
+ }
+
addentities( MASK_ENGINE );
Nightvision_PreDraw();
-
- setproperty( VF_AFOV, cvar( "fov" ) * ( getstatf( STAT_VIEWZOOM ) / 255 ) );
- setsensitivityscaler( ( getstatf( STAT_VIEWZOOM ) / 255 ) );
-
- // When Cameratime is active, draw on the forced coords instead
- if ( fCameraTime > time ) {
- setproperty( VF_ORIGIN, vCameraPos) ;
- setproperty( VF_ANGLES, vCameraAngle );
- } else {
- setproperty( VF_ORIGIN, vPlayerOrigin + [ 0, 0, getstatf( STAT_VIEWHEIGHT ) ] );
- setproperty( VF_ANGLES, view_angles );
- View_DrawViewModel();
-
- }
- setproperty( VF_ANGLES, view_angles + vPunchAngle );
- renderscene();
- View_DropPunchAngle();
-
- Nightvision_PostDraw();
-
- if( fGameFocus == TRUE ) {
- // The spectator sees things... differently
- if ( getplayerkeyvalue( player_localnum, "*spec" ) != "0" ) {
- VGUI_DrawSpectatorHUD();
+ for ( s = 0; s < numclientseats; s++ ) {
+ pSeat = &seats[ s ];
+ setproperty( VF_ACTIVESEAT, (float)s );
+
+ if ( autocvar_cl_thirdperson == TRUE && getstatf( STAT_HEALTH ) ) {
+ setproperty( VF_VIEWENTITY, (float)0 );
} else {
- HUD_Draw();
+ setproperty( VF_VIEWENTITY, (float)player_localentnum );
}
-
- HUD_DrawOrbituaries();
- CSQC_DrawChat();
-
- // Don't even try to draw centerprints and VGUI menus when scores are shown
- if ( iShowScores == TRUE ) {
- VGUI_Scores_Show();
- } else {
- CSQC_DrawCenterprint();
- CSQC_VGUI_Draw();
+
+ setproperty( VF_AFOV, cvar( "fov" ) * ( getstatf( STAT_VIEWZOOM ) / 255 ) );
+ setsensitivityscaler( ( getstatf( STAT_VIEWZOOM ) / 255 ) );
+
+ // When Cameratime is active, draw on the forced coords instead
+ if ( pSeat->fCameraTime > time ) {
+ setproperty( VF_ORIGIN, pSeat->vCameraPos ) ;
+ } else {
+ setproperty( VF_ORIGIN, pSeat->vPlayerOrigin + [ 0, 0, getstatf( STAT_VIEWHEIGHT ) ] );
+ View_DrawViewModel();
}
+
+ //FIXME: this is awkward. renderscene internally rounds to pixels.
+ //on the other hand, drawpic uses linear filtering and multisample and stuff.
+ //this means that there can be a pixel or so difference between scene and 2d.
+ //as a general rule, you won't notice unless there's some big drawfills.
+ switch ( numclientseats ) {
+ case 3:
+ if (!s)
+ {
+ case 2:
+ vVideoResolution = [ fWinWidth, fWinHeight * 0.5 ];
+ vVideoMins = [ 0, ( s & 1 ) * vVideoResolution_y ];
+ break;
+ }
+ s++;
+ case 4:
+ vVideoResolution = [ fWinWidth, fWinHeight ] * 0.5;
+ vVideoMins = [ (s&1) * vVideoResolution_x, ( s / 2i ) * vVideoResolution_y ];
+ break;
+ default:
+ vVideoResolution = [ fWinWidth, fWinHeight ];
+ vVideoMins = [ 0, 0 ];
+ break;
+ }
+ setproperty( VF_MIN, vVideoMins );
+ setproperty( VF_SIZE, vVideoResolution );
+ setproperty( VF_ANGLES, view_angles + pSeat->vPunchAngle );
+ renderscene();
+
+ View_DropPunchAngle();
+
+ Nightvision_PostDraw();
+
+ if( fGameFocus == TRUE ) {
+ // The spectator sees things... differently
+ if ( getplayerkeyvalue( player_localnum, "*spec" ) != "0" ) {
+ VGUI_DrawSpectatorHUD();
+ } else {
+ HUD_Draw();
+ }
+
+ HUD_DrawOrbituaries();
+ CSQC_DrawChat();
+
+ // Don't even try to draw centerprints and VGUI menus when scores are shown
+ if ( pSeat->iShowScores == TRUE ) {
+ VGUI_Scores_Show();
+ } else {
+ CSQC_DrawCenterprint();
+ needcursor |= CSQC_VGUI_Draw();
+ }
+ }
+ }
+ pSeat = (void*)0x70000000i;
+
+ if ( needcursor ) {
+ setcursormode( TRUE, "gfx/cursor", '0 0 0', 1.0f );
+ } else {
+ setcursormode( FALSE, "gfx/cursor", '0 0 0', 1.0f );
}
Sound_ProcessWordQue();
@@ -212,5 +275,5 @@ Doesn't really do anything useful yet
=================
*/
void CSQC_UpdateViewLoading( float fWinWidth, float fWinHeight, float fGameFocus ) {
-
+ drawfill( [ 0, 0 ], [ fWinWidth, fWinHeight ], [ 1, 1, 1 ], 1, 0 );
}
diff --git a/Source/Client/Entities.c b/Source/Client/Entities.c
index 097f431b..0c8c4a22 100755
--- a/Source/Client/Entities.c
+++ b/Source/Client/Entities.c
@@ -39,7 +39,10 @@ void CSQC_Ent_Update( float flIsNew ) {
self.solid = SOLID_SLIDEBOX;
self.predraw = Player_PreDraw;
self.drawmask = MASK_ENGINE;
+ self.pmove_frame = servercommandframe;
}
+ else
+ Player_PreUpdate();
self.modelindex = readbyte();
self.origin_x = readcoord();
@@ -54,6 +57,8 @@ void CSQC_Ent_Update( float flIsNew ) {
self.flags = readfloat();
self.weapon = readbyte();
+ Player_PostUpdate();
+
if ( self.flags & FL_CROUCHING ) {
setsize( self, VEC_CHULL_MIN, VEC_CHULL_MAX );
} else {
diff --git a/Source/Client/Event.c b/Source/Client/Event.c
index db7cc990..16b10c53 100755
--- a/Source/Client/Event.c
+++ b/Source/Client/Event.c
@@ -114,6 +114,9 @@ Can interject cmds and create new ones
=================
*/
float CSQC_ConsoleCommand( string sCMD ) {
+ int s = (float)getproperty( VF_ACTIVESEAT ); //the engine will hide the p1 etc commands... which is fun...
+ pSeat = &seats[ s ];
+
tokenize( sCMD );
switch ( argv(0) ) {
case "vox_test":
@@ -154,12 +157,12 @@ float CSQC_ConsoleCommand( string sCMD ) {
break;
case "buy":
if( getstatf( STAT_BUYZONE ) == TRUE ) {
- fVGUI_Display = VGUI_BM_MAIN;
+ pSeat->fVGUI_Display = VGUI_BM_MAIN;
}
return TRUE;
break;
- case "chooseteam":
- fVGUI_Display = VGUI_TEAMSELECT;
+ case "chooseteam":
+ pSeat->fVGUI_Display = VGUI_TEAMSELECT;
return TRUE;
break;
case "invnext":
@@ -171,11 +174,11 @@ float CSQC_ConsoleCommand( string sCMD ) {
return TRUE;
break;
case "+showscores":
- iShowScores = TRUE;
+ pSeat->iShowScores = TRUE;
return TRUE;
break;
case "-showscores":
- iShowScores = FALSE;
+ pSeat->iShowScores = FALSE;
return TRUE;
break;
case "nightvision":
@@ -418,19 +421,46 @@ Whenever we call a SVC_CGAMEPACKET on the SSQC, this is being run
=================
*/
void CSQC_Parse_Event( void ) {
+ int s = (float)getproperty( VF_ACTIVESEAT ); //always 0, unless it was sent with a MULTICAST_ONE or MULTICAST_ONE_R to p2+
+ pSeat = &seats[ s ];
+
float fHeader = readbyte();
if ( fHeader == EV_WEAPON_DRAW ) {
fWeaponEventPlayer = readbyte();
+ for (s = 0; s < numclientseats; s++) //lame loop
+ if (seats[s].ePlayer.entnum == fWeaponEventPlayer) {
+ setproperty(VF_ACTIVESEAT, (float)s);
+ pSeat = &seats[s];
+ break;
+ }
Weapon_Draw( getstatf( STAT_ACTIVEWEAPON ) );
} else if ( fHeader == EV_WEAPON_PRIMARYATTACK ) {
fWeaponEventPlayer = readbyte();
+ for (s = 0; s < numclientseats; s++) //lame loop
+ if (seats[s].ePlayer.entnum == fWeaponEventPlayer) {
+ setproperty(VF_ACTIVESEAT, (float)s);
+ pSeat = &seats[s];
+ break;
+ }
Weapon_PrimaryAttack( getstatf( STAT_ACTIVEWEAPON ) );
} else if ( fHeader == EV_WEAPON_SECONDARYATTACK ) {
- Weapon_SecondaryAttack( getstatf( STAT_ACTIVEWEAPON ) );
fWeaponEventPlayer = readbyte();
+ for (s = 0; s < numclientseats; s++) //lame loop
+ if (seats[s].ePlayer.entnum == fWeaponEventPlayer) {
+ setproperty(VF_ACTIVESEAT, (float)s);
+ pSeat = &seats[s];
+ break;
+ }
+ Weapon_SecondaryAttack( getstatf( STAT_ACTIVEWEAPON ) );
} else if ( fHeader == EV_WEAPON_RELOAD ) {
fWeaponEventPlayer = readbyte();
+ for (s = 0; s < numclientseats; s++) //lame loop
+ if (seats[s].ePlayer.entnum == fWeaponEventPlayer) {
+ setproperty(VF_ACTIVESEAT, (float)s);
+ pSeat = &seats[s];
+ break;
+ }
Weapon_Reload( getstatf( STAT_ACTIVEWEAPON ) );
} else if ( fHeader == EV_MODELGIB ) {
vector vPos;
@@ -446,15 +476,15 @@ void CSQC_Parse_Event( void ) {
float fStyle = readbyte();
Effect_BreakModel( vPos, vSize, '0 0 0', fStyle );
} else if ( fHeader == EV_CAMERATRIGGER ) {
- vCameraPos_x = readcoord();
- vCameraPos_y = readcoord();
- vCameraPos_z = readcoord();
+ pSeat->vCameraPos.x = readcoord();
+ pSeat->vCameraPos.y = readcoord();
+ pSeat->vCameraPos.z = readcoord();
- vCameraAngle_x = readcoord();
- vCameraAngle_y = readcoord();
- vCameraAngle_z = readcoord();
+ pSeat->vCameraAngle.x = readcoord();
+ pSeat->vCameraAngle.y = readcoord();
+ pSeat->vCameraAngle.z = readcoord();
- fCameraTime = time + readfloat();
+ pSeat->fCameraTime = time + readfloat();
} else if ( fHeader == EV_RADIOMSG ) {
Radio_PlayMessage( readbyte() );
} else if ( fHeader == EV_RADIOMSG2 ) {
@@ -504,8 +534,8 @@ void CSQC_Parse_Event( void ) {
Effect_CreateSmoke( vSmokePos );
} else if ( fHeader == EV_FLASH ) {
- fFlashTime = 3.0f;
- fFlashAlpha = 1.0f;
+ pSeat->fFlashTime = 3.0f;
+ pSeat->fFlashAlpha = 1.0f;
} else if ( fHeader == EV_CHAT ) {
float fSender = readbyte();
float fTeam = readbyte();
@@ -580,10 +610,13 @@ Hijacks and controls what input globals are being sent to the server
=================
*/
void CSQC_Input_Frame( void ) {
+ int s = (float)getproperty( VF_ACTIVESEAT );
+ pSeat = &seats[ s ];
+
// If we are inside a VGUI, don't let the client do stuff outside
- if ( ( fVGUI_Display != VGUI_NONE ) ) {
+ if ( ( pSeat->fVGUI_Display != VGUI_NONE ) ) {
fInputSendNext = time + 0.2;
- } else if ( ( fHUDWeaponSelected ) && ( input_buttons & INPUT_BUTTON0 ) ) {
+ } else if ( ( pSeat->fHUDWeaponSelected ) && ( input_buttons & INPUT_BUTTON0 ) ) {
HUD_DrawWeaponSelect_Trigger();
input_buttons = 0;
fInputSendNext = time + 0.2;
@@ -611,5 +644,5 @@ void CSQC_Input_Frame( void ) {
input_buttons |= INPUT_BUTTON6;
}
- input_angles += vPunchAngle;
+ input_angles += pSeat->vPunchAngle;
}
diff --git a/Source/Client/HUD.c b/Source/Client/HUD.c
index 6c057f43..e36c444b 100755
--- a/Source/Client/HUD.c
+++ b/Source/Client/HUD.c
@@ -111,7 +111,7 @@ void HUD_DrawHealth( void ) {
fHealthAlpha = HUD_ALPHA;
}
- vector vHealthPos = [ 16, vVideoResolution_y - 42 ];
+ vector vHealthPos = vVideoMins + [ 16, vVideoResolution_y - 42 ];
drawsubpic( vHealthPos, '24 24 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 2, NUMSIZE_Y], [ NUMSIZE_X, NUMSIZE_X ], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE );
HUD_DrawNums( getstatf( STAT_HEALTH ), vHealthPos + '72 0', HUD_ALPHA, vHUDColor );
fOldHealth = getstatf( STAT_HEALTH );
@@ -137,7 +137,7 @@ void HUD_DrawArmor( void ) {
fArmorAlpha = HUD_ALPHA;
}
- vector vArmorPos = [ 128, vVideoResolution_y - 42 ];
+ vector vArmorPos = vVideoMins + [ 128, vVideoResolution_y - 42 ];
drawsubpic( vArmorPos, '24 24 0', HUD_NUMFILE_LAYER, [ 0, NUMSIZE_Y], [ NUMSIZE_X, NUMSIZE_X ], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE );
HUD_DrawNums( getstatf( STAT_ARMOR ), vArmorPos + '72 0', fArmorAlpha, vHUDColor);
fOldArmor = getstatf( STAT_ARMOR );
@@ -153,19 +153,19 @@ Draw icons such as hostage, bomb and buyzones
void HUD_DrawIcons( void ) {
// BuyZone Icon
if( getstatf( STAT_BUYZONE ) == TRUE ) {
- vector vBuyIconPos = [ 16, ( vVideoResolution_y / 2 ) - 12 ];
+ vector vBuyIconPos = vVideoMins + [ 16, ( vVideoResolution_y / 2 ) - 12 ];
drawsubpic( vBuyIconPos, '32 32 0', HUD_NUMFILE_LAYER, [ 0.125 * 3, 0.125 * 5 - 0.046875], [ 0.125, 0.125 ], '0 1 0', 1, DRAWFLAG_ADDITIVE );
}
-
+
// Hostage-Rescue Area Icon
if( getstatf( STAT_HOSTAGEZONE ) == TRUE ) {
- vector vRIconPos = [ 16, ( vVideoResolution_y / 2 ) + 24 ];
+ vector vRIconPos = vVideoMins + [ 16, ( vVideoResolution_y / 2 ) + 24 ];
drawsubpic( vRIconPos, '32 32 0', HUD_NUMFILE_LAYER, [ 0.125 * 2, 0.125 * 5 - 0.046875], [ 0.125, 0.125 ], '0 1 0', 1, DRAWFLAG_ADDITIVE );
}
-
+
// Bomb-Area
if( getstatf( STAT_BOMBZONE ) == TRUE ) {
- vector vBIconPos = [ 16, ( vVideoResolution_y / 2 ) + 24 ];
+ vector vBIconPos = vVideoMins + [ 16, ( vVideoResolution_y / 2 ) + 24 ];
if ( getstatf( STAT_ACTIVEWEAPON ) == WEAPON_C4BOMB ) {
float fAlpha = fabs( sin( time * 20 ) );
@@ -188,8 +188,8 @@ void HUD_DrawTimer( void ) {
static int iOldUnits;
static float fTimerAlpha;
int iMinutes, iSeconds, iTens, iUnits;
- vector vTimePos = [ ( vVideoResolution_x / 2 ) - 62, vVideoResolution_y - 42 ];
-
+ vector vTimePos = vVideoMins+[ ( vVideoResolution_x / 2 ) - 62, vVideoResolution_y - 42 ];
+
if( serverkey( "timelimit" ) ) {
float fTimeLeft = ( stof( serverkey( "timelimit" ) ) * 60 ) - getstatf( STAT_GAMETIME );
if ( fTimeLeft < 0 ) {
@@ -292,7 +292,7 @@ void HUD_DrawMoney( void ) {
fMoneyDifference = fOldMoneyValue - getstatf( STAT_MONEY );
}
- vector vMoneyPos = [ vVideoResolution_x - 160, vVideoResolution_y - 72 ];
+ vector vMoneyPos = vVideoMins+[ vVideoResolution_x - 160, vVideoResolution_y - 72 ];
// If the alpha/color effect is active, draw the money twice in their varying alphas/colors
if ( fMoneyAlphaEffect > 0 ) {
@@ -353,20 +353,20 @@ void HUD_DrawAmmo( void ) {
}
if ( wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iCaliber < 11 ) {
- vAmmoMagPos = [ vVideoResolution_x - 142, vVideoResolution_y - 42 ];
+ vAmmoMagPos = vVideoMins+[ vVideoResolution_x - 142, vVideoResolution_y - 42 ];
HUD_DrawNums( getstatf( STAT_CURRENT_MAG ), vAmmoMagPos, fAmmoAlpha, vHUDColor );
- drawsubpic( [vVideoResolution_x - 118, vVideoResolution_y - 42], '3 25', HUD_NUMFILE_LAYER, [0.9375, 0], [ 0.01171875, 0.09765625 ], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE );
+ drawsubpic( vVideoMins+[vVideoResolution_x - 118, vVideoResolution_y - 42], '3 25', HUD_NUMFILE_LAYER, [0.9375, 0], [ 0.01171875, 0.09765625 ], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE );
- vAmmoCalPos = [ vVideoResolution_x - 64, vVideoResolution_y - 42 ];
+ vAmmoCalPos = vVideoMins+[ vVideoResolution_x - 64, vVideoResolution_y - 42 ];
HUD_DrawNums( getstatf( STAT_CURRENT_CALIBER ), vAmmoCalPos, fAmmoAlpha, vHUDColor );
} else {
- vAmmoMagPos = [ vVideoResolution_x - 64, vVideoResolution_y - 42 ];
+ vAmmoMagPos = vVideoMins+[ vVideoResolution_x - 64, vVideoResolution_y - 42 ];
HUD_DrawNums( getstatf( STAT_CURRENT_MAG ), vAmmoMagPos, fAmmoAlpha, vHUDColor );
}
// Caliber icon
- drawsubpic( vVideoResolution - '42 42', '24 24', HUD_NUMFILE_LAYER, vHUDCalPos[ wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iCaliber ], [ NUMSIZE_X, NUMSIZE_X ], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE );
+ drawsubpic( vVideoMins+vVideoResolution - '42 42', '24 24', HUD_NUMFILE_LAYER, vHUDCalPos[ wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iCaliber ], [ NUMSIZE_X, NUMSIZE_X ], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE );
fOldMag = getstatf( STAT_CURRENT_MAG );
fOldCal = getstatf( STAT_CURRENT_CALIBER );
}
@@ -376,8 +376,9 @@ void HUD_DrawProgressBar( void ) {
vector vMainPos;
if ( getstatf( STAT_PROGRESS ) > 0 ) {
- vMainPos_x = ( vVideoResolution_x / 2 ) - (vSize_x / 2);
- vMainPos_y = ( vVideoResolution_y / 2 ) - (vSize_y / 2);
+ vMainPos = vVideoMins;
+ vMainPos_x += ( vVideoResolution_x / 2 ) - (vSize_x / 2);
+ vMainPos_y += ( vVideoResolution_y / 2 ) - (vSize_y / 2);
// Draw the background
vector vBar = vSize;
@@ -395,21 +396,21 @@ void HUD_DrawProgressBar( void ) {
void HUD_DrawRadar( void ) {
- drawpic( '16 16', "sprites/radar640.spr_0.tga", '128 128', '1 1 1', 0.5, DRAWFLAG_ADDITIVE );
+ drawpic( vVideoMins + '16 16', "sprites/radar640.spr_0.tga", '128 128', '1 1 1', 0.5, DRAWFLAG_ADDITIVE );
}
void HUD_DrawFlash( void ) {
- if ( fFlashTime > 0.0f ) {
- fFlashTime -= frametime;
+ if ( pSeat->fFlashTime > 0.0f ) {
+ pSeat->fFlashTime -= frametime;
} else {
- if ( fFlashAlpha > 0.0f ) {
- fFlashAlpha -= ( frametime * 0.5 );
+ if ( pSeat->fFlashAlpha > 0.0f ) {
+ pSeat->fFlashAlpha -= ( frametime * 0.5 );
} else {
return;
}
}
- drawfill( '0 0', vVideoResolution, '1 1 1', fFlashAlpha, fFlashTime );
+ drawfill( vVideoMins, vVideoResolution, '1 1 1', pSeat->fFlashAlpha, 0/*pSeat->fFlashTime*/ );
}
/*
diff --git a/Source/Client/HUDCrosshair.c b/Source/Client/HUDCrosshair.c
index d195a153..11d6cc34 100755
--- a/Source/Client/HUDCrosshair.c
+++ b/Source/Client/HUDCrosshair.c
@@ -25,11 +25,7 @@ HUD_DrawCrosshair
Draws the cursor every frame, unless spectator
=================
*/
-void HUD_DrawCrosshair( void ) {
- static int iOldShotMultiplier;
- static float fCrosshairDistance;
- static float fDecreaseShotTime;
-
+void HUD_DrawCrosshair( void ) {
int iCrosshairDistance;
int iLineLength;
@@ -47,48 +43,49 @@ void HUD_DrawCrosshair( void ) {
fDistance = fDistance * 2;
} else if ( getstatf( STAT_FLAGS ) & FL_CROUCHING ) { // Crouching...
fDistance = fDistance * 0.5;
- } else if ( vlen( pmove_vel ) > 120 ) { // Running, not walking
+ } else if ( vlen( pSeat->ePlayer.velocity ) > 120 ) { // Running, not walking
fDistance = fDistance * 1.5;
}
// The amount of shots that we've shot totally does affect our accuracy!
- if ( iShotMultiplier > iOldShotMultiplier ) {
- fCrosshairDistance = min( 15, fCrosshairDistance + fDeltaDistance );
- } else if ( fCrosshairDistance > fDistance ) {
+ if ( pSeat->iShotMultiplier > pSeat->iOldShotMultiplier ) {
+ pSeat->fCrosshairDistance = min( 15, pSeat->fCrosshairDistance + fDeltaDistance );
+ } else if ( pSeat->fCrosshairDistance > fDistance ) {
// Slowly decrease the distance again
- fCrosshairDistance -= ( fCrosshairDistance * frametime );
+ pSeat->fCrosshairDistance -= ( pSeat->fCrosshairDistance * frametime );
- if ( ( iShotMultiplier > 0 ) && ( fDecreaseShotTime < time ) ) {
- fDecreaseShotTime = time + 0.2;
- iShotMultiplier--;
+ if ( ( pSeat->iShotMultiplier > 0 ) && ( pSeat->fDecreaseShotTime < time ) ) {
+ pSeat->fDecreaseShotTime = time + 0.2;
+ pSeat->iShotMultiplier--;
}
}
- iOldShotMultiplier = iShotMultiplier;
+ pSeat->iOldShotMultiplier = pSeat->iShotMultiplier;
- if ( fCrosshairDistance < fDistance ) {
- fCrosshairDistance = fDistance;
+ if ( pSeat->fCrosshairDistance < fDistance ) {
+ pSeat->fCrosshairDistance = fDistance;
}
- iCrosshairDistance = ceil( fCrosshairDistance );
+ iCrosshairDistance = ceil( pSeat->fCrosshairDistance );
iLineLength = ( ( iCrosshairDistance - fDistance ) / 2 ) + 5;
iLineLength = max( 1, iLineLength );
// Line positions
vector vVer1, vVer2, vHor1, vHor2;
+ vVer1 = vVer2 = vHor1 = vHor2 = vVideoMins;
// Vertical Lines
- vVer1_x = ( vVideoResolution_x / 2 );
- vVer1_y = ( vVideoResolution_y / 2 ) - ( iCrosshairDistance + iLineLength );
- vVer2_x = ( vVideoResolution_x / 2 );
- vVer2_y = ( vVideoResolution_y / 2 ) + iCrosshairDistance + 1;
+ vVer1_x += ( vVideoResolution_x / 2 );
+ vVer1_y += ( vVideoResolution_y / 2 ) - ( iCrosshairDistance + iLineLength );
+ vVer2_x += ( vVideoResolution_x / 2 );
+ vVer2_y += ( vVideoResolution_y / 2 ) + iCrosshairDistance + 1;
// Horizontal Lines
- vHor1_x = ( vVideoResolution_x / 2 ) - ( iCrosshairDistance + iLineLength );
- vHor1_y = ( vVideoResolution_y / 2 );
- vHor2_x = ( vVideoResolution_x / 2 ) + iCrosshairDistance + 1;
- vHor2_y = ( vVideoResolution_y / 2 );
+ vHor1_x += ( vVideoResolution_x / 2 ) - ( iCrosshairDistance + iLineLength );
+ vHor1_y += ( vVideoResolution_y / 2 );
+ vHor2_x += ( vVideoResolution_x / 2 ) + iCrosshairDistance + 1;
+ vHor2_y += ( vVideoResolution_y / 2 );
drawfill( vVer1, [ 1, iLineLength ], vCrossColor, 1, DRAWFLAG_ADDITIVE );
drawfill( vVer2, [ 1, iLineLength ], vCrossColor, 1, DRAWFLAG_ADDITIVE );
diff --git a/Source/Client/HUDOrbituaries.c b/Source/Client/HUDOrbituaries.c
index 1a7b0dc4..894c95ec 100755
--- a/Source/Client/HUDOrbituaries.c
+++ b/Source/Client/HUDOrbituaries.c
@@ -84,7 +84,7 @@ This actually displays the contents of orbBuffer
=================
*/
void HUD_DrawOrbituaries( void ) {
- vector vOrbPos = [ vVideoResolution_x - 200, 56 ];
+ vector vOrbPos = vVideoMins + [ vVideoResolution_x - 200, 56 ];
if ( fOrbituaryTime < time && iOrbituaryScroll >= 0 ) {
// We are cheap, just clear the attacker and we're good.
@@ -99,7 +99,7 @@ void HUD_DrawOrbituaries( void ) {
}
// Calculate the position based on the saved offsets
- vOrbPos_x = vVideoResolution_x - ( orbBuffer[ i ].fOffset1 + orbBuffer[ i ].fOffset2 + orbBuffer[ i ].fOffset3 ) - 16;
+ vOrbPos_x = vVideoMins_x + vVideoResolution_x - ( orbBuffer[ i ].fOffset1 + orbBuffer[ i ].fOffset2 + orbBuffer[ i ].fOffset3 ) - 16;
// Draw the attacker's name, shadow first
drawstring( vOrbPos + '1 1', orbBuffer[ i ].sAttacker, '8 8', '0 0 0', VGUI_WINDOW_FGALPHA, 0 );
diff --git a/Source/Client/HUDWeaponSelect.c b/Source/Client/HUDWeaponSelect.c
index 81d43331..b1567120 100755
--- a/Source/Client/HUDWeaponSelect.c
+++ b/Source/Client/HUDWeaponSelect.c
@@ -18,10 +18,6 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-// We can only carry one item per slot, so this is hacking around the last one
-int iHUDGrenades;
-int iHUDGrenadesSelected;
-
typedef struct {
string sSprite;
vector vOrigin;
@@ -65,9 +61,6 @@ vector vHUDSlotNumPos[ 4 ] = {
'0.65625 0.359375 0', // 4 GRENADE
};
-float fHUDWeaponSelectTime;
-float fHUDWeaponSelected;
-
/*
=================
HUD_DrawWeaponSelect_NextItem
@@ -90,59 +83,59 @@ float HUD_DrawWeaponSelect_NextItem( float fSlot ) {
}
} else if ( fSlot == SLOT_MELEE ) {
// This happens when we go into the slot for the first time
- iHUDGrenades = 0;
+ pSeat->iHUDGrenades = 0;
// Keep this order in order for the selection to work
if ( getstatf( STAT_SLOT_GRENADE ) ) {
- iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
- iHUDGrenades++;
+ pSeat->iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
+ pSeat->iHUDGrenades++;
}
if ( getstati_punf( STAT_ITEM_SMOKEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
- iHUDGrenades++;
+ pSeat->iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
+ pSeat->iHUDGrenades++;
}
if ( getstati_punf( STAT_ITEM_FLASHBANG ) ) {
- iHUDGrenadesSelected = WEAPON_FLASHBANG;
- iHUDGrenades++;
+ pSeat->iHUDGrenadesSelected = WEAPON_FLASHBANG;
+ pSeat->iHUDGrenades++;
}
if ( getstati_punf( STAT_ITEM_HEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_HEGRENADE;
- iHUDGrenades++;
+ pSeat->iHUDGrenadesSelected = WEAPON_HEGRENADE;
+ pSeat->iHUDGrenades++;
}
// If we have any grenades, proceed with that slot
- if ( iHUDGrenades ) {
+ if ( pSeat->iHUDGrenades ) {
return SLOT_GRENADE;
} else {
return HUD_DrawWeaponSelect_NextItem( SLOT_GRENADE );
}
} else {
// If we're in the grenade slot, go down
- if ( iHUDGrenadesSelected == WEAPON_HEGRENADE ) {
+ if ( pSeat->iHUDGrenadesSelected == WEAPON_HEGRENADE ) {
// Do we have a flash bang? If yes, select that thing
if ( getstati_punf( STAT_ITEM_FLASHBANG ) ) {
- iHUDGrenadesSelected = WEAPON_FLASHBANG;
+ pSeat->iHUDGrenadesSelected = WEAPON_FLASHBANG;
return SLOT_GRENADE;
} else if ( getstati_punf( STAT_ITEM_SMOKEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
+ pSeat->iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
return SLOT_GRENADE;
} else if ( getstatf( STAT_SLOT_GRENADE ) ) {
- iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
+ pSeat->iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
return SLOT_GRENADE;
}
- } else if ( iHUDGrenadesSelected == WEAPON_FLASHBANG ) {
+ } else if ( pSeat->iHUDGrenadesSelected == WEAPON_FLASHBANG ) {
if ( getstati_punf( STAT_ITEM_SMOKEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
+ pSeat->iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
return SLOT_GRENADE;
} else if ( getstatf( STAT_SLOT_GRENADE ) ) {
- iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
+ pSeat->iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
return SLOT_GRENADE;
}
- } else if ( iHUDGrenadesSelected == WEAPON_SMOKEGRENADE ) {
+ } else if ( pSeat->iHUDGrenadesSelected == WEAPON_SMOKEGRENADE ) {
if ( getstatf( STAT_SLOT_GRENADE ) ) {
- iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
+ pSeat->iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
return SLOT_GRENADE;
}
}
@@ -164,27 +157,27 @@ Checks and returns the previous slot with a weapon in it
*/
float HUD_DrawWeaponSelect_PreviousItem( float fSlot ) {
if ( fSlot == SLOT_PRIMARY ) {
- iHUDGrenades = 0;
+ pSeat->iHUDGrenades = 0;
// Keep this order in order for the selection to work
if ( getstati_punf( STAT_ITEM_HEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_HEGRENADE;
- iHUDGrenades++;
+ pSeat->iHUDGrenadesSelected = WEAPON_HEGRENADE;
+ pSeat->iHUDGrenades++;
}
if ( getstati_punf( STAT_ITEM_FLASHBANG ) ) {
- iHUDGrenadesSelected = WEAPON_FLASHBANG;
- iHUDGrenades++;
+ pSeat->iHUDGrenadesSelected = WEAPON_FLASHBANG;
+ pSeat->iHUDGrenades++;
}
if ( getstati_punf( STAT_ITEM_SMOKEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
- iHUDGrenades++;
+ pSeat->iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
+ pSeat->iHUDGrenades++;
}
if ( getstatf( STAT_SLOT_GRENADE ) ) {
- iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
- iHUDGrenades++;
+ pSeat->iHUDGrenadesSelected = getstatf( STAT_SLOT_GRENADE );
+ pSeat->iHUDGrenades++;
}
- if ( iHUDGrenades ) {
+ if ( pSeat->iHUDGrenades ) {
return SLOT_GRENADE;
} else {
return HUD_DrawWeaponSelect_PreviousItem( SLOT_GRENADE );
@@ -202,29 +195,29 @@ float HUD_DrawWeaponSelect_PreviousItem( float fSlot ) {
return HUD_DrawWeaponSelect_PreviousItem( SLOT_SECONDARY );
}
} else {
- if ( iHUDGrenadesSelected == getstatf( STAT_SLOT_GRENADE ) ) {
+ if ( pSeat->iHUDGrenadesSelected == getstatf( STAT_SLOT_GRENADE ) ) {
if ( getstati_punf( STAT_ITEM_SMOKEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
+ pSeat->iHUDGrenadesSelected = WEAPON_SMOKEGRENADE;
return SLOT_GRENADE;
} else if ( getstati_punf( STAT_ITEM_FLASHBANG ) ) {
- iHUDGrenadesSelected = WEAPON_FLASHBANG;
+ pSeat->iHUDGrenadesSelected = WEAPON_FLASHBANG;
return SLOT_GRENADE;
} else if ( getstati_punf( STAT_ITEM_HEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_HEGRENADE;
+ pSeat->iHUDGrenadesSelected = WEAPON_HEGRENADE;
return SLOT_GRENADE;
}
}
- if ( iHUDGrenadesSelected == WEAPON_SMOKEGRENADE ) {
+ if ( pSeat->iHUDGrenadesSelected == WEAPON_SMOKEGRENADE ) {
if ( getstati_punf( STAT_ITEM_FLASHBANG ) ) {
- iHUDGrenadesSelected = WEAPON_FLASHBANG;
+ pSeat->iHUDGrenadesSelected = WEAPON_FLASHBANG;
return SLOT_GRENADE;
} else if ( getstati_punf( STAT_ITEM_HEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_HEGRENADE;
+ pSeat->iHUDGrenadesSelected = WEAPON_HEGRENADE;
return SLOT_GRENADE;
}
- } else if ( iHUDGrenadesSelected == WEAPON_FLASHBANG ) {
+ } else if ( pSeat->iHUDGrenadesSelected == WEAPON_FLASHBANG ) {
if ( getstati_punf( STAT_ITEM_HEGRENADE ) ) {
- iHUDGrenadesSelected = WEAPON_HEGRENADE;
+ pSeat->iHUDGrenadesSelected = WEAPON_HEGRENADE;
return SLOT_GRENADE;
}
}
@@ -251,7 +244,7 @@ float HUD_DrawWeaponSelect_GetWeapon( float fSlot ) {
} else if ( fSlot == SLOT_MELEE ) {
return getstatf( STAT_SLOT_MELEE );
} else {
- return iHUDGrenadesSelected;
+ return pSeat->iHUDGrenadesSelected;
}
}
@@ -267,15 +260,15 @@ void HUD_DrawWeaponSelect_Forward( void ) {
return;
}
- if ( fHUDWeaponSelected == 0 ) {
+ if ( pSeat->fHUDWeaponSelected == 0 ) {
sound( self, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE );
- fHUDWeaponSelected = HUD_DrawWeaponSelect_GetWeapon( HUD_DrawWeaponSelect_NextItem( wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iSlot ) );
+ pSeat->fHUDWeaponSelected = HUD_DrawWeaponSelect_GetWeapon( HUD_DrawWeaponSelect_NextItem( wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iSlot ) );
} else {
sound( self, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE );
- fHUDWeaponSelected = HUD_DrawWeaponSelect_GetWeapon( HUD_DrawWeaponSelect_NextItem( wptTable[ fHUDWeaponSelected ].iSlot ) );
+ pSeat->fHUDWeaponSelected = HUD_DrawWeaponSelect_GetWeapon( HUD_DrawWeaponSelect_NextItem( wptTable[ pSeat->fHUDWeaponSelected ].iSlot ) );
}
- fHUDWeaponSelectTime = time + 3;
+ pSeat->fHUDWeaponSelectTime = time + 3;
}
/*
@@ -290,15 +283,15 @@ void HUD_DrawWeaponSelect_Back( void ) {
return;
}
- if ( fHUDWeaponSelected == 0 ) {
+ if ( pSeat->fHUDWeaponSelected == 0 ) {
sound( self, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE );
- fHUDWeaponSelected = HUD_DrawWeaponSelect_GetWeapon( HUD_DrawWeaponSelect_PreviousItem( wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iSlot ) );
+ pSeat->fHUDWeaponSelected = HUD_DrawWeaponSelect_GetWeapon( HUD_DrawWeaponSelect_PreviousItem( wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iSlot ) );
} else {
sound( self, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE );
- fHUDWeaponSelected = HUD_DrawWeaponSelect_GetWeapon( HUD_DrawWeaponSelect_PreviousItem( wptTable[ fHUDWeaponSelected ].iSlot ) );
+ pSeat->fHUDWeaponSelected = HUD_DrawWeaponSelect_GetWeapon( HUD_DrawWeaponSelect_PreviousItem( wptTable[ pSeat->fHUDWeaponSelected ].iSlot ) );
}
- fHUDWeaponSelectTime = time + 3;
+ pSeat->fHUDWeaponSelectTime = time + 3;
}
/*
@@ -320,54 +313,54 @@ Drawn every frame through HUD.c
=================
*/
void HUD_DrawWeaponSelect( void ) {
- if ( fHUDWeaponSelectTime < time ) {
- if ( fHUDWeaponSelected ) {
+ if ( pSeat->fHUDWeaponSelectTime < time ) {
+ if ( pSeat->fHUDWeaponSelected ) {
sound( self, CHAN_ITEM, "common/wpn_hudoff.wav", 0.5, ATTN_NONE );
- fHUDWeaponSelected = 0;
+ pSeat->fHUDWeaponSelected = 0;
}
return;
}
- vector vSelectPos = '160 12 0';
+ vector vSelectPos = vVideoMins + '160 12 0';
for ( int i = 0; i < 4; i++ ) {
HUD_DrawWeaponSelect_Num( vSelectPos, i );
// Again, grenades are treated seperately
if ( i == SLOT_GRENADE ) {
- if ( wptTable[ fHUDWeaponSelected ].iSlot == SLOT_GRENADE ) {
+ if ( wptTable[ pSeat->fHUDWeaponSelected ].iSlot == SLOT_GRENADE ) {
if ( getstati_punf( STAT_ITEM_HEGRENADE ) ) {
drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ WEAPON_HEGRENADE ].sSprite, wpSymbolTable[ WEAPON_HEGRENADE ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
- if ( iHUDGrenadesSelected == WEAPON_HEGRENADE ) {
+ if ( pSeat->iHUDGrenadesSelected == WEAPON_HEGRENADE ) {
drawsubpic( vSelectPos + '0 20', '170 45', "sprites/640hud3.spr_0.tga", '0 0.703125', [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
}
vSelectPos_y += 45;
}
if ( getstati_punf( STAT_ITEM_FLASHBANG ) ) {
drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ WEAPON_FLASHBANG ].sSprite, wpSymbolTable[ WEAPON_FLASHBANG ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
- if ( iHUDGrenadesSelected == WEAPON_FLASHBANG ) {
+ if ( pSeat->iHUDGrenadesSelected == WEAPON_FLASHBANG ) {
drawsubpic( vSelectPos + '0 20', '170 45', "sprites/640hud3.spr_0.tga", '0 0.703125', [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
}
vSelectPos_y += 45;
}
if ( getstati_punf( STAT_ITEM_SMOKEGRENADE ) ) {
drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ WEAPON_SMOKEGRENADE ].sSprite, wpSymbolTable[ WEAPON_SMOKEGRENADE ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
- if ( iHUDGrenadesSelected == WEAPON_SMOKEGRENADE ) {
+ if ( pSeat->iHUDGrenadesSelected == WEAPON_SMOKEGRENADE ) {
drawsubpic( vSelectPos + '0 20', '170 45', "sprites/640hud3.spr_0.tga", '0 0.703125', [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
}
vSelectPos_y += 45;
}
if ( getstatf( STAT_SLOT_GRENADE ) ) {
drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ getstatf( STAT_SLOT_GRENADE ) ].sSprite, wpSymbolTable[ getstatf( STAT_SLOT_GRENADE ) ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
- if ( iHUDGrenadesSelected == getstatf( STAT_SLOT_GRENADE ) ) {
+ if ( pSeat->iHUDGrenadesSelected == getstatf( STAT_SLOT_GRENADE ) ) {
drawsubpic( vSelectPos + '0 20', '170 45', "sprites/640hud3.spr_0.tga", '0 0.703125', [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
}
vSelectPos_y += 45;
}
}
} else {
- if ( wptTable[ fHUDWeaponSelected ].iSlot == i ) {
- drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ fHUDWeaponSelected ].sSprite, wpSymbolTable[ fHUDWeaponSelected ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
+ if ( wptTable[ pSeat->fHUDWeaponSelected ].iSlot == i ) {
+ drawsubpic( vSelectPos + '0 20', '170 45', wpSymbolTable[ pSeat->fHUDWeaponSelected ].sSprite, wpSymbolTable[ pSeat->fHUDWeaponSelected ].vOrigin, [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
drawsubpic( vSelectPos + '0 20', '170 45', "sprites/640hud3.spr_0.tga", '0 0.703125', [ 0.6640625, 0.17578125 ], vHUDColor, 1, DRAWFLAG_ADDITIVE );
vSelectPos_x += 170;
} else {
@@ -385,8 +378,8 @@ Called by CSQC_Input_Frame when conditions are met
=================
*/
void HUD_DrawWeaponSelect_Trigger( void ) {
- sendevent( "PlayerSwitchWeapon", "f", fHUDWeaponSelected );
+ sendevent( "PlayerSwitchWeapon", "f", pSeat->fHUDWeaponSelected );
sound( self, CHAN_ITEM, "common/wpn_select.wav", 0.5, ATTN_NONE );
- fHUDWeaponSelectTime = 0;
- fHUDWeaponSelected = 0;
+ pSeat->fHUDWeaponSelectTime = 0;
+ pSeat->fHUDWeaponSelected = 0;
}
diff --git a/Source/Client/Init.c b/Source/Client/Init.c
index 66ca2135..83ad95de 100755
--- a/Source/Client/Init.c
+++ b/Source/Client/Init.c
@@ -26,6 +26,7 @@ Comparable to worldspawn in SSQC in that it's mostly used for precaches
=================
*/
void CSQC_Init(float apilevel, string enginename, float engineversion) {
+ pSeat = &seats[0];
precache_model( HUD_NUMFILE );
precache_model( "sprites/top_left.spr" );
diff --git a/Source/Client/Makefile b/Source/Client/Makefile
old mode 100644
new mode 100755
diff --git a/Source/Client/Player.c b/Source/Client/Player.c
index 3f4ce5a7..877a628a 100755
--- a/Source/Client/Player.c
+++ b/Source/Client/Player.c
@@ -18,6 +18,13 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+.float pmove_frame;
+
+.vector netorigin;
+.vector netangles;
+.vector netvelocity;
+.float netpmove_flags;
+
string sPModels[ CS_WEAPON_COUNT - 1 ] = {
"models/p_knife.mdl",
"models/p_usp.mdl",
@@ -48,24 +55,45 @@ string sPModels[ CS_WEAPON_COUNT - 1 ] = {
"models/p_smokegrenade.mdl"
};
+//.float bonecontrol1; //Halflife model format bone controller. On player models, this typically affects the spine's yaw.
+//.float bonecontrol2; //Halflife model format bone controller. On player models, this typically affects the spine's yaw.
+//.float bonecontrol3; //Halflife model format bone controller. On player models, this typically affects the spine's yaw.
+//.float bonecontrol4; //Halflife model format bone controller. On player models, this typically affects the spine's yaw.
+//.float bonecontrol5; //Halflife model format bone controller. This typically affects the mouth.
+//.float subblendfrac; //Weird animation value specific to halflife models. On player models, this typically affects the spine's pitch.
+//.float basesubblendfrac; // legs part.
+
+static float Player_Gun_PreDraw (void) {
+ self.entnum = self.owner.entnum; //so this entity gets its RF_EXTERNALMODEL flag rewritten as needed
+ addentity(self);
+ self.entnum = 0; //so that findfloat won't find the wrong thing.
+ return PREDRAW_NEXT;
+}
+
void Player_Draw( void ) {
if ( !self.eGunModel ) {
self.eGunModel = spawn();
+ self.eGunModel.classname = "vwep model";
+ self.eGunModel.owner = self;
+ self.eGunModel.predraw = Player_Gun_PreDraw;
self.eGunModel.drawmask = MASK_ENGINE;
-
- // Get the weapon bone ID for the current player model
- self.fWeaponBoneID = gettagindex( self, "Bip01 R Hand" );
}
// Only bother updating the model if the weapon has changed
if ( self.fWeaponLast != self.weapon ) {
- setmodel( self.eGunModel, sPModels[ self.weapon - 1 ] );
+ if ( self.weapon ) {
+ setmodel( self.eGunModel, sPModels[ self.weapon - 1 ] );
+ } else {
+ setmodel( self.eGunModel, "" );
+ }
self.fWeaponLast = self.weapon;
// Update the bone index of the current p_ model so we can calculate the offset
+ // Get the weapon bone ID for the current player model
+ self.fWeaponBoneID = gettagindex( self, "Bip01 R Hand" );
self.eGunModel.fWeaponBoneID = gettagindex( self.eGunModel, "Bip01 R Hand" );
}
-
+
Animation_PlayerUpdate();
self.baseframe1time += frametime;
self.frame1time += frametime;
@@ -78,85 +106,111 @@ void Player_Draw( void ) {
=================
Player_PreDraw
-Run every before every frame is rendered.
-Responsible for local player prediction and other player appearance/interpolation.
+Runs as part of the addentities builtin.
+Responsible for player appearance/interpolation.
=================
*/
float Player_PreDraw( void ) {
- if ( self.entnum == player_localentnum ) {
- vector vOldOrigin;
- vector vOldVelocity;
- float fOldPMoveFlags;
- // Don't predict if we're frozen/paused FIXME: FTE doesn't have serverkey_float yet!
- if ( serverkey( SERVERKEY_PAUSESTATE ) == "1" || ( ( getstati( STAT_GAMESTATE ) == GAME_FREEZE ) && ( getstati( STAT_HEALTH ) > 0 ) ) ) {
- vPlayerOrigin = self.origin;
- vOldOrigin = vPlayerOrigin;
-
- self.velocity = '0 0 0';
- vOldVelocity = self.velocity;
- fOldPMoveFlags = 0;
- } else {
- vOldOrigin = self.origin;
- vOldVelocity = self.velocity;
- fOldPMoveFlags = self.pmove_flags;
-
- if ( getplayerkeyvalue( player_localnum, "*spec" ) == "0" ) {
- self.movetype = MOVETYPE_WALK;
- } else {
- self.movetype = MOVETYPE_NOCLIP;
- }
-
- for ( int i = servercommandframe + 1; i <= clientcommandframe; i++ ) {
- getinputstate( i );
- runstandardplayerphysics( self );
- }
- }
- vPlayerOriginOld = vPlayerOrigin;
-
- if ( ( self.flags & FL_ONGROUND ) && ( self.origin_z - vPlayerOriginOld_z > 0 ) ) {
- vPlayerOriginOld_z += frametime * 150;
-
- if ( vPlayerOriginOld_z > self.origin_z ) {
- vPlayerOriginOld_z = self.origin_z;
- }
- if ( self.origin_z - vPlayerOriginOld_z > 18 ) {
- vPlayerOriginOld_z = self.origin_z - 18;
- }
- vPlayerOrigin_z += vPlayerOriginOld_z - self.origin_z;
- } else {
- vPlayerOriginOld_z = self.origin_z;
- }
-
- vPlayerVelocity = self.velocity;
-
- if ( autocvar_cl_thirdperson == TRUE && getstatf( STAT_HEALTH ) > 0 ) {
- static vector vStart;
- static vector vEnd;
-
- makevectors( view_angles );
- vStart = [ self.origin_x, self.origin_y, vPlayerOriginOld_z + 8 ] + ( v_right * 4 );
- vEnd = vStart + ( v_forward * -48 ) + '0 0 8' + ( v_right * 4 );
- traceline( vStart, vEnd, FALSE, self );
- vPlayerOrigin = trace_endpos + ( v_forward * 5 );
- self.renderflags = 0;
- Player_Draw();
- } else {
- if ( self.eGunModel ) {
- remove( self.eGunModel );
- }
- self.renderflags = RF_EXTERNALMODEL;
- vPlayerOrigin = [ self.origin_x, self.origin_y, vPlayerOriginOld_z ];
- }
- addentity( self );
-
- self.origin = vOldOrigin;
- setorigin( self, self.origin );
- self.velocity = vOldVelocity;
- self.pmove_flags = fOldPMoveFlags;
- self.movetype = MOVETYPE_NONE;
- } else {
- Player_Draw();
- addentity( self );
- }
- return PREDRAW_NEXT;
+ Player_Draw();
+ addentity( self );
+ return PREDRAW_NEXT;
}
+
+/*
+=================
+Player_Predict
+
+Runs before every frame is rendered.
+Responsible for local player prediction.
+=================
+*/
+void Player_Predict(void) {
+ vector vOldOrigin = self.origin = self.netorigin;
+ vector vOldAngles = self.angles = self.netangles;
+ vector vOldVelocity = self.velocity = self.netvelocity;
+ float fOldPMoveFlags = self.pmove_flags = self.netpmove_flags;
+ // Don't predict if we're frozen/paused FIXME: FTE doesn't have serverkey_float yet!
+ if ( serverkey( SERVERKEY_PAUSESTATE ) == "1" || ( ( getstati( STAT_GAMESTATE ) == GAME_FREEZE ) && ( getstati( STAT_HEALTH ) > 0 ) ) ) {
+ pSeat->vPlayerOrigin = self.origin;
+ vOldOrigin = pSeat->vPlayerOrigin;
+
+ self.velocity = '0 0 0';
+ vOldVelocity = self.velocity;
+ fOldPMoveFlags = 0;
+ } else {
+ if ( getplayerkeyvalue( player_localnum, "*spec" ) == "0" ) {
+ self.movetype = MOVETYPE_WALK;
+ } else {
+ self.movetype = MOVETYPE_NOCLIP;
+ }
+
+ for ( int i = self.pmove_frame + 1; i <= clientcommandframe; i++ ) {
+ getinputstate( i );
+ runplayerphysics();
+ }
+ }
+ pSeat->vPlayerOriginOld = pSeat->vPlayerOrigin;
+
+ if ( ( self.flags & FL_ONGROUND ) && ( self.origin_z - pSeat->vPlayerOriginOld.z > 0 ) ) {
+ pSeat->vPlayerOriginOld.z += frametime * 150;
+
+ if ( pSeat->vPlayerOriginOld.z > self.origin_z ) {
+ pSeat->vPlayerOriginOld.z = self.origin_z;
+ }
+ if ( self.origin_z - pSeat->vPlayerOriginOld.z > 18 ) {
+ pSeat->vPlayerOriginOld.z = self.origin_z - 18;
+ }
+ pSeat->vPlayerOrigin.z += pSeat->vPlayerOriginOld.z - self.origin_z;
+ } else {
+ pSeat->vPlayerOriginOld.z = self.origin_z;
+ }
+
+ pSeat->vPlayerVelocity = self.velocity;
+
+ if ( autocvar_cl_thirdperson == TRUE && getstatf( STAT_HEALTH ) > 0 ) {
+ makevectors( view_angles );
+ vector vStart = [ self.origin_x, self.origin_y, pSeat->vPlayerOriginOld.z + 8 ] + ( v_right * 4 );
+ vector vEnd = vStart + ( v_forward * -48 ) + '0 0 8' + ( v_right * 4 );
+ traceline( vStart, vEnd, FALSE, self );
+ pSeat->vPlayerOrigin = trace_endpos + ( v_forward * 5 );
+ } else {
+ pSeat->vPlayerOrigin = [ self.origin_x, self.origin_y, pSeat->vPlayerOriginOld.z ];
+ }
+
+ self.movetype = MOVETYPE_NONE;
+}
+
+/*
+=================
+Player_Preupdate
+
+We're part way through parsing new player data.
+Propagate our pmove state to whatever the current frame before its stomped on (so any non-networked state updates locally).
+=================
+*/
+void Player_PreUpdate(void) {
+ self.origin = self.netorigin;
+ self.angles = self.netangles;
+ self.velocity = self.netvelocity;
+ self.pmove_flags = self.netpmove_flags;
+
+ if ( getplayerkeyvalue( player_localnum, "*spec" ) == "0" ) {
+ self.movetype = MOVETYPE_WALK;
+ } else {
+ self.movetype = MOVETYPE_NOCLIP;
+ }
+
+ for ( ; self.pmove_frame < servercommandframe; ) {
+ if ( getinputstate( ++self.pmove_frame ))
+ runplayerphysics();
+ }
+
+ self.movetype = MOVETYPE_NONE;
+}
+void Player_PostUpdate(void) {
+ self.netorigin = self.origin;
+ self.netangles = self.angles;
+ self.netvelocity = self.velocity;
+ self.netpmove_flags = self.pmove_flags;
+ self.pmove_frame = servercommandframe;
+};
\ No newline at end of file
diff --git a/Source/Client/VGUI.c b/Source/Client/VGUI.c
index a0ed83c3..e8eb9b0b 100755
--- a/Source/Client/VGUI.c
+++ b/Source/Client/VGUI.c
@@ -43,29 +43,30 @@ This is the entry point for FreeCS own "VGUI" implementation
Run every frame
=================
*/
-void CSQC_VGUI_Draw( void ) {
- if ( fVGUI_Display == VGUI_NONE ) {
+float CSQC_VGUI_Draw( void ) {
+ if ( pSeat->fVGUI_Display == VGUI_NONE ) {
setcursormode( FALSE );
- return;
+ return FALSE;
}
vVGUIColor = autocvar_vgui_color * ( 1 / 255 );
- if ( fVGUI_Display >= VGUI_RADIO1 ) {
+ if ( pSeat->fVGUI_Display >= VGUI_RADIO1 ) {
VGUI_Radio_Draw();
- return;
+ return FALSE;
}
-
- setcursormode( TRUE, "gfx/cursor", '0 0 0', 1.0f );
// Align the window to the center
- vVGUIWindowPos_x = ( vVideoResolution_x / 2 ) - 320;
- vVGUIWindowPos_y = ( vVideoResolution_y / 2 ) - 240;
- VGUI_Window( vguiMenus[ fVGUI_Display - 1 ].sTitle, vVGUIWindowPos, '640 480 0' );
+ vVGUIWindowPos = vVideoMins;
+ vVGUIWindowPos_x += ( vVideoResolution_x / 2 ) - 320;
+ vVGUIWindowPos_y += ( vVideoResolution_y / 2 ) - 240;
+ VGUI_Window( vguiMenus[ pSeat->fVGUI_Display - 1 ].sTitle, vVGUIWindowPos, '640 480 0' );
iVGUIKey = 48;
// Display the contents of whatever we have selected
- vguiMenus[ fVGUI_Display - 1 ].vDraw( vVGUIWindowPos );
+ vguiMenus[ pSeat->fVGUI_Display - 1 ].vDraw( vVGUIWindowPos );
+
+ return TRUE;
}
/*
@@ -102,5 +103,9 @@ void CSQC_VGUI_Init( void ) {
}
// We start on the MOTD, always
- fVGUI_Display = VGUI_MOTD;
+ for (int s = 0; s < seats.length; s++)
+ {
+ pSeat = &seats[s];
+ pSeat->fVGUI_Display = VGUI_MOTD;
+ }
}
diff --git a/Source/Client/VGUIBuyMenu.c b/Source/Client/VGUIBuyMenu.c
index 10404ea6..5a412106 100755
--- a/Source/Client/VGUIBuyMenu.c
+++ b/Source/Client/VGUIBuyMenu.c
@@ -60,33 +60,33 @@ vguiequipobject_t vguiEquipmentTable[ 7 ] = {
// TODO: Clean this up
void VGUI_BuyMenu_Main( vector vPos ) {
static void BuyMenu_Main_1( void ) {
- fVGUI_Display = VGUI_BM_HANDGUNS;
+ pSeat->fVGUI_Display = VGUI_BM_HANDGUNS;
}
static void BuyMenu_Main_2( void ) {
- fVGUI_Display = VGUI_BM_SHOTGUNS;
+ pSeat->fVGUI_Display = VGUI_BM_SHOTGUNS;
}
static void BuyMenu_Main_3( void ) {
- fVGUI_Display = VGUI_BM_SMG;
+ pSeat->fVGUI_Display = VGUI_BM_SMG;
}
static void BuyMenu_Main_4( void ) {
- fVGUI_Display = VGUI_BM_RIFLES;
+ pSeat->fVGUI_Display = VGUI_BM_RIFLES;
}
static void BuyMenu_Main_5( void ) {
- fVGUI_Display = VGUI_BM_MGS;
+ pSeat->fVGUI_Display = VGUI_BM_MGS;
}
static void BuyMenu_Main_6( void ) {
sendevent( "GamePlayerBuyAmmo", "f", 0 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void BuyMenu_Main_7( void ) {
sendevent( "GamePlayerBuyAmmo", "f", 1 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void BuyMenu_Main_8( void ) {
- fVGUI_Display = VGUI_BM_EQUIPMENT;
+ pSeat->fVGUI_Display = VGUI_BM_EQUIPMENT;
}
static void BuyMenu_Main_9( void ) {
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
VGUI_Button( _("VGUI_TITLE_HANDGUN"), BuyMenu_Main_1, vPos + '16 116 0', '180 24 0' );
@@ -103,7 +103,7 @@ void VGUI_BuyMenu_Main( vector vPos ) {
}
void VGUI_BuyMenu_Back( void ) {
- fVGUI_Display = VGUI_BM_MAIN;
+ pSeat->fVGUI_Display = VGUI_BM_MAIN;
}
/*
@@ -117,7 +117,7 @@ float iLastSelected;
void VGUI_BuyMenu_BuyWeapon( void ) {
if( iLastSelected ) {
sendevent( "PlayerBuyWeapon", "f", iLastSelected );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
}
@@ -128,7 +128,7 @@ VGUI_BuyMenu_BuyEquipment
*/
void VGUI_BuyMenu_BuyEquipment( void ) {
sendevent( "PlayerBuyEquipment", "f", iLastSelected );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
/*
diff --git a/Source/Client/VGUIMOTD.c b/Source/Client/VGUIMOTD.c
index db380c85..7454bce7 100755
--- a/Source/Client/VGUIMOTD.c
+++ b/Source/Client/VGUIMOTD.c
@@ -34,7 +34,7 @@ an array of infokeys, but that'll clutter things up
*/
void VGUI_MessageOfTheDay( vector vPos ) {
static void MessageOfTheDay_ButtonOK( void ) {
- fVGUI_Display = VGUI_TEAMSELECT;
+ pSeat->fVGUI_Display = VGUI_TEAMSELECT;
}
VGUI_Text( serverkey( "hostname" ), vPos + '16 64 0', '16 16', FONT_16 );
diff --git a/Source/Client/VGUIRadio.c b/Source/Client/VGUIRadio.c
index 0d247626..1c302c98 100755
--- a/Source/Client/VGUIRadio.c
+++ b/Source/Client/VGUIRadio.c
@@ -68,7 +68,7 @@ void VGUI_Radio_DrawCommand( float fIndex, float fMessage, vector vPos ) {
if ( fInputKeyCode == ( fIndex + 49 ) ) {
sendevent( "RadioMessage", "f", fMessage );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
}
@@ -82,10 +82,10 @@ Main drawing routine for the radio menus
void VGUI_Radio_Draw( void ) {
vector vSize, vPos;
- if ( fVGUI_Display == VGUI_RADIO1 ) {
+ if ( pSeat->fVGUI_Display == VGUI_RADIO1 ) {
vSize_x = 312;
vSize_y = ( 10 * VGUIRADIO_COMMANDS ) + 64;
- vPos = [ 16, vVideoResolution_y - 148 - vSize_y ];
+ vPos = vVideoMins + [ 16, vVideoResolution_y - 148 - vSize_y ];
VGUI_WindowSmall( _("RADIO_TITLE1"), vPos, vSize );
@@ -95,10 +95,10 @@ void VGUI_Radio_Draw( void ) {
vPos_y += 10;
VGUI_Radio_DrawCommand( i, fRadioCommands[ i ], vPos );
}
- } else if ( fVGUI_Display == VGUI_RADIO2 ) {
+ } else if ( pSeat->fVGUI_Display == VGUI_RADIO2 ) {
vSize_x = 312;
vSize_y = ( 10 * VGUIRADIO_GROUPCOMMANDS ) + 64;
- vPos = [ 16, vVideoResolution_y - 148 - vSize_y ];
+ vPos = vVideoMins + [ 16, vVideoResolution_y - 148 - vSize_y ];
VGUI_WindowSmall( _("RADIO_TITLE2"), vPos, vSize );
@@ -111,7 +111,7 @@ void VGUI_Radio_Draw( void ) {
} else {
vSize_x = 312;
vSize_y = ( 10 * VGUIRADIO_RESPONSES ) + 64;
- vPos = [ 16, vVideoResolution_y - 148 - vSize_y ];
+ vPos = vVideoMins + [ 16, vVideoResolution_y - 148 - vSize_y ];
VGUI_WindowSmall( _("RADIO_TITLE3"), vPos, vSize );
@@ -127,7 +127,7 @@ void VGUI_Radio_Draw( void ) {
VGUI_Text( sprintf( "0) %s", _("VGUI_BACK") ), vPos, '8 8', FONT_DEFAULT );
if ( fInputKeyCode == 48 ) {
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
}
@@ -141,9 +141,9 @@ void VGUI_Radio_Toggle( float fMenu ) {
return;
}
- if ( fVGUI_Display == fMenu ) {
- fVGUI_Display = VGUI_NONE;
+ if ( pSeat->fVGUI_Display == fMenu ) {
+ pSeat->fVGUI_Display = VGUI_NONE;
} else {
- fVGUI_Display = fMenu;
+ pSeat->fVGUI_Display = fMenu;
}
}
diff --git a/Source/Client/VGUIScoreboard.c b/Source/Client/VGUIScoreboard.c
index 9cc93bf3..490cd370 100755
--- a/Source/Client/VGUIScoreboard.c
+++ b/Source/Client/VGUIScoreboard.c
@@ -27,9 +27,6 @@ string sScoreTeams[4] = {
_("SCORE_TITLE_VIP"),
};
-// This is seperated from the other VGUI stuff so we can check scores while buying and whatnot
-int iShowScores;
-
/*
====================
VGUI_Scores_DrawTeam
@@ -120,8 +117,9 @@ void VGUI_Scores_Show( void ) {
vSize_x = 540;
vSize_y = vVideoResolution_y - 112;
- vMainPos_x = ( vVideoResolution_x / 2 ) - (vSize_x / 2);
- vMainPos_y = 56;
+ vMainPos = vVideoMins;
+ vMainPos_x += ( vVideoResolution_x / 2 ) - (vSize_x / 2);
+ vMainPos_y += 56;
// Draw the background
drawfill( vMainPos, vSize, VGUI_WINDOW_BGCOLOR, VGUI_WINDOW_BGALPHA );
diff --git a/Source/Client/VGUISpectator.c b/Source/Client/VGUISpectator.c
index 727ac794..6581af32 100755
--- a/Source/Client/VGUISpectator.c
+++ b/Source/Client/VGUISpectator.c
@@ -29,8 +29,8 @@ void VGUI_DrawSpectatorHUD( void ) {
vHUDColor = autocvar_con_color * ( 1 / 255 );
// Draw the borders
- drawfill( [ 0, 0 ], [ vVideoResolution_x, 40 ], '0 0 0', 1 );
- drawfill( [ 0, vVideoResolution_y - 40], [ vVideoResolution_x, 40 ], '0 0 0', 1 );
+ drawfill( vVideoMins, [ vVideoResolution_x, 40 ], '0 0 0', 1 );
+ drawfill( vVideoMins + [ 0, vVideoResolution_y - 40], [ vVideoResolution_x, 40 ], '0 0 0', 1 );
// Draw the timer
int iMinutes, iSeconds, iTens, iUnits;
@@ -51,17 +51,17 @@ void VGUI_DrawSpectatorHUD( void ) {
iUnits = iSeconds - 10 * iTens;
}
- drawpic( [ vVideoResolution_x - 70, 20 ], "gfx/vgui/640_timer", '14 14', '1 1 1', 1 );
- VGUI_RightText( [ vVideoResolution_x - 16, 23 ], sprintf( "%i:%i%i", iMinutes, iTens, iUnits ), '8 8', '0.56 0.56 0.21', FONT_DEFAULT );
+ drawpic( vVideoMins + [ vVideoResolution_x - 70, 20 ], "gfx/vgui/640_timer", '14 14', '1 1 1', 1 );
+ VGUI_RightText( vVideoMins + [ vVideoResolution_x - 16, 23 ], sprintf( "%i:%i%i", iMinutes, iTens, iUnits ), '8 8', '0.56 0.56 0.21', FONT_DEFAULT );
// Draw the money
- CSQC_DrawText( [ vVideoResolution_x - 67, 6 ], "$", '8 8', '0.56 0.56 0.21', 1, 0, FONT_DEFAULT );
- VGUI_RightText( [ vVideoResolution_x - 16, 6 ], sprintf( "%d", getstatf( STAT_MONEY ) ), '8 8', '0.56 0.56 0.21', FONT_DEFAULT );
+ CSQC_DrawText( vVideoMins + [ vVideoResolution_x - 67, 6 ], "$", '8 8', '0.56 0.56 0.21', 1, 0, FONT_DEFAULT );
+ VGUI_RightText( vVideoMins + [ vVideoResolution_x - 16, 6 ], sprintf( "%d", getstatf( STAT_MONEY ) ), '8 8', '0.56 0.56 0.21', FONT_DEFAULT );
// Seperator
- drawfill( [ vVideoResolution_x - 85, 6 ], [ 2, 28 ], '0.56 0.56 0.21', 1 );
+ drawfill( vVideoMins + [ vVideoResolution_x - 85, 6 ], [ 2, 28 ], '0.56 0.56 0.21', 1 );
// Team Stats
- VGUI_RightText( [ vVideoResolution_x - 96, 6 ], sprintf( _("VGUI_SPEC_TCOUNTER"), getstatf( STAT_WON_T ) ), '8 8', '0.56 0.56 0.21', FONT_DEFAULT );
- VGUI_RightText( [ vVideoResolution_x - 96, 23 ], sprintf( _("VGUI_SPEC_CTCOUNTER"), getstatf( STAT_WON_CT ) ), '8 8', '0.56 0.56 0.21', FONT_DEFAULT );
+ VGUI_RightText( vVideoMins + [ vVideoResolution_x - 96, 6 ], sprintf( _("VGUI_SPEC_TCOUNTER"), getstatf( STAT_WON_T ) ), '8 8', '0.56 0.56 0.21', FONT_DEFAULT );
+ VGUI_RightText( vVideoMins + [ vVideoResolution_x - 96, 23 ], sprintf( _("VGUI_SPEC_CTCOUNTER"), getstatf( STAT_WON_CT ) ), '8 8', '0.56 0.56 0.21', FONT_DEFAULT );
}
diff --git a/Source/Client/VGUITeamSelect.c b/Source/Client/VGUITeamSelect.c
index 0a9f8393..4498e08a 100755
--- a/Source/Client/VGUITeamSelect.c
+++ b/Source/Client/VGUITeamSelect.c
@@ -93,10 +93,10 @@ VGUI_TeamSelect_Main
*/
void VGUI_TeamSelect_Main( vector vPos ) {
static void TeamSelect_Main_ButtonT( void ) {
- fVGUI_Display = VGUI_TEAM_T;
+ pSeat->fVGUI_Display = VGUI_TEAM_T;
}
static void TeamSelect_Main_ButtonCT( void ) {
- fVGUI_Display = VGUI_TEAM_CT;
+ pSeat->fVGUI_Display = VGUI_TEAM_CT;
}
static void TeamSelect_Main_ButtonAuto( void ) {
int iPlayersT = 0;
@@ -111,17 +111,17 @@ void VGUI_TeamSelect_Main( vector vPos ) {
}
if ( iPlayersCT > iPlayersT ) {
- fVGUI_Display = VGUI_TEAM_T;
+ pSeat->fVGUI_Display = VGUI_TEAM_T;
} else {
- fVGUI_Display = VGUI_TEAM_CT;
+ pSeat->fVGUI_Display = VGUI_TEAM_CT;
}
}
static void TeamSelect_Main_ButtonSpectate( void ) {
sendevent( "GamePlayerSpawn", "f", 0 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void TeamSelect_Main_Exit( void ) {
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
VGUI_Text( sMapString[ 0 ], vPos + '16 64 0', '16 16', FONT_16);
@@ -147,7 +147,7 @@ VGUI_TeamSelect_Back
====================
*/
void VGUI_TeamSelect_Back( void ) {
- fVGUI_Display = VGUI_TEAMSELECT;
+ pSeat->fVGUI_Display = VGUI_TEAMSELECT;
}
/*
@@ -176,19 +176,19 @@ VGUI_TeamSelect_T
void VGUI_TeamSelect_T( vector vPos ) {
static void TeamSelect_T1( void ) {
sendevent( "GamePlayerSpawn", "f", 1 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void TeamSelect_T2( void ) {
sendevent( "GamePlayerSpawn", "f", 2 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void TeamSelect_T3( void ) {
sendevent( "GamePlayerSpawn", "f", 3 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void TeamSelect_T4( void ) {
sendevent( "GamePlayerSpawn", "f", 4 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
VGUI_TeamSelect_Button( 0, TeamSelect_T1, vPos + '16 160 0', '180 24 0' );
@@ -206,19 +206,19 @@ VGUI_TeamSelect_CT
void VGUI_TeamSelect_CT ( vector vPos ) {
static void TeamSelect_CT1( void ) {
sendevent( "GamePlayerSpawn", "f", 5 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void TeamSelect_CT2( void ) {
sendevent( "GamePlayerSpawn", "f", 6 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void TeamSelect_CT3( void ) {
sendevent( "GamePlayerSpawn", "f", 7 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
static void TeamSelect_CT4( void ) {
sendevent( "GamePlayerSpawn", "f", 8 );
- fVGUI_Display = VGUI_NONE;
+ pSeat->fVGUI_Display = VGUI_NONE;
}
VGUI_TeamSelect_Button( 4, TeamSelect_CT1, vPos + '16 160 0', '180 24 0' );
diff --git a/Source/Client/View.c b/Source/Client/View.c
index 0e8fd9e6..d67b5815 100755
--- a/Source/Client/View.c
+++ b/Source/Client/View.c
@@ -18,10 +18,6 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-entity eViewModel;
-entity eMuzzleflash;
-float fNumBones;
-
string sViewModels[ CS_WEAPON_COUNT - 1 ] = {
"models/v_knife.mdl",
"models/v_usp.mdl",
@@ -57,19 +53,17 @@ string sViewModels[ CS_WEAPON_COUNT - 1 ] = {
View_CalcBob
====================
*/
-float View_CalcBob( void ) {
- static float fBobTime;
- static float fBob;
+void View_CalcBob( void ) {
float fCycle;
vector vVelocity;
if ( self.flags & FL_ONGROUND == -1 ) {
- return fBob;
+ return;
}
- fBobTime += frametime;
- fCycle = fBobTime - (int)( fBobTime / autocvar_cl_bobcycle ) * autocvar_cl_bobcycle;
+ pSeat->fBobTime += frametime;
+ fCycle = pSeat->fBobTime - (int)( pSeat->fBobTime / autocvar_cl_bobcycle ) * autocvar_cl_bobcycle;
fCycle /= autocvar_cl_bobcycle;
if ( fCycle < autocvar_cl_bobup ) {
@@ -78,25 +72,22 @@ float View_CalcBob( void ) {
fCycle = MATH_PI + MATH_PI * ( fCycle - autocvar_cl_bobup )/( 1.0 - autocvar_cl_bobup );
}
- vVelocity = vPlayerVelocity;
+ vVelocity = pSeat->vPlayerVelocity;
vVelocity_z = 0;
- fBob = sqrt( vVelocity_x * vVelocity_x + vVelocity_y * vVelocity_y ) * autocvar_cl_bob;
+ float fBob = sqrt( vVelocity_x * vVelocity_x + vVelocity_y * vVelocity_y ) * autocvar_cl_bob;
fBob = fBob * 0.3 + fBob * 0.7 * sin( fCycle );
- fBob = min( fBob, 4 );
- fBob = max( fBob, -7 );
-
- return fBob;
+ pSeat->fBob = bound( -7, fBob, 4 );
}
void View_DropPunchAngle( void ) {
float fLerp;
fLerp = 1.0f - ( frametime * 4 );
- vPunchAngle *= fLerp;
+ pSeat->vPunchAngle *= fLerp;
}
void View_AddPunchAngle( vector vAdd ) {
- vPunchAngle += vAdd;
+ pSeat->vPunchAngle += vAdd;
}
/*
@@ -108,25 +99,25 @@ void View_ProcessEvent( float fTimeStamp, int iCode, string sData ) {
if ( iCode == 5004 ) {
localsound( sData, CHAN_AUTO, 1.0 );
} else if ( iCode == 5001 ) {
- eMuzzleflash.alpha = 1.0f;
- eMuzzleflash.scale = 0.5;
- eMuzzleflash.skin = fNumBones;
- setmodel( eMuzzleflash, sprintf( "sprites/muzzleflash%s.spr", substring( sData, 1, 1 ) ) );
+ pSeat->eMuzzleflash.alpha = 1.0f;
+ pSeat->eMuzzleflash.scale = 0.5;
+ pSeat->eMuzzleflash.skin = pSeat->fNumBones;
+ setmodel( pSeat->eMuzzleflash, sprintf( "sprites/muzzleflash%s.spr", substring( sData, 1, 1 ) ) );
} else if( iCode == 5011 ) {
- eMuzzleflash.alpha = 1.0f;
- eMuzzleflash.scale = 0.5;
- eMuzzleflash.skin = fNumBones + 1;
- setmodel( eMuzzleflash, sprintf( "sprites/muzzleflash%s.spr", substring( sData, 1, 1 ) ) );
+ pSeat->eMuzzleflash.alpha = 1.0f;
+ pSeat->eMuzzleflash.scale = 0.5;
+ pSeat->eMuzzleflash.skin = pSeat->fNumBones + 1;
+ setmodel( pSeat->eMuzzleflash, sprintf( "sprites/muzzleflash%s.spr", substring( sData, 1, 1 ) ) );
} else if ( iCode == 5021 ) {
- eMuzzleflash.alpha = 1.0f;
- eMuzzleflash.scale = 0.5;
- eMuzzleflash.skin = fNumBones + 2;
- setmodel( eMuzzleflash, sprintf( "sprites/muzzleflash%s.spr", substring( sData, 1, 1 ) ) );
+ pSeat->eMuzzleflash.alpha = 1.0f;
+ pSeat->eMuzzleflash.scale = 0.5;
+ pSeat->eMuzzleflash.skin = pSeat->fNumBones + 2;
+ setmodel( pSeat->eMuzzleflash, sprintf( "sprites/muzzleflash%s.spr", substring( sData, 1, 1 ) ) );
} else if ( iCode == 5031 ) {
- eMuzzleflash.alpha = 1.0f;
- eMuzzleflash.scale = 0.5;
- eMuzzleflash.skin = fNumBones + 3;
- setmodel( eMuzzleflash, sprintf( "sprites/muzzleflash%s.spr", substring( sData, 1, 1 ) ) );
+ pSeat->eMuzzleflash.alpha = 1.0f;
+ pSeat->eMuzzleflash.scale = 0.5;
+ pSeat->eMuzzleflash.skin = pSeat->fNumBones + 3;
+ setmodel( pSeat->eMuzzleflash, sprintf( "sprites/muzzleflash%s.spr", substring( sData, 1, 1 ) ) );
}
}
@@ -136,52 +127,54 @@ View_DrawViewModel
====================
*/
void View_DrawViewModel( void ) {
- static float fBob;
- static float fLastWeapon;
-
- if( !eViewModel ) {
- eViewModel = spawn();
- eViewModel.renderflags = RF_DEPTHHACK;
+ if( !pSeat->eViewModel ) {
+ pSeat->eViewModel = spawn();
+ pSeat->eViewModel.classname = "view model";
+ pSeat->eViewModel.renderflags = RF_VIEWMODEL | RF_DEPTHHACK;
- eMuzzleflash = spawn();
- eMuzzleflash.renderflags = RF_DEPTHHACK | RF_ADDITIVE;
+ pSeat->eMuzzleflash = spawn();
+ pSeat->eMuzzleflash.classname = "view muzzleflash";
+ pSeat->eMuzzleflash.renderflags = RF_VIEWMODEL | RF_DEPTHHACK | RF_ADDITIVE;
}
-
+ entity eViewModel = pSeat->eViewModel;
+ entity eMuzzleflash = pSeat->eMuzzleflash;
+
if ( getstatf( STAT_HEALTH ) <= 0 ) {
return;
}
-
+
// Don't update when paused
if ( serverkey("pausestate") == "0" ) {
- fBob = View_CalcBob();
-
- if( getstatf( STAT_ACTIVEWEAPON ) < CS_WEAPON_COUNT ) {
- if ( fLastWeapon != getstatf( STAT_ACTIVEWEAPON ) ) {
- fLastWeapon = getstatf( STAT_ACTIVEWEAPON );
- if ( fLastWeapon ) {
- setmodel( eViewModel, sViewModels[ getstatf( STAT_ACTIVEWEAPON ) - 1 ] );
+ View_CalcBob();
+
+ int aw = getstati( STAT_ACTIVEWEAPON );
+ if( aw < CS_WEAPON_COUNT ) {
+ if ( pSeat->fLastWeapon != aw ) {
+ pSeat->fLastWeapon = aw;
+ if ( aw >= 1 ) {
+ setmodel( eViewModel, sViewModels[ aw - 1 ] );
skel_delete( eMuzzleflash.skeletonindex );
eMuzzleflash.skeletonindex = skel_create( eViewModel.modelindex );
- fNumBones = skel_get_numbones( eMuzzleflash.skeletonindex ) + 1;
+ pSeat->fNumBones = skel_get_numbones( eMuzzleflash.skeletonindex ) + 1;
}
}
}
-
+
// Take away alpha once it has drawn fully at least once
if ( eMuzzleflash.alpha > 0.0f ) {
eMuzzleflash.alpha -= ( frametime * 45 );
}
-
- static float fBaseTime;
- processmodelevents( eViewModel.modelindex, eViewModel.frame, fBaseTime, eViewModel.frame1time, View_ProcessEvent );
-
+
+ float fBaseTime = eViewModel.frame1time;
eViewModel.frame1time += frametime;
eViewModel.frame2time += frametime;
+
+ processmodelevents( eViewModel.modelindex, eViewModel.frame, fBaseTime, eViewModel.frame1time, View_ProcessEvent );
}
- makevectors( getproperty( VF_ANGLES ) );
- eViewModel.origin = getproperty( VF_ORIGIN ) + '0 0 -1' + ( v_forward * ( fBob * 0.4 ) );
- eViewModel.angles = getproperty( VF_ANGLES ) + vPunchAngle;
+ makevectors( '0 0 0');
+ eViewModel.origin = '0 0 -1' + ( v_forward * ( pSeat->fBob * 0.4 ) );
+ eViewModel.angles = pSeat->vPunchAngle;
// Left-handed weapons
if ( autocvar_v_lefthanded ) {
@@ -197,7 +190,7 @@ void View_DrawViewModel( void ) {
// Give the gun a tilt effect like in old HL/CS versions
if ( autocvar_cl_bobclassic == 1 ) {
- eViewModel.angles_z = -fBob;
+ eViewModel.angles_z = -pSeat->fBob;
}
// Only bother when zoomed out
@@ -219,6 +212,6 @@ View_DrawViewModel
====================
*/
void View_PlayAnimation( int iSequence ) {
- eViewModel.frame = (float)iSequence;
- eViewModel.frame1time = 0.0f;
+ pSeat->eViewModel.frame = (float)iSequence;
+ pSeat->eViewModel.frame1time = 0.0f;
}
diff --git a/Source/FreeCS-CE.prj b/Source/FreeCS-CE.prj
index 08567498..7acd6442 100644
--- a/Source/FreeCS-CE.prj
+++ b/Source/FreeCS-CE.prj
@@ -46,6 +46,7 @@
+
diff --git a/Source/Globals.h b/Source/Globals.h
index 7e2482e7..d4de07f0 100755
--- a/Source/Globals.h
+++ b/Source/Globals.h
@@ -18,6 +18,9 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#pragma target FTE
+//#pragma flag enable lo //enable short-circuiting
+
#define VEC_HULL_MIN '-16 -16 -36'
#define VEC_HULL_MAX '16 16 36'
@@ -287,25 +290,13 @@ enum {
#define INPUT_BUTTON5 16
#define INPUT_BUTTON6 32
-#define FL_USERELEASED 8192
-#define FL_CROUCHING 16384
-#define FL_SEMI_TOGGLED 32768
-#define FL_FROZEN 131072
-#define FL_REMOVEME 262144
+#define FL_USERELEASED (1<<13)
+#define FL_CROUCHING (1<<19)
+#define FL_SEMI_TOGGLED (1<<15)
+#define FL_FROZEN (1<<17)
+#define FL_REMOVEME (1<<18)
-float clamp(float d, float imin, float imax) {
- float t;
-
- if(d < imin)
- t = imin;
- else
- t = d;
-
- if(t > imax)
- return imax;
- else
- return t;
-}
+#define clamp(d,min,max) bound(min,d,max)
void Empty( void ) { }
void BaseGun_ShotMultiplierHandle( float fShots );
diff --git a/Source/Math.h b/Source/Math.h
old mode 100644
new mode 100755
index e8a46f3e..4b9f397b
--- a/Source/Math.h
+++ b/Source/Math.h
@@ -63,3 +63,27 @@ float Math_FixDelta( float fDelta ) {
float Math_CRandom( void ) {
return 2 * ( random() - 0.5 );
}
+
+#if defined(SSQC) || defined(CSQC)
+#ifdef SSQC
+void Damage_Apply( entity eTarget, entity eAttacker, int iDamage, vector vHitPos, int iSkipArmor );
+#endif
+.float health;
+void runplayerphysics(void)
+{ //operates on self
+ float fallvel = ( self.flags & FL_ONGROUND )?0:-self.velocity_z;
+ runstandardplayerphysics(self);
+ if ( ( self.flags & FL_ONGROUND ) && ( self.health > 0 ) && ( fallvel > 100 )) {
+#ifdef SSQC
+ if ( fallvel > 580 ) {
+ float fFallDamage = (fallvel-580) * ( 200 / ( 1024 - 580 ) );
+ Damage_Apply( self, world, fFallDamage, self.origin, FALSE );
+ }
+#endif
+
+ if ( fallvel > 200 ) {
+ self.velocity *= 0.25;
+ }
+ }
+}
+#endif
diff --git a/Source/Menu/Defs.h b/Source/Menu/Defs.h
old mode 100644
new mode 100755
diff --git a/Source/Menu/Draw.c b/Source/Menu/Draw.c
old mode 100644
new mode 100755
diff --git a/Source/Menu/Header.c b/Source/Menu/Header.c
old mode 100644
new mode 100755
diff --git a/Source/Menu/Init.c b/Source/Menu/Init.c
old mode 100644
new mode 100755
diff --git a/Source/Menu/Makefile b/Source/Menu/Makefile
old mode 100644
new mode 100755
diff --git a/Source/Menu/MenuMain.c b/Source/Menu/MenuMain.c
old mode 100644
new mode 100755
diff --git a/Source/Menu/MenuMultiplayer.c b/Source/Menu/MenuMultiplayer.c
old mode 100644
new mode 100755
index 77408919..a3533eaa
--- a/Source/Menu/MenuMultiplayer.c
+++ b/Source/Menu/MenuMultiplayer.c
@@ -244,20 +244,106 @@ void Menu_Multiplayer_Create( void ) {
void Menu_Multiplayer_IRC( void ) {
static int iIRCInit = FALSE;
+ static string currenttab;
+ string showtab;
+ static string s; //static to access it in nested functions.
static void IRC_ButtonDone( void ) {
iMenu = MENU_MULTIPLAYER;
}
+ static void IRC_ButtonSelect(void) {
+ if (currenttab)
+ con_input(currenttab, IE_FOCUS, 0/*mouse focus*/, 0/*key focus*/, 0);
+ if (s)
+ {
+ currenttab = s;
+ con_input(currenttab, IE_FOCUS, 1/*mouse focus*/, 1/*key focus*/, 0);
+ }
+ }
if ( iIRCInit == FALSE ) {
print( "[IRC] Connecting to #freecs...\n" );
- con_printf( "IRC", "/irc /connect irc.freenode.org #freecs\n" );
- //con_getset( "IRC", "hidden", "1" );
+ localcmd("/irc /connect irc.freenode.org #freecs\n");
iIRCInit = TRUE;
- for (string s = ""; s; s = con_getset("", "next")) {con_printf(s, "SPAMMING EVERY CONSOLE HAR HAR HAR\n");}
+ }
+
+ int iTabIdx;
+ vector vTabPos = '196 140';
+ for (s = "", iTabIdx = 0; s; s = con_getset(s, "next"))
+ {
+ if (substring(s, 0, 3) == "IRC")
+ {
+ con_getset( s, "hidden", "1" ); //Hide all IRC consoles. We're evil like that.
+
+ string title = con_getset( s, "title" );
+
+ iTabIdx++;
+ if (fButtonAlpha[iTabIdx] < 0.5)
+ fButtonAlpha[iTabIdx] = 0.5;
+ Object_TextButton( vTabPos, title, IRC_ButtonSelect, fButtonAlpha[iTabIdx] );
+ vTabPos_x += stringwidth(title, TRUE, '8 8') + 8;
+ }
+ }
+ //TODO: scroll tabs.
+ //TODO: add a close button
+ //TODO: make it friendly when in-game.
+
+ showtab = currenttab;
+
+ if not (showtab) //the channel we're trying to target
+ for (s = ""; s; s = con_getset(s, "next"))
+ { //try to find our target channel
+ if (substring(s, 0, 3) == "IRC" && substring(s, -8, -1) == ":#freecs")
+ {
+ showtab = s;
+ break;
+ }
+ }
+ if (!showtab) //the server-messages channel. used more as a loading screen than anything else.
+ for (s = ""; s; s = con_getset(s, "next"))
+ {
+ if (substring(s, 0, 3) == "IRC" && substring(s, -1, -1) == ":")
+ {
+ showtab = s;
+ break;
+ }
+ }
+
+ //TODO: propagate input events to the currenttab.
+ if (currenttab)
+ {
+ if (Menu_InputCheckMouse( vMenuOffset + '196 148', '404 308' ))
+ {
+ con_input(currenttab, IE_MOUSEABS, vMousePos_x, vMousePos_y, 0);
+
+ if (fMouseClick)
+ {
+ con_input(currenttab, IE_KEYDOWN, K_MOUSE1, 0, 0);
+ con_input(currenttab, IE_KEYUP, K_MOUSE1, 0, 0);
+ }
+ con_input(currenttab, IE_FOCUS, 1/*mouse focus*/, 1/*key focus*/, 0);
+ }
+ else
+ con_input(currenttab, IE_FOCUS, 0/*mouse focus*/, 1/*key focus*/, 0);
+
+ //this is hideous
+ //BUG BUG BUG FIXME: The engine attempts to restrict con_input inputs.
+ //as a result, it can only be called inside CSQC_Input_Event (or menuqc equivelents)
+ //note that if you wish to handle IME strings then you should be doing that anyway.
+ if (fInputKeyCode != K_MOUSE1 && (fInputKeyCode || fInputKeyASCII))
+ {
+//print(sprintf("Sending input: %f %f %c\n", fInputKeyCode, fInputKeyASCII, fInputKeyASCII));
+ con_input(currenttab, IE_KEYDOWN, fInputKeyCode, fInputKeyASCII, 0);
+ con_input(currenttab, IE_KEYUP, fInputKeyCode, fInputKeyASCII, 0);
+ fInputKeyCode = 0;
+ fInputKeyASCII = 0;
+ }
}
- con_draw( "IRC", vMenuOffset + '196 140', '404 308', 8 );
+ if (showtab)
+ con_draw( showtab, vMenuOffset + '196 148', '404 308', 8 );
+ else
+ Object_Label( '196 148', _("No IRC Output"), '8 8' );
Object_Button( '32 308', BTN_DONE, IRC_ButtonDone, fButtonAlpha[0] );
}
\ No newline at end of file
diff --git a/Source/Menu/Objects.c b/Source/Menu/Objects.c
old mode 100644
new mode 100755
index 93c0542a..16a36182
--- a/Source/Menu/Objects.c
+++ b/Source/Menu/Objects.c
@@ -132,6 +132,36 @@ void Object_Button( vector vPosition, int iButtonID, void() vFunction, __inout f
drawsubpic( vPosition, '156 26', "gfx/shell/btns_main", vSrcPos + [ 0, 52 / vMenuButtonsSize_y ], vSrcSize, '1 1 1', fAlpha, 1 );
}
+void Object_TextButton( vector vPosition, string sButtonText, void() vFunction, __inout float fAlpha ) {
+ static string sLastButton;
+
+ vPosition += vMenuOffset;
+
+ if ( fAlpha > 0.0f ) {
+ fAlpha -= frametime;
+ } else {
+ fAlpha = 0.0f;
+ }
+
+ if ( Menu_InputCheckMouse( vPosition, [stringwidth(sButtonText, TRUE, '8 8'), 8] ) == TRUE ) {
+ if ( sLastButton != sButtonText ) {
+ localcmd( "play ../media/launch_deny2.wav\n" );
+ }
+ sLastButton = sButtonText;
+ fAlpha = 1.0f;
+
+ if ( fMouseClick == TRUE ) {
+ if ( vFunction != __NULL__ ) {
+ vFunction();
+ }
+ localcmd( "play ../media/launch_select2.wav\n" );
+ fMouseClick = FALSE;
+ }
+ }
+
+ drawstring( vPosition, sButtonText, '8 8', '1 1 1', fAlpha, 1 );
+}
+
/*
=================
Object_Frame
diff --git a/Source/Menu/progs.src b/Source/Menu/progs.src
old mode 100644
new mode 100755
diff --git a/Source/Server/Client.c b/Source/Server/Client.c
index eea9a213..3f4115b5 100755
--- a/Source/Server/Client.c
+++ b/Source/Server/Client.c
@@ -136,7 +136,7 @@ void SV_RunClientCommand( void ) {
input_impulse = 0;
}
- runstandardplayerphysics( self );
+ runplayerphysics();
}
/*
diff --git a/Source/Server/Damage.c b/Source/Server/Damage.c
old mode 100644
new mode 100755
diff --git a/Source/Server/Defs.h b/Source/Server/Defs.h
index 3a8e8c7c..50feed8f 100755
--- a/Source/Server/Defs.h
+++ b/Source/Server/Defs.h
@@ -65,7 +65,7 @@ enum {
.int iInGame;
.float fCharModel;
.int iCrouchAttempt;
-.int iHasBomb;
+//.int iHasBomb;
.float fDeaths;
.int iEquipment;
.float armor;
@@ -87,7 +87,6 @@ float fGameTime;
.float fAttackFinished;
.float fRadioFinished;
.float fAccuracy;
-.float fFallVelocity;
// Game specific fields
int iHostagesMax;
diff --git a/Source/Server/Footsteps.c b/Source/Server/Footsteps.c
index 8f689284..64f228fd 100755
--- a/Source/Server/Footsteps.c
+++ b/Source/Server/Footsteps.c
@@ -36,7 +36,7 @@ void Footsteps_Update( void ) {
return;
}
- if ( self.movement_x < 200 || self.flags & FL_CROUCHING ) {
+ if ( vlen( self.movement ) < 150 || self.flags & FL_CROUCHING ) {
return;
}
diff --git a/Source/Server/Main.c b/Source/Server/Main.c
index a6a1d575..1d3beca3 100755
--- a/Source/Server/Main.c
+++ b/Source/Server/Main.c
@@ -30,8 +30,13 @@ void SV_SendChat( entity eSender, string sMessage, entity eEnt, float fType ) {
WriteByte( MSG_MULTICAST, num_for_edict( eSender ) - 1 );
WriteByte( MSG_MULTICAST, eSender.team );
WriteString( MSG_MULTICAST, sMessage );
- msg_entity = eEnt;
- multicast( '0 0 0', MULTICAST_ONE );
+ if (eEnt)
+ {
+ msg_entity = eEnt;
+ multicast( '0 0 0', MULTICAST_ONE );
+ }
+ else
+ multicast( '0 0 0', MULTICAST_ALL );
}
/*
@@ -49,9 +54,7 @@ void SV_ParseClientCommand( string sCommand ) {
if ( self.health ) {
if ( argv( 0 ) == "say" ) {
localcmd( sprintf( "echo %s: %s\n", self.netname, argv( 1 ) ) );
- for ( entity eFind = world; ( eFind = find( eFind, classname, "player" ) ); ) {
- SV_SendChat( self, argv( 1 ), eFind, 0 );
- }
+ SV_SendChat( self, argv( 1 ), world, 0 );
return;
} else if ( argv( 0 ) == "say_team" ) {
localcmd( sprintf( "echo [TEAM %d] %s: %s\n", self.team, self.netname, argv( 1 ) ) );
diff --git a/Source/Server/Makefile b/Source/Server/Makefile
old mode 100644
new mode 100755
diff --git a/Source/Server/Player.c b/Source/Server/Player.c
index d0527468..75c5d842 100755
--- a/Source/Server/Player.c
+++ b/Source/Server/Player.c
@@ -147,7 +147,7 @@ void Player_Death( int iHitBody ) {
if ( ( iAlivePlayers_T == 0 ) && ( iAlivePlayers_CT == 0 ) ) {
if ( ( iBombPlanted == FALSE ) || ( iBombZones > 0 ) ) {
- Rules_RoundOver( FALSE, 3600, FALSE );
+ Rules_RoundOver( FALSE, 0, FALSE );
} else {
Rules_RoundOver( TEAM_T, 3600, FALSE );
}
@@ -299,10 +299,6 @@ Run before physics
void PlayerPreThink( void ) {
Input_Handle();
BaseGun_ShotMultiplierUpdate();
-
- if ( !( self.flags & FL_ONGROUND ) ){
- self.fFallVelocity = -self.velocity_z;
- }
}
/*
@@ -316,18 +312,5 @@ void PlayerPostThink( void ) {
Animation_PlayerUpdate();
Footsteps_Update();
- if ( ( self.flags & FL_ONGROUND ) && ( self.health > 0 ) && ( self.fFallVelocity > 100 )) {
- if ( self.fFallVelocity > 580 ) {
- self.fFallVelocity -= 580;
- float fFallDamage = self.fFallVelocity * ( 200 / ( 1024 - 580 ) );
- Damage_Apply( self, world, fFallDamage, self.origin, FALSE );
- }
-
- if ( self.fFallVelocity > 200 ) {
- self.velocity *= 0.25;
- }
- self.fFallVelocity = 0;
- }
-
self.SendFlags = 1;
}
diff --git a/Source/Server/Rules.c b/Source/Server/Rules.c
index e46166e2..a42e9c53 100755
--- a/Source/Server/Rules.c
+++ b/Source/Server/Rules.c
@@ -179,11 +179,16 @@ void Rules_RoundOver( int iTeamWon, int iMoneyReward, float fSilent ) {
Radio_BroadcastMessage( RADIO_TERWIN );
}
iWon_T++;
+
+ // FIXME: Calculate the proper loss values
+ Money_QueTeamReward( TEAM_CT, 1400 );
} else if ( iTeamWon == TEAM_CT ) {
if ( fSilent == FALSE ) {
Radio_BroadcastMessage( RADIO_CTWIN );
}
iWon_CT++;
+ // FIXME: Calculate the proper loss values
+ Money_QueTeamReward( TEAM_T, 1400 );
} else {
if ( fSilent == FALSE ) {
Radio_BroadcastMessage( RADIO_ROUNDDRAW );
diff --git a/Source/Server/Spawn.c b/Source/Server/Spawn.c
index e6d827dd..c224400a 100755
--- a/Source/Server/Spawn.c
+++ b/Source/Server/Spawn.c
@@ -47,9 +47,14 @@ entity Spawn_FindSpawnPoint( float fTeam ) {
while ( 1 ) {
eSpot = find(eSpot, classname, sClassname);
+ if (eSpot == eLastSpawn)
+ { //fall back on lame cycling/spawnfragging
+ eLastSpawn = find(eLastSpawn, classname, sClassname);
+ if (!eLastSpawn)
+ eLastSpawn = find(eLastSpawn, classname, sClassname);
+ return eLastSpawn;
+ }
if (eSpot != world) {
- if (eSpot == eLastSpawn)
- return eLastSpawn;
iCount = 0;
eThing = findradius(eSpot.origin, 32);
while(eThing) {
diff --git a/Source/Shared/Animations.c b/Source/Shared/Animations.c
index 00b9d944..e3589ae0 100755
--- a/Source/Shared/Animations.c
+++ b/Source/Shared/Animations.c
@@ -23,8 +23,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
.float fWasCrouching;
// For lerping, sigh
+#ifdef CSQC
.float frame_last;
.float baseframe_last;
+#endif
enum {
ANIM_DUMMY1,
diff --git a/Source/Shared/BaseGun.c b/Source/Shared/BaseGun.c
index 8a356c55..5400eb50 100755
--- a/Source/Shared/BaseGun.c
+++ b/Source/Shared/BaseGun.c
@@ -52,9 +52,7 @@ weaponinfo_t wptTable[ CS_WEAPON_COUNT ] = {
#ifdef SSQC
.int iShotMultiplier;
.float fDecreaseShotTime;
-.int iOldShotMultiplier;
-#else
-int iShotMultiplier;
+//.int iOldShotMultiplier;
#endif
/*
@@ -72,13 +70,13 @@ void BaseGun_ShotMultiplierHandle( float fShots ) {
self.fDecreaseShotTime = time + 0.2;
#else
vector vPunch;
- if ( iShotMultiplier > 12 ) {
- iShotMultiplier = 12;
+ if ( pSeat->iShotMultiplier > 12 ) {
+ pSeat->iShotMultiplier = 12;
} else {
- iShotMultiplier += fShots;
+ pSeat->iShotMultiplier += fShots;
}
- vPunch_x = -2 * ( iShotMultiplier / 6 );
+ vPunch_x = -2 * ( pSeat->iShotMultiplier / 6 );
vPunch_y = random( -1, 1 );
View_AddPunchAngle( vPunch );
#endif
diff --git a/Source/Shared/Effects.c b/Source/Shared/Effects.c
index dbce1e55..a7e584ce 100755
--- a/Source/Shared/Effects.c
+++ b/Source/Shared/Effects.c
@@ -293,6 +293,7 @@ void Effect_BreakModel( vector vMins, vector vMaxs, vector vVel, float fStyle )
while ( fCount > 0 ) {
entity eGib = spawn();
+ eGib.classname = "gib";
vPos_x = vMins_x + ( random() * ( vMaxs_x - vMins_x ) );
vPos_y = vMins_y + ( random() * ( vMaxs_y - vMins_y ) );
diff --git a/Source/Shared/WeaponElites.c b/Source/Shared/WeaponElites.c
index 4db8c790..cf096bcc 100755
--- a/Source/Shared/WeaponElites.c
+++ b/Source/Shared/WeaponElites.c
@@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
.int iMag_ELITES;
#ifdef SSQC
-.int iMode_ELITES;
+//.int iMode_ELITES;
#else
int iWeaponMode_ELITES;
#endif
diff --git a/Source/Shared/WeaponG3SG1.c b/Source/Shared/WeaponG3SG1.c
old mode 100644
new mode 100755
diff --git a/freecs/csprogs.dat b/freecs/csprogs.dat
index c435eddf..71ccd6a2 100644
Binary files a/freecs/csprogs.dat and b/freecs/csprogs.dat differ
diff --git a/freecs/default.cfg b/freecs/default.cfg
index d3ea0a0c..590cf08c 100644
--- a/freecs/default.cfg
+++ b/freecs/default.cfg
@@ -38,7 +38,7 @@ seta sv_maxspeed 240
seta cl_forwardspeed 240
seta cl_sidespeed 240
seta cl_backspeed 240
-seta cl_movespeedkey 0.2
+seta cl_movespeedkey 0.5
seta mp_startmoney "800"
seta mp_buytime 90
seta mp_freezetime 6
@@ -76,4 +76,5 @@ seta scr_conalpha "1"
seta con_notifylines "0"
seta maxplayers "8"
seta lang "en_us"
-seta cfg_save_auto "1"
\ No newline at end of file
+seta cfg_save_auto "1"
+seta in_rawinput "1"
\ No newline at end of file
diff --git a/freecs/menu.dat b/freecs/menu.dat
index 3d0a8dec..e7a0b648 100755
Binary files a/freecs/menu.dat and b/freecs/menu.dat differ
diff --git a/freecs/progs.dat b/freecs/progs.dat
index a83abbc8..86831470 100644
Binary files a/freecs/progs.dat and b/freecs/progs.dat differ