Comitting the new cstrike-branch stuff so far, it's very little but a

step in the right direction. The old (regressed) codebase is now in
cstrike.old.
This commit is contained in:
Marco Cawthorne 2020-03-28 10:56:52 +01:00
parent 0c62ea6371
commit f66792ef49
134 changed files with 11114 additions and 2024 deletions

3
.gitignore vendored
View File

@ -6,6 +6,9 @@ ship/
src/client/cstrike.new
src/server/cstrike.new
src/shared/cstrike.new
src/client/hl2
src/server/hl2
src/shared/hl2
*.lno
*.pk3
*.dat

View File

@ -25,8 +25,8 @@ games:
mods:
mkdir -p ../cstrike/data.pk3dir
##$(CC) client/cstrike.new/progs.src
##$(CC) server/cstrike.new/progs.src
$(CC) client/cstrike/progs.src
$(CC) server/cstrike/progs.src
mkdir -p ../scihunt/data.pk3dir
$(CC) client/scihunt/progs.src
$(CC) server/scihunt/progs.src

View File

@ -0,0 +1,206 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
// Clientside cvars
var vector autocvar_cross_color = '0 255 0'; // autocvar of "cross_color"
var int autocvar_cl_radar = 1;
// Particle stuff
var float PARTICLE_SMOKEGRENADE;
.float flUpAngle;
vector vHUDColor; // Defined in HUD_Draw (HUD.c)
vector vCrossColor; // Defined in HUD_Draw (HUDCrosshair.c)
string sShellModel [ 4 ] = {
"models/pshell.mdl",
"models/rshell.mdl",
"models/rshell_big.mdl",
"models/shotgunshell.mdl"
};
var string autocvar_skins_dir = "";
string sViewModels[ CS_WEAPON_COUNT - 1 ] = {
"v_knife.mdl",
"v_usp.mdl",
"v_glock18.mdl",
"v_deagle.mdl",
"v_p228.mdl",
"v_elite.mdl",
"v_fiveseven.mdl",
"v_m3.mdl",
"v_xm1014.mdl",
"v_mp5.mdl",
"v_p90.mdl",
"v_ump45.mdl",
"v_mac10.mdl",
"v_tmp.mdl",
"v_ak47.mdl",
"v_sg552.mdl",
"v_m4a1.mdl",
"v_aug.mdl",
"v_scout.mdl",
"v_awp.mdl",
"v_g3sg1.mdl",
"v_sg550.mdl",
"v_m249.mdl",
"v_c4.mdl",
"v_flashbang.mdl",
"v_hegrenade.mdl",
"v_smokegrenade.mdl"
};
struct
{
//Viewmodel stuff
entity eViewModel;
entity eMuzzleflash;
float fNumBones;
float fEjectBone;
vector punchangle;
float fLastWeapon;
float fBobTime;
float fBob;
float damage_alpha;
vector damage_pos;
/* Camera Bob */
float flCamMove;
float flCamTime;
int iCamCycle;
float flCamFracSin;
float flCamDelta;
int iZoomed;
float flZoomTime;
//Player fields
entity ePlayer;
vector vPlayerOrigin;
vector vPlayerOriginOld;
vector vPlayerVelocity;
float fPlayerFlags;
// 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
// Testing
int iOverview;
int iMapExpand;
float fMapLerp;
//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;
int iInputAttack2;
int iInputReload;
int iInputUse;
int iInputDuck;
float fInputSendNext;
} seats[4], *pSeat;
// Sound Stuff
//.string sSoundSample;
//.float fVolume;
string HUD_GetChatColorHEX( float fTeam );
// For the player entity
.entity eGunModel;
float fWeaponEventPlayer;
.float fWeaponLast;
.float fWeaponBoneID;
.float health;
.float oldhealth;
void Animation_ShootWeapon( entity ePlayer );
void Animation_ReloadWeapon( entity ePlayer );
/*
====================
HUD_GetChatColor
Returns an RGB color vector for the specified team
====================
*/
vector HUD_GetChatColor( float fTeam ) {
if ( fTeam == TEAM_CT ) {
return '0.45 0.60 0.75';
} else if ( fTeam == TEAM_T ) {
return '0.75 0.1875 0.1875';
} else {
return '0.75 0.75 0.75';
}
}
/*
====================
HUD_GetChatColor
Returns a HEX color string prefix for the specified team
====================
*/
string HUD_GetChatColorHEX( float fTeam ) {
if ( fTeam == TEAM_CT ) {
return "^x7AC";
} else if ( fTeam == TEAM_T ) {
return "^xC33";
} else {
return "^xCCC";
}
}
/*
====================
HUD_GetChatColor
Returns a HEX color string prefix with teamname
====================
*/
string HUD_GetChatColorHEXTeam( float fTeam ) {
if ( fTeam == TEAM_CT ) {
return "^x7AC(Counter-Terrorist) ";
} else if ( fTeam == TEAM_T ) {
return "^xC33(Terrorist) ";
} else {
return "^xCCC(Spectator) ";
}
}

View File

@ -0,0 +1,62 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
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[0], self.origin[1], self.origin[2] ) );
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 );
//}
}
int
Game_Entity_Update(float id, float new)
{
switch (id) {
default:
return FALSE;
}
return TRUE;
}
void
CSQC_Ent_Remove( void ) {
if ( self.eGunModel ) {
remove( self.eGunModel );
}
soundupdate( self, CHAN_VOICE, "", -1, ATTN_IDLE, 0, 0, 0 );
remove( self );
}

View File

@ -0,0 +1,541 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#define HUD_NUMFILE "sprites/640hud7.spr" // We'll precache this
#define HUD_NUMFILE_LAYER "sprites/640hud7.spr_0.tga" // And only use the first frame for drawing (needs precache)
// Sigh
#define NUMSIZE_X 0.09375
#define NUMSIZE_Y 0.09765625
#define HUD_ALPHA 0.5
// Instead of calculating them on demand, just read the offsets here
float vHUDNumPos[10] = {
0,
0.09375,
0.1875,
0.28125,
0.375,
0.46875,
0.5625,
0.65625,
0.75,
0.84375
};
// Ditto
vector vHUDCalPos[15] = {
[0, 0],
[0.09375, 0.28125], // 50AE
[0.28125, 0.28125], // 762MM
[0, 0.375], // 556MM
[0, 0.375], // 556MM
[0.09375, 0.375], // 338MAG
[0.1875, 0.28125], // 9MM
[0, 0.28125], // BUCKSHOT
[0.375, 0.28125], // 45ACP
[0.46875, 0.28125], // 357SIG
[0.46875, 0.375], // 57MM
[0.375, 0.375], // C4
[0.5625, 0.375], // SMOKE
[0.28125, 0.375], // HE
[0.1875, 0.375] // FLASH
};
void HUD_Init(void)
{
precache_model(HUD_NUMFILE);
precache_model("sprites/top_left.spr");
precache_model("sprites/top.spr");
precache_model("sprites/top_right.spr");
precache_model("sprites/left.spr");
precache_model("sprites/right.spr");
precache_model("sprites/bottom_left.spr");
precache_model("sprites/bottom.spr");
precache_model("sprites/bottom_right.spr");
precache_model("sprites/sniper_scope.spr");
precache_model("sprites/radar640.spr");
precache_model("sprites/640hud1.spr");
precache_model("sprites/640hud16.spr");
precache_model("sprites/640hud2.spr");
precache_model("sprites/640hud10.spr");
precache_model("sprites/640hud12.spr");
precache_model("sprites/640hud14.spr");
precache_model("sprites/640hud3.spr");
precache_model("sprites/640hud5.spr");
}
/*
=================
HUD_DrawRedNumber
Draws a normal number
=================
*/
void HUD_DrawNumber(int iNumber, vector vPos, float fAlpha, vector vColor) {
drawsubpic(vPos, [24,25], HUD_NUMFILE_LAYER, [vHUDNumPos[iNumber], 0], [NUMSIZE_X, NUMSIZE_Y], vColor, fAlpha, DRAWFLAG_ADDITIVE);
}
/*
=================
HUD_DrawNums
Draws numerals quickly for health, armor etc.
=================
*/
void HUD_DrawNums(float fNumber, vector vPos, float fAlpha, vector vColor) {
int iNumber = fNumber;
if (iNumber > 0) {
while (iNumber > 0) {
HUD_DrawNumber((float)iNumber % 10, vPos, fAlpha, vColor);
iNumber = iNumber / 10;
vPos[0] -= 20;
}
} else {
HUD_DrawNumber(0, vPos, fAlpha, vColor);
}
}
/*
=================
HUD_DrawHealth
Draw the current amount of health
=================
*/
void HUD_DrawHealth(void) {
static float fOldHealth;
static float fHealthAlpha;
if (getstatf(STAT_HEALTH) != fOldHealth) {
fHealthAlpha = 1.0;
}
if (fHealthAlpha >= HUD_ALPHA) {
fHealthAlpha -= frametime * 0.5;
} else {
fHealthAlpha = HUD_ALPHA;
}
vector vHealthPos = video_mins + [16, video_res[1] - 42];
if (getstatf(STAT_HEALTH) > 25) {
drawsubpic(vHealthPos, [24, 24], 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);
} else {
drawsubpic(vHealthPos, [24, 24], HUD_NUMFILE_LAYER, [NUMSIZE_X * 2, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], [1,0,0], HUD_ALPHA, DRAWFLAG_ADDITIVE);
HUD_DrawNums(getstatf(STAT_HEALTH), vHealthPos + [72, 0], HUD_ALPHA, [1,0,0]);
}
fOldHealth = getstatf(STAT_HEALTH);
}
/*
=================
HUD_DrawArmor
Draw the current amount of Kevlar
=================
*/
void HUD_DrawArmor(void) {
static float fOldArmor;
static float fArmorAlpha;
if (getstatf(STAT_ARMOR) != fOldArmor) {
fArmorAlpha = 1.0;
}
if (fArmorAlpha >= HUD_ALPHA) {
fArmorAlpha -= frametime * 0.5;
} else {
fArmorAlpha = HUD_ALPHA;
}
vector vArmorPos = video_mins + [128, video_res[1] - 42];
if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_HELMET) {
drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, 0.4862745098], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(vArmorPos, [24,24], 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);
}
/*
=================
HUD_DrawIcons
Draw icons such as hostage, bomb and buyzones
=================
*/
void HUD_DrawIcons(void) {
vector iconpos;
iconpos = video_mins + [16, (video_res[1] / 2) - 24];
// Defusal Kit Icon (64, 148)
if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_DEFUSALKIT) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
}
// BuyZone Icon
if (getstatf(STAT_BUYZONE) == TRUE) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 3, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
}
// Hostage-Rescue Area Icon
if (getstatf(STAT_HOSTAGEZONE) == TRUE) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 2, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
}
// Escape Zone Icon (128, 148)
if (getstatf(STAT_ESCAPEZONE) == TRUE) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.5, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
}
// VIP Zone Icon (160, 148)
if (getstatf(STAT_VIPZONE) == TRUE) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.625, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
}
// Bomb-Area
if (getstatf(STAT_SLOT_C4BOMB) == WEAPON_C4BOMB) {
if (getstatf(STAT_BOMBZONE) == TRUE) {
float fAlpha = fabs(sin(time * 20));
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1 - fAlpha, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
}
iconpos[1] += 32;
}
}
/*
=================
HUD_DrawTimer
Draws the roundtime at the bottom of the screen (always visible)
=================
*/
void HUD_DrawTimer(void) {
static int iOldUnits;
static float fTimerAlpha;
int iMinutes, iSeconds, iTens, iUnits;
vector vTimePos = video_mins+[(video_res[0] / 2) - 62, video_res[1] - 42];
if (getstatf(STAT_GAMETIME) == -1) {
return;
}
iMinutes = getstatf(STAT_GAMETIME) / 60;
iSeconds = getstatf(STAT_GAMETIME) - 60 * iMinutes;
iTens = iSeconds / 10;
iUnits = iSeconds - 10 * iTens;
// Flashing red numbers
if ((iMinutes == 0) && (iTens <= 1)) {
float fAlpha;
// 0:00 is fully red
if ((iTens == 0) && (iUnits == 0)) {
fAlpha = 1;
} else {
fAlpha = fabs(sin(time * 20));
}
HUD_DrawNumber(iMinutes, vTimePos + [48,0], fAlpha, [1,0,0]);
HUD_DrawNumber(iTens, vTimePos + [75,0], fAlpha, [1,0,0]);
HUD_DrawNumber(iUnits, vTimePos + [99,0],fAlpha, [1,0,0]);
HUD_DrawNumber(iMinutes, vTimePos + [48,0], 1 - fAlpha, vHUDColor);
HUD_DrawNumber(iTens, vTimePos + [75,0], 1 - fAlpha, vHUDColor);
HUD_DrawNumber(iUnits, vTimePos + [99,0],1 - fAlpha, vHUDColor);
// : symbol
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
} else {
if (iUnits != iOldUnits) {
fTimerAlpha = 1.0;
}
if (fTimerAlpha >= HUD_ALPHA) {
fTimerAlpha -= frametime * 0.5;
} else {
fTimerAlpha = HUD_ALPHA;
}
HUD_DrawNumber(iMinutes, vTimePos + [48,0], fTimerAlpha, vHUDColor);
HUD_DrawNumber(iTens, vTimePos + [75,0], fTimerAlpha, vHUDColor);
HUD_DrawNumber(iUnits, vTimePos + [95,0], fTimerAlpha, vHUDColor);
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
iOldUnits = iUnits;
}
}
/*
=================
HUD_DrawMoney
Draws the amount of money (0-16000) with an icon to the screen
=================
*/
void HUD_DrawMoney(void) {
static float fOldMoneyValue;
static float fMoneyAlphaEffect;
static vector vMoneyColorEffect;
static float fMoneyDifference;
// If the money differs from last frame, paint it appropriately
if (getstatf(STAT_MONEY) > fOldMoneyValue) {
// Effect already in progress from something else, go add on top of it!
if (fMoneyAlphaEffect > 0) {
fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY));
} else {
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
}
// Make it green for a short time
vMoneyColorEffect = [0,1,0];
fMoneyAlphaEffect = 1.0;
} else if (getstatf(STAT_MONEY) < fOldMoneyValue) {
// Same one as above
if (fMoneyAlphaEffect > 0) {
fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY));
} else {
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
}
// Make it red
vMoneyColorEffect = [1,0,0];
fMoneyAlphaEffect = 1.0;
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
}
vector vMoneyPos = video_mins+[video_res[0] - 160, video_res[1] - 72];
// If the alpha/color effect is active, draw the money twice in their varying alphas/colors
if (fMoneyAlphaEffect > 0) {
fMoneyAlphaEffect -= frametime * 0.5;
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), DRAWFLAG_ADDITIVE);
// Draw the +/- symbols depending on whether or not we made or lost money
if (fMoneyDifference < 0) {
drawsubpic(vMoneyPos + [0,-32], [18,23], HUD_NUMFILE_LAYER, [0.8671875, 0.09765625], [0.0703125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(vMoneyPos + [0,-32], [13,23], HUD_NUMFILE_LAYER, [0.8203125, 0.09765625], [0.05078125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
}
// Shift the numbers for reverse drawing
vMoneyPos[0] += (24 * 5);
// Draw the regular numbers at their normal positions
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, fMoneyAlphaEffect, vMoneyColorEffect);
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), vHUDColor);
// Draw above how much money we've gotten from all this
HUD_DrawNums(fabs(fMoneyDifference), vMoneyPos + [0,-32], fMoneyAlphaEffect, vMoneyColorEffect);
} else {
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE);
vMoneyPos[0] += (24 * 5);
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA, vHUDColor);
}
fOldMoneyValue = getstatf(STAT_MONEY);
}
/*
=================
HUD_DrawAmmo
Draws the current clip, the amount of ammo for the caliber and a matching caliber icon
=================
*/
void HUD_DrawAmmo(void) {
static float fOldMag, fOldCal;
static float fAmmoAlpha;
static vector vAmmoMagPos;
static vector vAmmoCalPos;
if (getstatf(STAT_ACTIVEWEAPON) == 0) {
return;
}
if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_KNIFE || getstatf(STAT_ACTIVEWEAPON) == WEAPON_C4BOMB) {
return;
}
if (getstatf(STAT_CURRENT_MAG) != fOldMag || getstatf(STAT_CURRENT_CALIBER) != fOldCal) {
fAmmoAlpha = 1.0;
}
if (fAmmoAlpha >= HUD_ALPHA) {
fAmmoAlpha -= frametime * 0.5;
} else {
fAmmoAlpha = HUD_ALPHA;
}
if (wptTable[getstatf(STAT_ACTIVEWEAPON)].iCaliber < 11) {
vAmmoMagPos = video_mins+[video_res[0] - 142, video_res[1] - 42];
HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor);
drawsubpic(video_mins+[video_res[0] - 118, video_res[1] - 42], '3 25', HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.09765625], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE);
vAmmoCalPos = video_mins+[video_res[0] - 64, video_res[1] - 42];
HUD_DrawNums(getstatf(STAT_CURRENT_CALIBER), vAmmoCalPos, fAmmoAlpha, vHUDColor);
} else {
vAmmoMagPos = video_mins+[video_res[0] - 64, video_res[1] - 42];
HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor);
}
// Caliber icon
drawsubpic(video_mins+video_res - [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);
}
void HUD_DrawProgressBar(void) {
vector vSize = [540,16];
vector vMainPos;
if (getstatf(STAT_PROGRESS) > 0) {
vMainPos = video_mins;
vMainPos[0] += (video_res[0] / 2) - (vSize[0] / 2);
vMainPos[1] += (video_res[1] / 2) - (vSize[1] / 2);
// Draw the background
vector vBar = vSize;
vBar[0] = 538 * getstatf(STAT_PROGRESS);
vBar[1] = 14;
drawfill(vMainPos + [1,1], vBar, vHUDColor, 1, DRAWFLAG_ADDITIVE);
drawfill(vMainPos, [vSize[0], 1], vHUDColor, 1.0f); // Top
drawfill([vMainPos[0], vMainPos[1] + vSize[1]], [vSize[0], 1], vHUDColor, 1.0f); // Bottom
drawfill(vMainPos, [1, vSize[1]], vHUDColor, 1.0f); // Left
drawfill([vMainPos[0] + vSize[0], vMainPos[1]], [1, vSize[1] + 1], vHUDColor, 1.0f); // Right
}
}
void HUD_DrawRadar(void) {
if (autocvar_cl_radar == 1) {
drawpic(video_mins, "sprites/radar640.spr_0.tga", [128,128], [1,1,1], 0.25, DRAWFLAG_ADDITIVE);
} else if (autocvar_cl_radar == 2) {
static int iLastMode = 0;
static vector vMapSize;
static float fZoom;
if (iLastMode != pSeat.iMapExpand) {
iLastMode = pSeat.iMapExpand;
}
if (pSeat.iMapExpand == 1) {
if (pSeat.fMapLerp < 1.0f) {
vMapSize[0] = rint(Math_Lerp(128, video_res[0] - 32, pSeat.fMapLerp));
vMapSize[1] = rint(Math_Lerp(128, video_res[1] - 32, pSeat.fMapLerp));
fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (video_res[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp);
pSeat.fMapLerp += frametime * 2;
} else {
pSeat.fMapLerp = 1.0f;
fZoom = ovMap.fCameraHeight;
vMapSize = video_res + [-32,-32];
}
} else {
if (pSeat.fMapLerp > 0.0f) {
vMapSize[0] = rint(Math_Lerp(128, video_res[0] - 32, pSeat.fMapLerp));
vMapSize[1] = rint(Math_Lerp(128, video_res[1] - 32, pSeat.fMapLerp));
fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (video_res[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp);
pSeat.fMapLerp -= frametime * 2;
} else {
pSeat.fMapLerp = 0.0f;
fZoom = (ovMap.fCameraHeight * (128 / (video_res[1] - 32)));
vMapSize = [128,128];
}
}
clearscene();
drawfill(video_mins + [15,15], vMapSize + [2,2], vHUDColor, 1.0f, DRAWFLAG_ADDITIVE);
drawfill(video_mins + [16,16], vMapSize, [0,0,0], 1.0f, 0);
setproperty(VF_MIN, video_mins + [16,16]);
setproperty(VF_SIZE, vMapSize);
Overview_DrawLayer();
makevectors(view_angles);
setproperty(VF_ORIGIN, [pSeat->vPlayerOrigin[0], pSeat->vPlayerOrigin[1], fZoom] );
setproperty(VF_ANGLES, [Math_Lerp(90, 60, pSeat.fMapLerp), view_angles[1], 0]);
setproperty(VF_DRAWWORLD, 0);
renderscene();
}
}
void HUD_DrawFlash(void) {
if (pSeat->fFlashTime > 0.0f) {
pSeat->fFlashTime -= frametime;
} else {
if (pSeat->fFlashAlpha > 0.0f) {
pSeat->fFlashAlpha -= (frametime * 0.5);
} else {
return;
}
}
drawfill(video_mins, video_res, [1,1,1], pSeat->fFlashAlpha, 0/*pSeat->fFlashTime*/);
}
/*
=================
HUD_Draw
Called every frame in Draw.c
=================
*/
void HUD_Draw(void) {
vHUDColor = autocvar_con_color * (1 / 255);
// I guess viewzoom turns from 0.0-1.0 float into a 0-255 byte
if (getstatf(STAT_VIEWZOOM) < 1.0f) {
if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_SG552 || getstatf(STAT_ACTIVEWEAPON) == WEAPON_AUG) {
HUD_DrawSimpleCrosshair();
} else {
HUD_DrawScope();
}
} else {
HUD_DrawCrosshair();
}
HUD_DrawFlash();
Damage_Draw();
HUD_DrawTimer();
HUD_DrawHealth();
HUD_DrawArmor();
HUD_DrawIcons();
HUD_DrawMoney();
HUD_DrawAmmo();
HUD_DrawRadar();
HUD_DrawProgressBar();
HUD_DrawWeaponSelect();
}

View File

@ -0,0 +1,61 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
=================
Client_Init
Comparable to worldspawn in SSQC in that it's mostly used for precaches
=================
*/
void Client_Init(float apilevel, string enginename, float engineversion)
{
precache_model("sprites/fexplo.spr");
precache_model("sprites/muzzleflash1.spr");
precache_sound("player/pl_pain2.wav");
precache_model("sprites/iplayerred.spr");
precache_model("sprites/iplayerblue.spr");
precache_model("sprites/iplayervip.spr");
precache_model("sprites/ihostage.spr");
precache_model("models/pshell.mdl");
precache_model("models/rshell.mdl");
precache_model("models/rshell_big.mdl");
precache_model("models/shotgunshell.mdl");
precache_pic( sprintf( "overviews/%s.bmp", mapname ) );
PARTICLE_SMOKEGRENADE = particleeffectnum("smokegren");
Radio_InitSounds();
CSQC_ConsoleCommand_Init();
Overview_Init();
pSeat.iOverview = FALSE;
}
void Client_InitDone(void)
{
/* don't open this in singleplayer */
if (serverkeyfloat("slots") > 1) {
VGUI_ChooseTeam();
}
}
void Game_RendererRestarted(string rstr)
{
Overview_Init();
}

107
src/client/cstrike.old/progs.src Executable file
View File

@ -0,0 +1,107 @@
#pragma target fte
#pragma progs_dat "../../../cstrike/data.pk3dir/csprogs.dat"
#define CSQC
#define CSTRIKE
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
../../shared/cstrike/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
../../shared/entities.h
defs.h
../defs.h
../../vgui/include.src
../voice.c
../sound.c
../music.c
../prints.c
../util.c
../../gs-entbase/client.src
../../shared/cstrike/weaponak47.c
../../shared/cstrike/weaponaug.c
../../shared/cstrike/weaponawp.c
../../shared/cstrike/weaponc4bomb.c
../../shared/cstrike/weapondeagle.c
../../shared/cstrike/weaponelites.c
../../shared/cstrike/weaponfiveseven.c
../../shared/cstrike/weaponflashbang.c
../../shared/cstrike/weapong3sg1.c
../../shared/cstrike/weaponglock18.c
../../shared/cstrike/weaponhegrenade.c
../../shared/cstrike/weaponknife.c
../../shared/cstrike/weaponm3.c
../../shared/cstrike/weaponm4a1.c
../../shared/cstrike/weaponmac10.c
../../shared/cstrike/weaponmp5.c
../../shared/cstrike/weaponp228.c
../../shared/cstrike/weaponp90.c
../../shared/cstrike/weaponpara.c
../../shared/cstrike/weaponscout.c
../../shared/cstrike/weaponsg550.c
../../shared/cstrike/weaponsg552.c
../../shared/cstrike/weaponsmokegrenade.c
../../shared/cstrike/weapontmp.c
../../shared/cstrike/weaponump45.c
../../shared/cstrike/weaponusp45.c
../../shared/cstrike/weaponxm1014.c
../../shared/cstrike/basegun.c
../../shared/cstrike/weapons.c
../../shared/cstrike/radio.c
../../shared/cstrike/equipment.c
../../shared/cstrike/animations.c
../../shared/valve/player.cpp
../../shared/pmove.c
../fade.c
../sprite.cpp
../titles.c
../text.c
../sentences.c
../../shared/decals.c
../../shared/effects.c
../../shared/spraylogo.cpp
../npc.c
../sky.c
overview.c
../player.c
../predict.c
../events.c
view.c
../view.c
../damage.c
../chat.c
nightvision.c
hudcrosshair.c
hudscope.c
hudweaponselect.c
../obituary.c
hudorbituaries.c
hud.c
../vgui.cpp
vgui_buymenu.cpp
vgui_chooseteam.cpp
vgui_motd.cpp
vgui_radio.cpp
scoreboard.c
draw.c
entities.c
event.c
init.c
player.c
../entities.c
input.c
../entry.c
#endlist

View File

@ -0,0 +1,205 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
static CUIWindow winChooseTeam;
static CUIWindow winCTTeam;
static CUIWindow winTTeam;
void
T_Skin1(void)
{
sendevent( "GamePlayerSpawn", "f", 1 );
winTTeam.Hide();
}
void
T_Skin2(void)
{
sendevent( "GamePlayerSpawn", "f", 2 );
winTTeam.Hide();
}
void
T_Skin3(void)
{
sendevent( "GamePlayerSpawn", "f", 3 );
winTTeam.Hide();
}
void
T_Skin4(void)
{
sendevent( "GamePlayerSpawn", "f", 4 );
winTTeam.Hide();
}
void
CT_Skin1(void)
{
sendevent( "GamePlayerSpawn", "f", 5 );
winCTTeam.Hide();
}
void
CT_Skin2(void)
{
sendevent( "GamePlayerSpawn", "f", 6 );
winCTTeam.Hide();
}
void
CT_Skin3(void)
{
sendevent( "GamePlayerSpawn", "f", 7 );
winCTTeam.Hide();
}
void
CT_Skin4(void)
{
sendevent( "GamePlayerSpawn", "f", 8 );
winCTTeam.Hide();
}
void
VGUI_GoSpectator(void)
{
sendevent( "GamePlayerSpawn", "f", 0 );
winChooseTeam.Hide();
}
void VGUI_ChooseTeam_CT(void)
{
static int initialized;
static CUIButton btnSkin1;
static CUIButton btnSkin2;
static CUIButton btnSkin3;
static CUIButton btnSkin4;
if ( !initialized ) {
initialized = TRUE;
winCTTeam = spawn( CUIWindow );
winCTTeam.SetTitle( "Choose Skin" );
winCTTeam.SetSize( [420,320] );
btnSkin1 = spawn( CUIButton );
btnSkin1.SetTitle( "Skin 1" );
btnSkin1.SetPos( [8,132] );
btnSkin1.SetFunc( CT_Skin1 );
btnSkin2 = spawn( CUIButton );
btnSkin2.SetTitle( "Skin 2" );
btnSkin2.SetPos( [8,132+30] );
btnSkin2.SetFunc( CT_Skin2 );
btnSkin3 = spawn( CUIButton );
btnSkin3.SetTitle( "Skin 3" );
btnSkin3.SetPos( [8,132+30+30] );
btnSkin3.SetFunc( CT_Skin3 );
btnSkin4 = spawn( CUIButton );
btnSkin4.SetTitle( "Skin 4" );
btnSkin4.SetPos( [8,132+30+30+30] );
btnSkin4.SetFunc( CT_Skin4 );
g_uiDesktop.Add( winCTTeam );
winCTTeam.Add( btnSkin1 );
winCTTeam.Add( btnSkin2 );
winCTTeam.Add( btnSkin3 );
winCTTeam.Add( btnSkin4 );
}
winChooseTeam.Hide();
winCTTeam.Show();
winCTTeam.SetPos( ( video_res / 2 ) - ( winCTTeam.GetSize() / 2 ) );
}
void VGUI_ChooseTeam_T(void)
{
static int initialized;
static CUIButton btnSkin1;
static CUIButton btnSkin2;
static CUIButton btnSkin3;
static CUIButton btnSkin4;
if ( !initialized ) {
initialized = TRUE;
winTTeam = spawn( CUIWindow );
winTTeam.SetTitle( "Choose Skin" );
winTTeam.SetSize( [420,320] );
btnSkin1 = spawn( CUIButton );
btnSkin1.SetTitle( "Skin 1" );
btnSkin1.SetPos( [8,132] );
btnSkin1.SetFunc( T_Skin1 );
btnSkin2 = spawn( CUIButton );
btnSkin2.SetTitle( "Skin 2" );
btnSkin2.SetPos( [8,132+30] );
btnSkin2.SetFunc( T_Skin2 );
btnSkin3 = spawn( CUIButton );
btnSkin3.SetTitle( "Skin 3" );
btnSkin3.SetPos( [8,132+30+30] );
btnSkin3.SetFunc( T_Skin3 );
btnSkin4 = spawn( CUIButton );
btnSkin4.SetTitle( "Skin 4" );
btnSkin4.SetPos( [8,132+30+30+30] );
btnSkin4.SetFunc( T_Skin4 );
g_uiDesktop.Add( winTTeam );
winTTeam.Add( btnSkin1 );
winTTeam.Add( btnSkin2 );
winTTeam.Add( btnSkin3 );
winTTeam.Add( btnSkin4 );
}
winChooseTeam.Hide();
winTTeam.Show();
winTTeam.SetPos( ( video_res / 2 ) - ( winTTeam.GetSize() / 2 ) );
}
void VGUI_ChooseTeam(void)
{
static int initialized;
static CUIButton btnGoCT;
static CUIButton btnGoT;
static CUIButton btnGoSpectator;
if ( !initialized ) {
initialized = TRUE;
winChooseTeam = spawn( CUIWindow );
winChooseTeam.SetTitle( "Choose Team" );
winChooseTeam.SetSize( '420 320' );
btnGoCT = spawn( CUIButton );
btnGoCT.SetTitle( "Counter-Terrorists" );
btnGoCT.SetPos( '8 132' );
btnGoCT.SetFunc( VGUI_ChooseTeam_CT );
btnGoT = spawn( CUIButton );
btnGoT.SetTitle( "Terrorists" );
btnGoT.SetPos( '8 162' );
btnGoT.SetFunc( VGUI_ChooseTeam_T );
btnGoSpectator = spawn( CUIButton );
btnGoSpectator.SetTitle( "Spectator" );
btnGoSpectator.SetPos( '8 192' );
btnGoSpectator.SetFunc( VGUI_GoSpectator );
g_uiDesktop.Add( winChooseTeam );
winChooseTeam.Add( btnGoCT );
winChooseTeam.Add( btnGoT );
winChooseTeam.Add( btnGoSpectator );
}
winChooseTeam.Show();
winChooseTeam.SetPos( ( video_res / 2 ) - ( winChooseTeam.GetSize() / 2 ) );
}

View File

@ -13,194 +13,3 @@
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
// Clientside cvars
var vector autocvar_cross_color = '0 255 0'; // autocvar of "cross_color"
var int autocvar_cl_radar = 1;
// Particle stuff
var float PARTICLE_SMOKEGRENADE;
.float flUpAngle;
vector vHUDColor; // Defined in HUD_Draw (HUD.c)
vector vCrossColor; // Defined in HUD_Draw (HUDCrosshair.c)
string sShellModel [ 4 ] = {
"models/pshell.mdl",
"models/rshell.mdl",
"models/rshell_big.mdl",
"models/shotgunshell.mdl"
};
var string autocvar_skins_dir = "";
string sViewModels[ CS_WEAPON_COUNT - 1 ] = {
"v_knife.mdl",
"v_usp.mdl",
"v_glock18.mdl",
"v_deagle.mdl",
"v_p228.mdl",
"v_elite.mdl",
"v_fiveseven.mdl",
"v_m3.mdl",
"v_xm1014.mdl",
"v_mp5.mdl",
"v_p90.mdl",
"v_ump45.mdl",
"v_mac10.mdl",
"v_tmp.mdl",
"v_ak47.mdl",
"v_sg552.mdl",
"v_m4a1.mdl",
"v_aug.mdl",
"v_scout.mdl",
"v_awp.mdl",
"v_g3sg1.mdl",
"v_sg550.mdl",
"v_m249.mdl",
"v_c4.mdl",
"v_flashbang.mdl",
"v_hegrenade.mdl",
"v_smokegrenade.mdl"
};
struct
{
//Viewmodel stuff
entity eViewModel;
entity eMuzzleflash;
float fNumBones;
float fEjectBone;
vector punchangle;
float fLastWeapon;
float fBobTime;
float fBob;
float damage_alpha;
vector damage_pos;
/* Camera Bob */
float flCamMove;
float flCamTime;
int iCamCycle;
float flCamFracSin;
float flCamDelta;
int iZoomed;
float flZoomTime;
//Player fields
entity ePlayer;
vector vPlayerOrigin;
vector vPlayerOriginOld;
vector vPlayerVelocity;
float fPlayerFlags;
// 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
// Testing
int iOverview;
int iMapExpand;
float fMapLerp;
//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;
int iInputAttack2;
int iInputReload;
int iInputUse;
int iInputDuck;
float fInputSendNext;
} seats[4], *pSeat;
// Sound Stuff
//.string sSoundSample;
//.float fVolume;
string HUD_GetChatColorHEX( float fTeam );
// For the player entity
.entity eGunModel;
float fWeaponEventPlayer;
.float fWeaponLast;
.float fWeaponBoneID;
.float health;
.float oldhealth;
void Animation_ShootWeapon( entity ePlayer );
void Animation_ReloadWeapon( entity ePlayer );
/*
====================
HUD_GetChatColor
Returns an RGB color vector for the specified team
====================
*/
vector HUD_GetChatColor( float fTeam ) {
if ( fTeam == TEAM_CT ) {
return '0.45 0.60 0.75';
} else if ( fTeam == TEAM_T ) {
return '0.75 0.1875 0.1875';
} else {
return '0.75 0.75 0.75';
}
}
/*
====================
HUD_GetChatColor
Returns a HEX color string prefix for the specified team
====================
*/
string HUD_GetChatColorHEX( float fTeam ) {
if ( fTeam == TEAM_CT ) {
return "^x7AC";
} else if ( fTeam == TEAM_T ) {
return "^xC33";
} else {
return "^xCCC";
}
}
/*
====================
HUD_GetChatColor
Returns a HEX color string prefix with teamname
====================
*/
string HUD_GetChatColorHEXTeam( float fTeam ) {
if ( fTeam == TEAM_CT ) {
return "^x7AC(Counter-Terrorist) ";
} else if ( fTeam == TEAM_T ) {
return "^xC33(Terrorist) ";
} else {
return "^xCCC(Spectator) ";
}
}

View File

@ -14,31 +14,6 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
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[0], self.origin[1], self.origin[2] ) );
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 );
//}
}
int
Game_Entity_Update(float id, float new)
{
@ -49,14 +24,3 @@ Game_Entity_Update(float id, float new)
return TRUE;
}
void
CSQC_Ent_Remove( void ) {
if ( self.eGunModel ) {
remove( self.eGunModel );
}
soundupdate( self, CHAN_VOICE, "", -1, ATTN_IDLE, 0, 0, 0 );
remove( self );
}

View File

@ -14,528 +14,369 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#define HUD_NUMFILE "sprites/640hud7.spr" // We'll precache this
#define HUD_NUMFILE_LAYER "sprites/640hud7.spr_0.tga" // And only use the first frame for drawing (needs precache)
// Sigh
#define NUMSIZE_X 0.09375
#define NUMSIZE_Y 0.09765625
void HUD_DrawWeaponSelect(void);
/* Use first frame for drawing (needs precache) */
#define HUD_NUMS "sprites/640hud7.spr_0.tga"
#define NUMSIZE_X 24/256
#define NUMSIZE_Y 24/256
#define HUD_ALPHA 0.5
// Instead of calculating them on demand, just read the offsets here
float vHUDNumPos[10] = {
0,
0.09375,
0.1875,
0.28125,
0.375,
0.46875,
0.5625,
0.65625,
0.75,
0.84375
float spr_hudnum[10] = {
0 / 256,
23 / 256,
47 / 256,
70 / 256,
95 / 256,
119 / 256,
144 / 256,
169 / 256,
192 / 256,
216 / 256
};
// Ditto
vector vHUDCalPos[15] = {
[0, 0],
[0.09375, 0.28125], // 50AE
[0.28125, 0.28125], // 762MM
[0, 0.375], // 556MM
[0, 0.375], // 556MM
[0.09375, 0.375], // 338MAG
[0.1875, 0.28125], // 9MM
[0, 0.28125], // BUCKSHOT
[0.375, 0.28125], // 45ACP
[0.46875, 0.28125], // 357SIG
[0.46875, 0.375], // 57MM
[0.375, 0.375], // C4
[0.5625, 0.375], // SMOKE
[0.28125, 0.375], // HE
[0.1875, 0.375] // FLASH
};
void HUD_Init(void)
/* precaches */
void
HUD_Init(void)
{
precache_model(HUD_NUMFILE);
precache_model("sprites/top_left.spr");
precache_model("sprites/top.spr");
precache_model("sprites/top_right.spr");
precache_model("sprites/left.spr");
precache_model("sprites/right.spr");
precache_model("sprites/bottom_left.spr");
precache_model("sprites/bottom.spr");
precache_model("sprites/bottom_right.spr");
precache_model("sprites/sniper_scope.spr");
precache_model("sprites/radar640.spr");
precache_model("sprites/640hud1.spr");
precache_model("sprites/640hud16.spr");
precache_model("sprites/640hud2.spr");
precache_model("sprites/640hud10.spr");
precache_model("sprites/640hud12.spr");
precache_model("sprites/640hud14.spr");
precache_model("sprites/640hud3.spr");
precache_model("sprites/640hud5.spr");
precache_model("sprites/640hud7.spr");
precache_model("sprites/640_logo.spr");
}
/*
=================
HUD_DrawRedNumber
Draws a normal number
=================
*/
void HUD_DrawNumber(int iNumber, vector vPos, float fAlpha, vector vColor) {
drawsubpic(vPos, [24,25], HUD_NUMFILE_LAYER, [vHUDNumPos[iNumber], 0], [NUMSIZE_X, NUMSIZE_Y], vColor, fAlpha, DRAWFLAG_ADDITIVE);
/* seperator for mainly ammo */
void
HUD_DrawSeperator(vector pos)
{
drawsubpic(pos,
[2,24],
HUD_NUMS,
[240/256, 0],
[2/256, 24/256],
g_hud_color,
HUD_ALPHA,
DRAWFLAG_ADDITIVE
);
}
/*
=================
HUD_DrawNums
/* handle single/multiple digits */
void
HUD_DrawNumber(int iNumber, vector vPos, float fAlpha, vector vColor)
{
drawsubpic(vPos,
[20,25],
HUD_NUMS,
[spr_hudnum[iNumber], 0],
[20/256, 25/256],
vColor,
fAlpha,
DRAWFLAG_ADDITIVE
);
}
Draws numerals quickly for health, armor etc.
=================
*/
void HUD_DrawNums(float fNumber, vector vPos, float fAlpha, vector vColor) {
int iNumber = fNumber;
if (iNumber > 0) {
while (iNumber > 0) {
HUD_DrawNumber((float)iNumber % 10, vPos, fAlpha, vColor);
iNumber = iNumber / 10;
void
HUD_DrawNums(float fNumber, vector vPos, float fAlpha, vector vColor)
{
int i = fNumber;
if (i > 0) {
while (i > 0) {
HUD_DrawNumber((float)i % 10, vPos, fAlpha, vColor);
i = i / 10;
vPos[0] -= 20;
}
}
} else {
HUD_DrawNumber(0, vPos, fAlpha, vColor);
}
}
/*
=================
HUD_DrawHealth
/* health */
void
HUD_DrawHealth(void)
{
vector pos;
player pl = (player)pSeat->ePlayer;
Draw the current amount of health
=================
*/
void HUD_DrawHealth(void) {
static float fOldHealth;
static float fHealthAlpha;
if (getstatf(STAT_HEALTH) != fOldHealth) {
fHealthAlpha = 1.0;
if (pl.health != pSeat->health_old) {
pSeat->health_alpha = 1.0;
}
if (fHealthAlpha >= HUD_ALPHA) {
fHealthAlpha -= frametime * 0.5;
if (pSeat->health_alpha >= HUD_ALPHA) {
pSeat->health_alpha -= clframetime * 0.5;
} else {
fHealthAlpha = HUD_ALPHA;
pSeat->health_alpha = HUD_ALPHA;
}
vector vHealthPos = video_mins + [16, video_res[1] - 42];
if (getstatf(STAT_HEALTH) > 25) {
drawsubpic(vHealthPos, [24, 24], 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);
pos = video_mins + [88, video_res[1] - 42];
if (pl.health > 25) {
drawsubpic(
pos + [-72,1],
[24,24],
HUD_NUMS,
[spr_health[0], spr_health[1]],
[spr_health[2], spr_health[3]],
g_hud_color,
pSeat->health_alpha,
DRAWFLAG_ADDITIVE
);
HUD_DrawNums(pl.health, pos, pSeat->health_alpha, g_hud_color);
} else {
drawsubpic(vHealthPos, [24, 24], HUD_NUMFILE_LAYER, [NUMSIZE_X * 2, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], [1,0,0], HUD_ALPHA, DRAWFLAG_ADDITIVE);
HUD_DrawNums(getstatf(STAT_HEALTH), vHealthPos + [72, 0], HUD_ALPHA, [1,0,0]);
drawsubpic(
pos + [-72,1],
[24,24],
HUD_NUMS,
[spr_health[0], spr_health[1]],
[spr_health[2], spr_health[3]],
[1,0,0],
pSeat->health_alpha,
DRAWFLAG_ADDITIVE
);
HUD_DrawNums(pl.health, pos, pSeat->health_alpha, [1,0,0]);
}
fOldHealth = getstatf(STAT_HEALTH);
pSeat->health_old = pl.health;
}
/*
=================
HUD_DrawArmor
/* armor/suit charge */
void
HUD_DrawArmor(void)
{
vector pos;
player pl = (player)pSeat->ePlayer;
Draw the current amount of Kevlar
=================
*/
void HUD_DrawArmor(void) {
static float fOldArmor;
static float fArmorAlpha;
if (getstatf(STAT_ARMOR) != fOldArmor) {
fArmorAlpha = 1.0;
}
pos = video_mins + [198, video_res[1] - 42];
if (fArmorAlpha >= HUD_ALPHA) {
fArmorAlpha -= frametime * 0.5;
} else {
fArmorAlpha = HUD_ALPHA;
}
vector vArmorPos = video_mins + [128, video_res[1] - 42];
if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_HELMET) {
drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, 0.4862745098], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(vArmorPos, [24,24], HUD_NUMFILE_LAYER, [0, NUMSIZE_Y], [NUMSIZE_X, NUMSIZE_X], vHUDColor, fArmorAlpha, DRAWFLAG_ADDITIVE);
if (pl.armor != pSeat->armor_old) {
pSeat->armor_alpha = 1.0;
}
HUD_DrawNums(getstatf(STAT_ARMOR), vArmorPos + [72,0], fArmorAlpha, vHUDColor);
fOldArmor = getstatf(STAT_ARMOR);
if (pSeat->armor_alpha >= HUD_ALPHA) {
pSeat->armor_alpha -= clframetime * 0.5;
} else {
pSeat->armor_alpha = HUD_ALPHA;
}
drawsubpic(
pos + [-80,1],
[24,24],
HUD_NUMS,
[spr_suit2[0], spr_suit2[1]],
[spr_suit2[2], spr_suit2[3]],
g_hud_color,
pSeat->armor_alpha,
DRAWFLAG_ADDITIVE
);
if (pl.armor > 0) {
drawsubpic(
pos + [-80,1],
[24, 24 * (pl.armor / 100)],
HUD_NUMS,
[spr_suit1[0],
spr_suit1[1]],
[spr_suit1[2], spr_suit1[3] * (pl.armor / 100)],
g_hud_color,
pSeat->armor_alpha,
DRAWFLAG_ADDITIVE
);
}
HUD_DrawNums(pl.armor, pos, pSeat->armor_alpha, g_hud_color);
pSeat->armor_old = pl.armor;
}
/*
=================
HUD_DrawIcons
/* magazine/clip ammo */
void
HUD_DrawAmmo1(void)
{
player pl = (player)pSeat->ePlayer;
vector pos;
Draw icons such as hostage, bomb and buyzones
=================
*/
void HUD_DrawIcons(void) {
vector iconpos;
iconpos = video_mins + [16, (video_res[1] / 2) - 24];
// Defusal Kit Icon (64, 148)
if (getstatf(STAT_EQUIPMENT) & EQUIPMENT_DEFUSALKIT) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
if (pl.a_ammo1 != pSeat->ammo1_old) {
pSeat->ammo1_alpha = 1.0;
pSeat->ammo1_old = pl.a_ammo1;
}
// BuyZone Icon
if (getstatf(STAT_BUYZONE) == TRUE) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 3, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
if (pSeat->ammo1_alpha >= HUD_ALPHA) {
pSeat->ammo1_alpha -= clframetime * 0.5;
} else {
pSeat->ammo1_alpha = HUD_ALPHA;
}
// Hostage-Rescue Area Icon
if (getstatf(STAT_HOSTAGEZONE) == TRUE) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.125 * 2, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
pos = video_mins + [video_res[0] - 152, video_res[1] - 42];
HUD_DrawNums(pl.a_ammo1, pos, pSeat->ammo1_alpha, g_hud_color);
HUD_DrawSeperator(pos + [30,0]);
}
/* leftover type ammo */
void
HUD_DrawAmmo2(void)
{
player pl = (player)pSeat->ePlayer;
vector pos;
if (pl.a_ammo2 != pSeat->ammo2_old) {
pSeat->ammo2_alpha = 1.0;
pSeat->ammo2_old = pl.a_ammo2;
}
// Escape Zone Icon (128, 148)
if (getstatf(STAT_ESCAPEZONE) == TRUE) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.5, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
if (pSeat->ammo2_alpha >= HUD_ALPHA) {
pSeat->ammo2_alpha -= clframetime * 0.5;
} else {
pSeat->ammo2_alpha = HUD_ALPHA;
}
// VIP Zone Icon (160, 148)
if (getstatf(STAT_VIPZONE) == TRUE) {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0.625, 0.578125], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
iconpos[1] += 32;
pos = video_mins + [video_res[0] - 72, video_res[1] - 42];
HUD_DrawNums(pl.a_ammo2, pos, pSeat->ammo2_alpha, g_hud_color);
}
/* special ammo */
void
HUD_DrawAmmo3(void)
{
player pl = (player)pSeat->ePlayer;
vector pos;
if (pl.a_ammo3 != pSeat->ammo3_old) {
pSeat->ammo3_alpha = 1.0;
pSeat->ammo3_old = pl.a_ammo3;
}
// Bomb-Area
if (getstatf(STAT_SLOT_C4BOMB) == WEAPON_C4BOMB) {
if (getstatf(STAT_BOMBZONE) == TRUE) {
float fAlpha = fabs(sin(time * 20));
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1 - fAlpha, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(iconpos, [32,32], HUD_NUMFILE_LAYER, [0, 0.125 * 5 - 0.046875], [0.125, 0.125], [0,1,0], 1, DRAWFLAG_ADDITIVE);
}
iconpos[1] += 32;
if (pSeat->ammo3_alpha >= HUD_ALPHA) {
pSeat->ammo3_alpha -= clframetime * 0.5;
} else {
pSeat->ammo3_alpha = HUD_ALPHA;
}
pos = video_mins + [video_res[0] - 72, video_res[1] - 74];
HUD_DrawNums(pl.a_ammo3, pos, pSeat->ammo3_alpha, g_hud_color);
}
/* flashlight/torch indicator */
void
HUD_DrawFlashlight(void)
{
vector pos;
player pl = (player)pSeat->ePlayer;
pos = video_mins + [video_res[0] - 48, 16];
/* both on, draw both sprites at full intensity */
if (pl.flags & FL_FLASHLIGHT) {
drawsubpic(
pos,
[32,32],
HUD_NUMS,
[spr_flash1[0], spr_flash1[1]],
[spr_flash1[2], spr_flash1[3]],
g_hud_color,
1.0f,
DRAWFLAG_ADDITIVE
);
drawsubpic(
pos,
[48,32],
HUD_NUMS,
[spr_flash2[0], spr_flash2[1]],
[spr_flash2[2], spr_flash2[3]],
g_hud_color,
1.0f,
DRAWFLAG_ADDITIVE
);
} else {
drawsubpic(
pos,
[32,32],
HUD_NUMS,
[spr_flash1[0], spr_flash1[1]],
[spr_flash1[2], spr_flash1[3]],
g_hud_color,
HUD_ALPHA,
DRAWFLAG_ADDITIVE
);
}
}
/*
=================
HUD_DrawTimer
/* logo animation used during e3 1998 */
void
HUD_DrawLogo(void)
{
vector pos;
static int f;
static float frame_timer;
Draws the roundtime at the bottom of the screen (always visible)
=================
*/
void HUD_DrawTimer(void) {
static int iOldUnits;
static float fTimerAlpha;
int iMinutes, iSeconds, iTens, iUnits;
vector vTimePos = video_mins+[(video_res[0] / 2) - 62, video_res[1] - 42];
frame_timer -= clframetime;
pos = [video_res[0] - 262, 48];
if (getstatf(STAT_GAMETIME) == -1) {
drawpic(
pos,
sprintf("sprites/640_logo.spr_%i.tga", f),
[256, 48],
[1,1,1],
1.0f,
DRAWFLAG_ADDITIVE
);
if (frame_timer > 0) {
return;
}
iMinutes = getstatf(STAT_GAMETIME) / 60;
iSeconds = getstatf(STAT_GAMETIME) - 60 * iMinutes;
iTens = iSeconds / 10;
iUnits = iSeconds - 10 * iTens;
frame_timer = 0.1f;
// Flashing red numbers
if ((iMinutes == 0) && (iTens <= 1)) {
float fAlpha;
// 0:00 is fully red
if ((iTens == 0) && (iUnits == 0)) {
fAlpha = 1;
} else {
fAlpha = fabs(sin(time * 20));
}
HUD_DrawNumber(iMinutes, vTimePos + [48,0], fAlpha, [1,0,0]);
HUD_DrawNumber(iTens, vTimePos + [75,0], fAlpha, [1,0,0]);
HUD_DrawNumber(iUnits, vTimePos + [99,0],fAlpha, [1,0,0]);
HUD_DrawNumber(iMinutes, vTimePos + [48,0], 1 - fAlpha, vHUDColor);
HUD_DrawNumber(iTens, vTimePos + [75,0], 1 - fAlpha, vHUDColor);
HUD_DrawNumber(iUnits, vTimePos + [99,0],1 - fAlpha, vHUDColor);
// : symbol
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], [1,0,0], fAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, 1 - fAlpha, DRAWFLAG_ADDITIVE);
} else {
if (iUnits != iOldUnits) {
fTimerAlpha = 1.0;
}
if (fTimerAlpha >= HUD_ALPHA) {
fTimerAlpha -= frametime * 0.5;
} else {
fTimerAlpha = HUD_ALPHA;
}
HUD_DrawNumber(iMinutes, vTimePos + [48,0], fTimerAlpha, vHUDColor);
HUD_DrawNumber(iTens, vTimePos + [75,0], fTimerAlpha, vHUDColor);
HUD_DrawNumber(iUnits, vTimePos + [95,0], fTimerAlpha, vHUDColor);
drawsubpic(vTimePos + [70,6], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos + [70,16], [3,3], HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.01171875], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
drawsubpic(vTimePos, [24,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 6, NUMSIZE_Y * 3], [NUMSIZE_X, NUMSIZE_Y], vHUDColor, fTimerAlpha, DRAWFLAG_ADDITIVE);
iOldUnits = iUnits;
f++;
if (f == 31) {
f = 0;
}
}
/*
=================
HUD_DrawMoney
Draws the amount of money (0-16000) with an icon to the screen
=================
*/
void HUD_DrawMoney(void) {
static float fOldMoneyValue;
static float fMoneyAlphaEffect;
static vector vMoneyColorEffect;
static float fMoneyDifference;
// If the money differs from last frame, paint it appropriately
if (getstatf(STAT_MONEY) > fOldMoneyValue) {
// Effect already in progress from something else, go add on top of it!
if (fMoneyAlphaEffect > 0) {
fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY));
} else {
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
}
// Make it green for a short time
vMoneyColorEffect = [0,1,0];
fMoneyAlphaEffect = 1.0;
} else if (getstatf(STAT_MONEY) < fOldMoneyValue) {
// Same one as above
if (fMoneyAlphaEffect > 0) {
fMoneyDifference += (fOldMoneyValue - getstatf(STAT_MONEY));
} else {
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
}
// Make it red
vMoneyColorEffect = [1,0,0];
fMoneyAlphaEffect = 1.0;
fMoneyDifference = fOldMoneyValue - getstatf(STAT_MONEY);
}
/* weapon/ammo pickup notifications */
void
HUD_DrawNotify(void)
{
vector pos;
vector vMoneyPos = video_mins+[video_res[0] - 160, video_res[1] - 72];
// If the alpha/color effect is active, draw the money twice in their varying alphas/colors
if (fMoneyAlphaEffect > 0) {
fMoneyAlphaEffect -= frametime * 0.5;
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), DRAWFLAG_ADDITIVE);
// Draw the +/- symbols depending on whether or not we made or lost money
if (fMoneyDifference < 0) {
drawsubpic(vMoneyPos + [0,-32], [18,23], HUD_NUMFILE_LAYER, [0.8671875, 0.09765625], [0.0703125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(vMoneyPos + [0,-32], [13,23], HUD_NUMFILE_LAYER, [0.8203125, 0.09765625], [0.05078125, 0.08984375], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE);
}
// Shift the numbers for reverse drawing
vMoneyPos[0] += (24 * 5);
// Draw the regular numbers at their normal positions
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, fMoneyAlphaEffect, vMoneyColorEffect);
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA - (fMoneyAlphaEffect * 0.5), vHUDColor);
// Draw above how much money we've gotten from all this
HUD_DrawNums(fabs(fMoneyDifference), vMoneyPos + [0,-32], fMoneyAlphaEffect, vMoneyColorEffect);
} else {
drawsubpic(vMoneyPos, [18,25], HUD_NUMFILE_LAYER, [NUMSIZE_X * 8, NUMSIZE_Y * 1], [NUMSIZE_X * 0.75, NUMSIZE_Y], vHUDColor, HUD_ALPHA, DRAWFLAG_ADDITIVE);
vMoneyPos[0] += (24 * 5);
HUD_DrawNums(getstatf(STAT_MONEY), vMoneyPos, HUD_ALPHA, vHUDColor);
}
fOldMoneyValue = getstatf(STAT_MONEY);
}
/*
=================
HUD_DrawAmmo
Draws the current clip, the amount of ammo for the caliber and a matching caliber icon
=================
*/
void HUD_DrawAmmo(void) {
static float fOldMag, fOldCal;
static float fAmmoAlpha;
static vector vAmmoMagPos;
static vector vAmmoCalPos;
if (getstatf(STAT_ACTIVEWEAPON) == 0) {
if (pSeat->pickup_alpha <= 0.0f) {
return;
}
if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_KNIFE || getstatf(STAT_ACTIVEWEAPON) == WEAPON_C4BOMB) {
pos = video_mins + [video_res[0] - 192, video_res[1] - 128];
Weapons_HUDPic(pSeat->pickup_weapon, 1, pos, pSeat->pickup_alpha);
pSeat->pickup_alpha -= frametime;
}
void
HUD_WeaponPickupNotify(int w)
{
pSeat->pickup_weapon = w;
pSeat->pickup_alpha = 1.0f;
}
/* main entry */
void
HUD_Draw(void)
{
player pl = (player)pSeat->ePlayer;
g_hud_color = autocvar_con_color * (1 / 255);
/* little point in not drawing these, even if you don't have a suit */
Weapons_DrawCrosshair();
HUD_DrawWeaponSelect();
if (!(pl.g_items & ITEM_SUIT)) {
return;
}
if (getstatf(STAT_CURRENT_MAG) != fOldMag || getstatf(STAT_CURRENT_CALIBER) != fOldCal) {
fAmmoAlpha = 1.0;
}
if (fAmmoAlpha >= HUD_ALPHA) {
fAmmoAlpha -= frametime * 0.5;
} else {
fAmmoAlpha = HUD_ALPHA;
}
if (wptTable[getstatf(STAT_ACTIVEWEAPON)].iCaliber < 11) {
vAmmoMagPos = video_mins+[video_res[0] - 142, video_res[1] - 42];
HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor);
drawsubpic(video_mins+[video_res[0] - 118, video_res[1] - 42], '3 25', HUD_NUMFILE_LAYER, [0.9375, 0], [0.01171875, 0.09765625], vHUDColor, fAmmoAlpha, DRAWFLAG_ADDITIVE);
vAmmoCalPos = video_mins+[video_res[0] - 64, video_res[1] - 42];
HUD_DrawNums(getstatf(STAT_CURRENT_CALIBER), vAmmoCalPos, fAmmoAlpha, vHUDColor);
} else {
vAmmoMagPos = video_mins+[video_res[0] - 64, video_res[1] - 42];
HUD_DrawNums(getstatf(STAT_CURRENT_MAG), vAmmoMagPos, fAmmoAlpha, vHUDColor);
}
// Caliber icon
drawsubpic(video_mins+video_res - [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);
}
void HUD_DrawProgressBar(void) {
vector vSize = [540,16];
vector vMainPos;
if (getstatf(STAT_PROGRESS) > 0) {
vMainPos = video_mins;
vMainPos[0] += (video_res[0] / 2) - (vSize[0] / 2);
vMainPos[1] += (video_res[1] / 2) - (vSize[1] / 2);
// Draw the background
vector vBar = vSize;
vBar[0] = 538 * getstatf(STAT_PROGRESS);
vBar[1] = 14;
drawfill(vMainPos + [1,1], vBar, vHUDColor, 1, DRAWFLAG_ADDITIVE);
drawfill(vMainPos, [vSize[0], 1], vHUDColor, 1.0f); // Top
drawfill([vMainPos[0], vMainPos[1] + vSize[1]], [vSize[0], 1], vHUDColor, 1.0f); // Bottom
drawfill(vMainPos, [1, vSize[1]], vHUDColor, 1.0f); // Left
drawfill([vMainPos[0] + vSize[0], vMainPos[1]], [1, vSize[1] + 1], vHUDColor, 1.0f); // Right
}
}
void HUD_DrawRadar(void) {
if (autocvar_cl_radar == 1) {
drawpic(video_mins, "sprites/radar640.spr_0.tga", [128,128], [1,1,1], 0.25, DRAWFLAG_ADDITIVE);
} else if (autocvar_cl_radar == 2) {
static int iLastMode = 0;
static vector vMapSize;
static float fZoom;
if (iLastMode != pSeat.iMapExpand) {
iLastMode = pSeat.iMapExpand;
}
if (pSeat.iMapExpand == 1) {
if (pSeat.fMapLerp < 1.0f) {
vMapSize[0] = rint(Math_Lerp(128, video_res[0] - 32, pSeat.fMapLerp));
vMapSize[1] = rint(Math_Lerp(128, video_res[1] - 32, pSeat.fMapLerp));
fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (video_res[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp);
pSeat.fMapLerp += frametime * 2;
} else {
pSeat.fMapLerp = 1.0f;
fZoom = ovMap.fCameraHeight;
vMapSize = video_res + [-32,-32];
}
} else {
if (pSeat.fMapLerp > 0.0f) {
vMapSize[0] = rint(Math_Lerp(128, video_res[0] - 32, pSeat.fMapLerp));
vMapSize[1] = rint(Math_Lerp(128, video_res[1] - 32, pSeat.fMapLerp));
fZoom = Math_Lerp((ovMap.fCameraHeight * (128 / (video_res[1] - 32))), ovMap.fCameraHeight - 32, pSeat.fMapLerp);
pSeat.fMapLerp -= frametime * 2;
} else {
pSeat.fMapLerp = 0.0f;
fZoom = (ovMap.fCameraHeight * (128 / (video_res[1] - 32)));
vMapSize = [128,128];
}
}
clearscene();
drawfill(video_mins + [15,15], vMapSize + [2,2], vHUDColor, 1.0f, DRAWFLAG_ADDITIVE);
drawfill(video_mins + [16,16], vMapSize, [0,0,0], 1.0f, 0);
setproperty(VF_MIN, video_mins + [16,16]);
setproperty(VF_SIZE, vMapSize);
Overview_DrawLayer();
makevectors(view_angles);
setproperty(VF_ORIGIN, [pSeat->vPlayerOrigin[0], pSeat->vPlayerOrigin[1], fZoom] );
setproperty(VF_ANGLES, [Math_Lerp(90, 60, pSeat.fMapLerp), view_angles[1], 0]);
setproperty(VF_DRAWWORLD, 0);
renderscene();
}
}
void HUD_DrawFlash(void) {
if (pSeat->fFlashTime > 0.0f) {
pSeat->fFlashTime -= frametime;
} else {
if (pSeat->fFlashAlpha > 0.0f) {
pSeat->fFlashAlpha -= (frametime * 0.5);
} else {
return;
}
}
drawfill(video_mins, video_res, [1,1,1], pSeat->fFlashAlpha, 0/*pSeat->fFlashTime*/);
}
/*
=================
HUD_Draw
Called every frame in Draw.c
=================
*/
void HUD_Draw(void) {
vHUDColor = autocvar_con_color * (1 / 255);
// I guess viewzoom turns from 0.0-1.0 float into a 0-255 byte
if (getstatf(STAT_VIEWZOOM) < 1.0f) {
if (getstatf(STAT_ACTIVEWEAPON) == WEAPON_SG552 || getstatf(STAT_ACTIVEWEAPON) == WEAPON_AUG) {
HUD_DrawSimpleCrosshair();
} else {
HUD_DrawScope();
}
} else {
HUD_DrawCrosshair();
}
HUD_DrawFlash();
Damage_Draw();
HUD_DrawTimer();
HUD_DrawNotify();
HUD_DrawHealth();
HUD_DrawArmor();
HUD_DrawIcons();
HUD_DrawMoney();
HUD_DrawAmmo();
HUD_DrawRadar();
HUD_DrawProgressBar();
HUD_DrawWeaponSelect();
HUD_DrawFlashlight();
Damage_Draw();
drawpic([128,128], HUD_NUMS, [256,256], [1,1,1], 1.0f);
}
/* specatator main entry */
void
VGUI_DrawSpectatorHUD(void)
{
// FIXME
}

51
src/client/cstrike/hud.h Normal file
View File

@ -0,0 +1,51 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* pre-calculated sprite definitions */
float spr_health[4] = {
48 / 256, // pos x
25 / 256, // pos u
24 / 256, // size x
24 / 256 // size y
};
float spr_suit1[4] = {
0 / 256, // pos x
25 / 256, // pos u
24 / 256, // size x
24 / 256 // size y
};
float spr_suit2[4] = {
24 / 256, // pos x
25 / 256, // pos u
24 / 256, // size x
24 / 256 // size y
};
float spr_flash1[4] = {
160 / 256, // pos x
24 / 256, // pos u
32 / 256, // size x
32 / 256 // size y
};
float spr_flash2[4] = {
112 / 256, // pos x
24 / 256, // pos u
48 / 256, // size x
32 / 256 // size y
};

View File

@ -0,0 +1,200 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
vector vHUDSlotNumPos[6] =
{
[168 / 256, 72 / 256],
[188 / 256, 72 / 256],
[208 / 256, 72 / 256],
[168 / 256, 92 / 256],
[188 / 256, 92 / 256],
[208 / 256, 92 / 256]
};
void HUD_DrawWeaponSelect_Forward(void)
{
player pl = (player)pSeat->ePlayer;
if (!pl.activeweapon) {
return;
}
if (pSeat->fHUDWeaponSelectTime < time) {
pSeat->fHUDWeaponSelected = pl.activeweapon;
sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE);
} else {
sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE);
pSeat->fHUDWeaponSelected--;
if (pSeat->fHUDWeaponSelected <= 0) {
pSeat->fHUDWeaponSelected = g_weapons.length - 1;
}
}
pSeat->fHUDWeaponSelectTime = time + 3;
if not (pl.g_items & g_weapons[pSeat->fHUDWeaponSelected].id) {
HUD_DrawWeaponSelect_Forward();
}
}
void HUD_DrawWeaponSelect_Back(void)
{
player pl = (player)pSeat->ePlayer;
if (!pl.activeweapon) {
return;
}
if (pSeat->fHUDWeaponSelectTime < time) {
pSeat->fHUDWeaponSelected = pl.activeweapon;
sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE);
} else {
sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE);
pSeat->fHUDWeaponSelected++;
if (pSeat->fHUDWeaponSelected >= g_weapons.length) {
pSeat->fHUDWeaponSelected = 1;
}
}
pSeat->fHUDWeaponSelectTime = time + 3;
if not (pl.g_items & g_weapons[pSeat->fHUDWeaponSelected].id) {
HUD_DrawWeaponSelect_Back();
}
}
void HUD_DrawWeaponSelect_Trigger(void)
{
player pl = (player)pSeat->ePlayer;
pl.activeweapon = pSeat->fHUDWeaponSelected;
sendevent("PlayerSwitchWeapon", "f", pSeat->fHUDWeaponSelected);
sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_select.wav", 0.5f, ATTN_NONE);
pSeat->fHUDWeaponSelected = pSeat->fHUDWeaponSelectTime = 0;
}
void HUD_DrawWeaponSelect_Last(void)
{
}
void HUD_DrawWeaponSelect_Num(vector vPos, float fValue)
{
drawsubpic(vPos, [20,20], "sprites/640hud7.spr_0.tga", vHUDSlotNumPos[fValue], [20/256, 20/256], g_hud_color, 1, DRAWFLAG_ADDITIVE);
}
int HUD_InSlotPos(int slot, int pos)
{
player pl = (player)pSeat->ePlayer;
for (int i = 1; i < g_weapons.length; i++) {
if (g_weapons[i].slot == slot && g_weapons[i].slot_pos == pos) {
if (pl.g_items & g_weapons[i].id) {
return i;
} else {
return -1;
}
}
}
return -1;
}
void HUD_SlotSelect(int slot)
{
player pl = (player)pSeat->ePlayer;
int curslot = g_weapons[pSeat->fHUDWeaponSelected].slot;
int i;
if (pSeat->fHUDWeaponSelectTime < time) {
sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_hudon.wav", 0.5, ATTN_NONE);
} else {
sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_moveselect.wav", 0.5, ATTN_NONE);
}
/* weren't in that slot? select the first one then */
if (curslot != slot) {
for (i = 1; i < g_weapons.length; i++) {
if (g_weapons[i].slot == slot) {
pSeat->fHUDWeaponSelected = i;
pSeat->fHUDWeaponSelectTime = time + 3;
break;
}
}
} else {
/* increment our current selected weapon by 1 */
pSeat->fHUDWeaponSelected++;
pSeat->fHUDWeaponSelectTime = time + 3;
/* reset when out of bounds or outside slot area */
if (pSeat->fHUDWeaponSelected >= g_weapons.length) {
pSeat->fHUDWeaponSelected = 0;
HUD_SlotSelect(slot);
} else if (g_weapons[pSeat->fHUDWeaponSelected].slot != slot) {
pSeat->fHUDWeaponSelected = 0;
HUD_SlotSelect(slot);
}
}
}
void HUD_DrawWeaponSelect(void)
{
player pl = (player)pSeat->ePlayer;
if (!pl.activeweapon) {
return;
}
if (pSeat->fHUDWeaponSelectTime < time) {
if (pSeat->fHUDWeaponSelected) {
sound(pSeat->ePlayer, CHAN_ITEM, "common/wpn_hudoff.wav", 0.5, ATTN_NONE);
pSeat->fHUDWeaponSelected = 0;
}
return;
}
vector vecPos = video_mins + [16,16];
int b;
int wantslot = g_weapons[pSeat->fHUDWeaponSelected].slot;
int wantpos = g_weapons[pSeat->fHUDWeaponSelected].slot_pos;
for (int i = 0; i < 5; i++) {
int slot_selected = 0;
vecPos[1] = video_mins[1] + 16;
HUD_DrawWeaponSelect_Num(vecPos, i);
vecPos[1] += 20;
for (int x = 0; x < 32; x++) {
if (i == wantslot) {
slot_selected = TRUE;
if (x == wantpos) {
// Selected Sprite
Weapons_HUDPic(pSeat->fHUDWeaponSelected, 1, vecPos, 1.0f);
drawsubpic(vecPos, [170,45], "sprites/640hud3.spr_0.tga",
[0,180/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE);
vecPos[1] += 50;
} else if ((b=HUD_InSlotPos(i, x)) != -1) {
// Unselected Sprite
Weapons_HUDPic(b, 0, vecPos, 1.0f);
vecPos[1] += 50;
}
} else if (HUD_InSlotPos(i, x) != -1) {
HUD_DrawWeaponSelect_Num(vecPos, 5);
vecPos[1] += 25;
}
}
if (slot_selected == TRUE) {
vecPos[0] += 175;
} else {
vecPos[0] += 25;
}
}
}

View File

@ -14,6 +14,9 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
float(entity foo, float chanid) getchannellevel = #0;
/*
=================
Client_Init
@ -23,39 +26,43 @@ Comparable to worldspawn in SSQC in that it's mostly used for precaches
*/
void Client_Init(float apilevel, string enginename, float engineversion)
{
precache_model("sprites/fexplo.spr");
precache_model("sprites/muzzleflash1.spr");
precache_sound("player/pl_pain2.wav");
precache_model("sprites/640hud1.spr");
precache_model("sprites/640hud2.spr");
precache_model("sprites/640hud3.spr");
precache_model("sprites/640hud4.spr");
precache_model("sprites/640hud5.spr");
precache_model("sprites/640hud6.spr");
precache_model("sprites/640hud7.spr");
precache_model("sprites/640hud10.spr");
precache_model("sprites/640hud11.spr");
precache_model("sprites/640hud12.spr");
precache_model("sprites/640hud13.spr");
precache_model("sprites/640hud14.spr");
precache_model("sprites/640hud15.spr");
precache_model("sprites/640hud16.spr");
precache_model("sprites/hud640_01.spr");
precache_model("sprites/hud640_02.spr");
precache_model("sprites/hud640_04.spr");
precache_model("sprites/bottom.spr");
precache_model("sprites/bottom_left.spr");
precache_model("sprites/bottom_right.spr");
precache_model("sprites/left.spr");
precache_model("sprites/radar640.spr");
precache_model("sprites/right.spr");
precache_model("sprites/sniper_scope.spr");
precache_model("sprites/top.spr");
precache_model("sprites/top_left.spr");
precache_model("sprites/top_right.spr");
precache_model("sprites/iplayerred.spr");
precache_model("sprites/iplayerblue.spr");
precache_model("sprites/iplayervip.spr");
precache_model("sprites/ihostage.spr");
precache_model("models/pshell.mdl");
precache_model("models/rshell.mdl");
precache_model("models/rshell_big.mdl");
precache_model("models/shotgunshell.mdl");
precache_pic( sprintf( "overviews/%s.bmp", mapname ) );
PARTICLE_SMOKEGRENADE = particleeffectnum("smokegren");
Radio_InitSounds();
CSQC_ConsoleCommand_Init();
Overview_Init();
pSeat.iOverview = FALSE;
BEAM_TRIPMINE = particleeffectnum("beam_tripmine");
}
void Client_InitDone(void)
{
/* don't open this in singleplayer */
if (serverkeyfloat("slots") > 1) {
VGUI_ChooseTeam();
}
/* change this to the motd */
//VGUI_ChooseTeam();
}
void Game_RendererRestarted(string rstr)
{
Overview_Init();
}

137
src/client/cstrike/progs.src Executable file → Normal file
View File

@ -2,106 +2,99 @@
#pragma progs_dat "../../../cstrike/data.pk3dir/csprogs.dat"
#define CSQC
#define CSTRIKE
#define VALVE
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
../../shared/cstrike/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
../../shared/entities.h
defs.h
../valve/defs.h
../cstrike/defs.h
../valve/particles.h
../defs.h
../../vgui/include.src
../voice.c
../sound.c
../music.c
../prints.c
../util.c
../../gs-entbase/client.src
../../shared/cstrike/weaponak47.c
../../shared/cstrike/weaponaug.c
../../shared/cstrike/weaponawp.c
../../shared/cstrike/weaponc4bomb.c
../../shared/cstrike/weapondeagle.c
../../shared/cstrike/weaponelites.c
../../shared/cstrike/weaponfiveseven.c
../../shared/cstrike/weaponflashbang.c
../../shared/cstrike/weapong3sg1.c
../../shared/cstrike/weaponglock18.c
../../shared/cstrike/weaponhegrenade.c
../../shared/cstrike/weaponknife.c
../../shared/cstrike/weaponm3.c
../../shared/cstrike/weaponm4a1.c
../../shared/cstrike/weaponmac10.c
../../shared/cstrike/weaponmp5.c
../../shared/cstrike/weaponp228.c
../../shared/cstrike/weaponp90.c
../../shared/cstrike/weaponpara.c
../../shared/cstrike/weaponscout.c
../../shared/cstrike/weaponsg550.c
../../shared/cstrike/weaponsg552.c
../../shared/cstrike/weaponsmokegrenade.c
../../shared/cstrike/weapontmp.c
../../shared/cstrike/weaponump45.c
../../shared/cstrike/weaponusp45.c
../../shared/cstrike/weaponxm1014.c
../../shared/cstrike/basegun.c
../../shared/cstrike/weapons.c
../../shared/cstrike/radio.c
../../shared/cstrike/equipment.c
../../shared/cstrike/animations.c
../../shared/valve/player.cpp
../../shared/pmove.c
../cstrike/init.c
../fade.c
../sprite.cpp
../titles.c
../text.c
../sentences.c
../../gs-entbase/client.src
../sky.c
../sound.c
../music.c
../sentences.c
../prints.c
../voice.c
../../shared/valve/animations.h
../../shared/valve/animations.c
../../shared/valve/player.cpp
../player.c
../../shared/pmove.c
../predict.c
../../shared/decals.c
../../shared/effects.c
../../shared/spraylogo.cpp
../npc.c
../sky.c
overview.c
../player.c
../predict.c
../../shared/cstrike/items.h
../../shared/valve/weapon_common.h
../../shared/cstrike/weapons.h
../../shared/cstrike/w_knife.c
../../shared/cstrike/w_usp45.c
../../shared/cstrike/w_glock18.c
../../shared/cstrike/w_deagle.c
../../shared/cstrike/w_p228.c
../../shared/cstrike/w_elites.c
../../shared/cstrike/w_fiveseven.c
../../shared/cstrike/w_m3.c
../../shared/cstrike/w_xm1014.c
../../shared/cstrike/w_mp5.c
../../shared/cstrike/w_p90.c
../../shared/cstrike/w_ump45.c
../../shared/cstrike/w_mac10.c
../../shared/cstrike/w_tmp.c
../../shared/cstrike/w_ak47.c
../../shared/cstrike/w_sg552.c
../../shared/cstrike/w_m4a1.c
../../shared/cstrike/w_aug.c
../../shared/cstrike/w_scout.c
../../shared/cstrike/w_awp.c
../../shared/cstrike/w_g3sg1.c
../../shared/cstrike/w_sg550.c
../../shared/cstrike/w_para.c
../../shared/cstrike/w_c4bomb.c
../../shared/cstrike/w_flashbang.c
../../shared/cstrike/w_hegrenade.c
../../shared/cstrike/w_smokegrenade.c
../../shared/cstrike/weapons.c
../../shared/valve/weapon_common.c
../valve/player.c
entities.c
../entities.c
../valve/cmds.c
../valve/game_event.c
../events.c
view.c
../valve/view.c
../view.c
../damage.c
../chat.c
nightvision.c
hudcrosshair.c
hudscope.c
hudweaponselect.c
../obituary.c
hudorbituaries.c
hud.c
../chat.c
../vgui.cpp
vgui_buymenu.cpp
vgui_chooseteam.cpp
vgui_motd.cpp
vgui_radio.cpp
scoreboard.c
../cstrike/vgui_chooseteam.cpp
draw.c
entities.c
event.c
init.c
player.c
../entities.c
input.c
hud.h
hud.c
hud_weaponselect.c
../valve/scoreboard.c
../valve/input.c
../entry.c
#endlist

View File

@ -188,11 +188,6 @@ CSQC_UpdateView(float w, float h, float focus)
pSeat->vPlayerVelocity = pl.velocity;
pSeat->fPlayerFlags = pl.flags;
// Render 3D Game Loop
#ifdef CSTRIKE
Cstrike_PreDraw();
#endif
// Don't hide the player entity
if (autocvar_cl_thirdperson == TRUE && pl.health) {
setproperty(VF_VIEWENTITY, (float)0);
@ -247,7 +242,6 @@ CSQC_UpdateView(float w, float h, float focus)
} else {
setproperty(VF_ORIGIN, pSeat->vPlayerOrigin);
}
View_DrawViewModel();
}
addentities(MASK_ENGINE);
@ -273,6 +267,18 @@ CSQC_UpdateView(float w, float h, float focus)
setproperty(VF_SKYROOM_CAMERA, g_skypos + realpos);
}
/* draw the world/entities */
renderscene();
/* Now we draw the viewmodel in a second pass */
clearscene();
setproperty(VF_MIN, video_mins);
setproperty(VF_SIZE, video_res);
setproperty(VF_ANGLES, view_angles + pl.punchangle);
setproperty(VF_DRAWWORLD, 0);
setproperty(VF_AFOV, cvar("cl_viewmodelfov"));
setproperty(VF_ORIGIN, pSeat->vPlayerOrigin + pl.view_ofs);
View_DrawViewModel();
renderscene();
/* Run this on all players */

View File

@ -36,7 +36,7 @@ void Event_EjectShell(void)
entity eShell = spawn();
setorigin(eShell, vOrigin);
#ifdef CSTRIKE
#if 0
setmodel(eShell, sShellModel[wptTable[getstati(STAT_ACTIVEWEAPON)].iShellType]);
#endif
eShell.movetype = MOVETYPE_BOUNCE;

View File

@ -63,7 +63,6 @@ Music_GetPath(int id)
} else if (autocvar_cl_musicstyle == MUSIC_FLAC) {
return sprintf("music/track%02i.flac", id);
} else if (autocvar_cl_musicstyle == MUSIC_STEAMHL) {
/* this doesn't happen often enough for it to be in RAM all the time */
if (id >= 2 && id <= 28) {
return g_steamhltracks[id - 2];
}
@ -94,6 +93,6 @@ Music_ParseLoop(void)
track = readbyte();
path = Music_GetPath(track);
dprint(sprintf("^2Music_ParseTrack:^7 Looping track %i from %s\n", track, path));
dprint(sprintf("^2Music_ParseLoop:^7 Looping track %i from %s\n", track, path));
localcmd(sprintf("music %s\n", path));
}

View File

@ -23,39 +23,6 @@
//.float basesubblendfrac; // legs part.
.float subblend2frac; // Up/Down
// TODO: This needs to be redone.
#ifdef CSTRIKE
string sPModels[CS_WEAPON_COUNT - 1] = {
"models/p_knife.mdl",
"models/p_usp.mdl",
"models/p_glock18.mdl",
"models/p_deagle.mdl",
"models/p_p228.mdl",
"models/p_elite.mdl",
"models/p_fiveseven.mdl",
"models/p_m3.mdl",
"models/p_xm1014.mdl",
"models/p_mp5.mdl",
"models/p_p90.mdl",
"models/p_ump45.mdl",
"models/p_mac10.mdl",
"models/p_tmp.mdl",
"models/p_ak47.mdl",
"models/p_sg552.mdl",
"models/p_m4a1.mdl",
"models/p_aug.mdl",
"models/p_scout.mdl",
"models/p_awp.mdl",
"models/p_g3sg1.mdl",
"models/p_sg550.mdl",
"models/p_m249.mdl",
"models/p_c4.mdl",
"models/p_flashbang.mdl",
"models/p_hegrenade.mdl",
"models/p_smokegrenade.mdl"
};
#endif
void player::gun_offset(void)
{
vector v1, v2;
@ -81,9 +48,7 @@ void player::gun_offset(void)
setorigin(this.p_model, this.origin - ofs);
}
#ifdef VALVE
string Weapons_GetPlayermodel(int);
#endif
void player::draw(void)
{
@ -174,11 +139,12 @@ float player::predraw(void)
makevectors(ang);
traceline(src, src + (v_forward * 8096), FALSE, self);
if (serverkeyfloat("*bspversion") == 30) {
/*if (serverkeyfloat("*bspversion") == 30) {
dynamiclight_add(trace_endpos + (v_forward * -2), 128, [1,1,1]);
} else {
float p = dynamiclight_add(src, 0, [1,1,1], 0, "textures/flashlight");
} else */{
float p = dynamiclight_add(src, 512, [1,1,1], 0, "textures/flashlight");
dynamiclight_set(p, LFIELD_ANGLES, ang);
dynamiclight_set(p, LFIELD_FLAGS, 3);
}
}

View File

@ -32,14 +32,11 @@ void Predict_PreFrame(player pl)
pl.net_teleport_time = pl.teleport_time;
pl.net_viewzoom = pl.viewzoom;
pl.net_punchangle = pl.punchangle;
#ifdef VALVE
pl.net_w_attack_next = pl.w_attack_next;
pl.net_w_idle_next = pl.w_idle_next;
pl.net_ammo1 = pl.a_ammo1;
pl.net_ammo2 = pl.a_ammo2;
pl.net_ammo3 = pl.a_ammo3;
#endif
pl.net_weapontime = pl.weapontime;
//self.netpmove_flags = self.pmove_flags;
@ -86,13 +83,12 @@ void Predict_PostFrame(player pl)
pl.punchangle = pl.net_punchangle;
//pl.hook.origin = pl.net_hookpos;
#ifdef VALVE
pl.w_attack_next = pl.net_w_attack_next;
pl.w_idle_next = pl.net_w_idle_next;
pl.a_ammo1 = pl.net_ammo1;
pl.a_ammo2 = pl.net_ammo2;
pl.a_ammo3 = pl.net_ammo3;
#endif
pl.weapontime = pl.net_weapontime;
//self.pmove_flags = self.netpmove_flags;

View File

@ -19,14 +19,6 @@ var int autocvar_v_camroll = TRUE;
void
View_Init(void)
{
#ifdef CSTRIKE
string wm;
for (int i = 0; i < (CS_WEAPON_COUNT - 1); i++) {
wm = sprintf("models/%s", sViewModels[i]);
precache_model(wm);
}
#endif
for (int s = seats.length; s-- > numclientseats;) {
pSeat = &seats[s];
if(!pSeat->eViewModel) {

View File

@ -88,6 +88,8 @@ void PointMessage_Draw(void)
#endif
#ifdef WASTES
string msg;
float distance;
for ( entity eFind = world; ( eFind = find( eFind, ::classname, "point_message" ) ); ) {
point_message m = (point_message)eFind;
msg = m.m_strMessage;

View File

@ -0,0 +1,189 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
int iArmouryItems[19] = {
WEAPON_MP5,
WEAPON_TMP,
WEAPON_P90,
WEAPON_MAC10,
WEAPON_AK47,
WEAPON_SG552,
WEAPON_M4A1,
WEAPON_AUG,
WEAPON_SCOUT,
WEAPON_G3SG1,
WEAPON_AWP,
WEAPON_M3,
WEAPON_XM1014,
WEAPON_PARA,
WEAPON_FLASHBANG,
WEAPON_HEGRENADE,
EQUIPMENT_KEVLAR,
EQUIPMENT_HELMET,
WEAPON_SMOKEGRENADE
};
string sArmouryModels[19] = {
"models/w_mp5.mdl",
"models/w_tmp.mdl",
"models/w_p90.mdl",
"models/w_mac10.mdl",
"models/w_ak47.mdl",
"models/w_sg552.mdl",
"models/w_m4a1.mdl",
"models/w_aug.mdl",
"models/w_scout.mdl",
"models/w_g3sg1.mdl",
"models/w_awp.mdl",
"models/w_m3.mdl",
"models/w_xm1014.mdl",
"models/w_m249.mdl",
"models/w_flashbang.mdl",
"models/w_hegrenade.mdl",
"models/w_kevlar.mdl",
"models/w_assault.mdl",
"models/w_smokegrenade.mdl"
};
class armoury_entity:CBaseEntity
{
int m_iCount;
int m_iLeft;
int m_iItem;
void() armoury_entity;
virtual void() touch;
virtual void() Respawn;
};
int amoury_entity_pickup(armoury_entity item, entity player)
{
entity eOld = self;
self = player;
// Only MP5 til PARA
if (item.m_iItem < 14) {
if (Weapon_SlotEmpty(Weapon_GetSlot(iArmouryItems[item.m_iItem]))) {
Weapon_AddItem(iArmouryItems[item.m_iItem]);
Weapon_Draw(iArmouryItems[item.m_iItem]);
} else {
self = eOld;
return FALSE;
}
} else {
// Equipment
if (iArmouryItems[item.m_iItem] == EQUIPMENT_KEVLAR) {
if (self.armor != 100) {
self.armor = 100;
} else {
self = eOld;
return FALSE;
}
} else if (iArmouryItems[item.m_iItem] == EQUIPMENT_HELMET) {
if (self.armor == 100) {
if (!(self.iEquipment & EQUIPMENT_HELMET)) {
sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE);
} else {
self = eOld;
return FALSE;
}
} else {
if (self.iEquipment & EQUIPMENT_HELMET) {
self.armor = 100;
sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE);
} else {
self.armor = 100;
self.iEquipment = self.iEquipment | EQUIPMENT_HELMET;
sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE);
}
}
} else {
int iNades = self.iAmmo_FLASHBANG + self.iAmmo_HEGRENADE + self.iAmmo_SMOKEGRENADE;
if (iNades < 3) {
if (iArmouryItems[item.m_iItem] == WEAPON_FLASHBANG) {
self.iAmmo_FLASHBANG++;
sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE);
} else if (iArmouryItems[item.m_iItem] == WEAPON_HEGRENADE) {
self.iAmmo_HEGRENADE++;
sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE);
} else if (iArmouryItems[item.m_iItem] == WEAPON_SMOKEGRENADE) {
self.iAmmo_SMOKEGRENADE++;
sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE);
}
} else {
self = eOld;
return FALSE;
}
}
}
self = eOld;
return TRUE;
}
void armoury_entity::touch(void)
{
if (other.classname != "player") {
return;
}
if (amoury_entity_pickup(this, other)) {
m_iLeft--;
if (m_iLeft <= 0) {
Hide();
}
}
}
void armoury_entity::Respawn(void)
{
CBaseEntity::Respawn();
solid = SOLID_TRIGGER;
m_iLeft = m_iCount;
droptofloor();
}
void armoury_entity::armoury_entity(void)
{
if (autocvar_fcs_nopickups == TRUE) {
remove(this);
return;
}
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) {
case "count":
m_iCount = stoi(argv(i + 1));
break;
case "item":
m_iItem = stoi(argv(i + 1));
break;
default:
break;
}
}
model = sArmouryModels[m_iItem];
CBaseEntity::CBaseEntity();
precache_model(m_oldModel);
setmodel(this, m_oldModel);
setsize(this, [-16,-16,0], [16,16,16]);
armoury_entity::Respawn();
}

View File

@ -0,0 +1,231 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
=================
SpectatorThink
Run every frame on every spectator
=================
*/
void Game_SpectatorThink(void)
{
self.SendFlags = 1;
}
/*
=================
ClientKill
Suicide command 'kill' executes this function.
=================
*/
void Game_ClientKill(void)
{
Damage_Apply(self, self, self.health, TRUE, 0);
}
/*
=================
ClientConnect
Run whenever a new client joins
=================
*/
void Game_ClientConnect(void) {}
/*
=================
SpectatorConnect
Called when a spectator joins the game
=================
*/
void Game_SpectatorConnect(void)
{
//Spawn_MakeSpectator();
//Spawn_ObserverCam();
ClientConnect();
PutClientInServer();
}
/*
=================
SpectatorDisconnect
Called when a spectator leaves the game
=================
*/
void Game_SpectatorDisconnect(void)
{
Spray_RemoveAll(self);
}
/*
=================
ClientDisconnect
Run whenever a client quits
=================
*/
void Game_ClientDisconnect(void)
{
// We were part of the session
self.health = 0;
Rules_CountPlayers();
Rules_DeathCheck();
Spray_RemoveAll(self);
}
void Game_DecodeChangeParms(void)
{
g_landmarkpos[0] = parm1;
g_landmarkpos[1] = parm2;
g_landmarkpos[2] = parm3;
self.angles[0] = parm4;
self.angles[1] = parm5;
self.angles[2] = parm6;
}
void Game_SetChangeParms(void)
{
parm1 = g_landmarkpos[0];
parm2 = g_landmarkpos[1];
parm3 = g_landmarkpos[2];
parm4 = self.angles[0];
parm5 = self.angles[1];
parm6 = self.angles[2];
}
/*
=================
PutClientInServer
Puts a client into the world.
=================
*/
void Game_PutClientInServer(void)
{
if (cvar("sv_playerslots") == 1) {
entity spot;
self.SendEntity = Player_SendEntity;
Game_DecodeChangeParms();
if (startspot) {
self.origin = Landmark_GetSpot();
self.fixangle = TRUE;
} else {
spot = find(world, classname, "info_player_start");
self.origin = spot.origin;
self.angles = spot.angles;
self.fixangle = TRUE;
}
self.classname = "player";
self.health = self.max_health = 100;
forceinfokey(self, "*dead", "0");
self.takedamage = DAMAGE_YES;
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_WALK;
self.flags = FL_CLIENT;
// self.Pain = Player_Pain;
//self.Death = Player_Death;
self.iBleeds = TRUE;
self.pvsflags = PVSF_IGNOREPVS;
self.fSlotGrenade = 0;
self.viewzoom = 1.0;
setmodel(self, "models/player/vip/vip.mdl");
setsize(self, VEC_HULL_MIN, VEC_HULL_MAX);
self.view_ofs = VEC_PLAYER_VIEWPOS;
self.velocity = '0 0 0';
self.frame = 1; // Idle frame
self.fBombProgress = 0;
self.team = TEAM_CT;
forceinfokey(self, "*spec", "0");
return;
}
entity eTarget = world;
Spawn_MakeSpectator();
Spawn_ObserverCam();
self.SendEntity = Player_SendEntity;
// Because we don't want to reset these when we die
Money_AddMoney(self, autocvar_mp_startmoney);
if (cvar("mp_timelimit") > 0) {
if (autocvar_fcs_voxannounce == TRUE) {
float fTimeLeft = cvar("mp_timelimit") - (time / 60);
Vox_Singlecast(self, sprintf("we have %s minutes remaining", Vox_TimeToString(fTimeLeft)));
}
}
self.team = 0;
forceinfokey(self, "*team", "0");
}
/*
=================
SV_RunClientCommand
Funtion that can interrupt client commands before physics are run
=================
*/
void Game_RunClientCommand(void)
{
/*if (clienttype(self) == CLIENTTYPE_BOT) {
((CBot)self).RunAI();
}*/
if (fGameState == GAME_FREEZE && self.health > 0) {
input_movevalues = '0 0 0';
//input_buttons = 0;
input_impulse = 0;
}
// The individual zones will just override this behavior
self.fInBombZone = FALSE;
self.fInBuyZone = FALSE;
self.fInHostageZone = FALSE;
self.fInEscapeZone = FALSE;
self.fInVIPZone = FALSE;
QPhysics_Run(self);
}
void Game_SetNewParms(void)
{
}
/*
=================
Client_SendEvent
Send a game event
=================
*/
void Client_SendEvent(entity eClient, float fEVType)
{
Weapon_UpdateCurrents();
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, fEVType);
WriteByte(MSG_MULTICAST, num_for_edict(eClient));
msg_entity = eClient;
multicast(self.origin, MULTICAST_PVS);
}

View File

@ -109,6 +109,6 @@ void Ammo_BuySecondary(void);
void Animation_PlayerTop(float fFrame);
void Animation_PlayerTopTemp(float fFrame, float fTime);
void Damage_Apply(entity, entity, float, vector, int, int);
void Damage_Apply(entity, entity, float, int, int);
#define NULL __NULL__

View File

@ -0,0 +1,72 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
=================
Input_Handle
Handles impulse and whatnot
=================
*/
void Game_Input(void)
{
// Dead, specatator
if (self.health <= 0) {
/*if (self.button2) {
if (infokey(self, "*spectator") == "0") {
forceinfokey(self, "*spectator", "1");
} else {
forceinfokey(self, "*spectator", "1");
}
}*/
return;
}
// TODO: Make this fast switch only
if (self.impulse == 3) {
Weapon_Switch(SLOT_MELEE);
} else if (self.impulse == 2) {
Weapon_Switch(SLOT_SECONDARY);
} else if (self.impulse == 1) {
Weapon_Switch(SLOT_PRIMARY);
} else if (self.impulse == 4) {
Weapon_Switch(SLOT_GRENADE);
}
if (input_buttons & INPUT_BUTTON5) {
Player_UseDown();
} else {
Player_UseUp();
}
if (input_buttons & INPUT_BUTTON0) {
if (fGameState != GAME_FREEZE) {
Weapon_PrimaryAttack(self.weapon);
}
} else if (input_buttons & INPUT_BUTTON4) {
Weapon_Reload(self.weapon);
} else if (input_buttons & INPUT_BUTTON3) {
Weapon_SecondaryAttack(self.weapon);
} else {
Weapon_Release();
}
if (self.impulse == 100) {
Flashlight_Toggle();
}
self.impulse = 0;
}

View File

@ -0,0 +1,66 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
class item_suit:CBaseTrigger
{
void() item_suit;
virtual void() touch;
virtual void() Respawn;
};
void item_suit::touch(void)
{
if (other.classname != "player") {
return;
}
player pl = (player)other;
/*if (pl.g_items & ITEM_SUIT) {
return;
}*/
sound(other, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM);
/*pl.g_items |= ITEM_SUIT;*/
CBaseTrigger::UseTargets();
if (cvar("sv_playerslots") == 1) {
remove(self);
} else {
Hide();
think = Respawn;
nextthink = time + 30.0f;
}
}
void item_suit::Respawn(void)
{
solid = SOLID_TRIGGER;
movetype = MOVETYPE_TOSS;
setsize(this, VEC_HULL_MIN, VEC_HULL_MAX);
setorigin(this, m_oldOrigin);
setmodel(this, m_oldModel);
think = __NULL__;
nextthink = -1;
}
void item_suit::item_suit(void)
{
model = "models/w_kevlar.mdl";
precache_sound("items/tr_kevlar.wav");
CBaseTrigger::CBaseTrigger();
Respawn();
}

View File

@ -0,0 +1,267 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
string sPainSounds[5] = {
"player/pl_pain2.wav",
"player/pl_pain4.wav",
"player/pl_pain5.wav",
"player/pl_pain6.wav",
"player/pl_pain7.wav"
};
/*
=================
Player_SendEntity
=================
*/
float Player_SendEntity(entity ePEnt, float fChanged)
{
/* If dead */
if (self.health <= 0 && ePEnt != self) {
return FALSE;
}
/* Fix CT/VIP team */
float t1, t2;
t1 = ePEnt.team;
t2 = self.team;
if (t1 == TEAM_VIP) {
t1 = TEAM_CT;
} else if (t2 == TEAM_VIP) {
t2 = TEAM_CT;
}
/* Always make team-mates visible */
if (t1 != t2 && ePEnt.health > 0) {
/* Can we even see them? */
if (!checkpvs(ePEnt.origin, self)) {
return FALSE;
} else {
/* We're in the same PVS, but we might still not be able to see them */
traceline(self.origin, ePEnt.origin, FALSE, self);
if (trace_ent != ePEnt) {
return FALSE;
}
}
}
WriteByte(MSG_ENTITY, ENT_PLAYER);
WriteShort(MSG_ENTITY, self.modelindex);
WriteCoord(MSG_ENTITY, self.origin[0]);
WriteCoord(MSG_ENTITY, self.origin[1]);
WriteCoord(MSG_ENTITY, self.origin[2]);
WriteCoord(MSG_ENTITY, self.v_angle[0]);
WriteCoord(MSG_ENTITY, self.angles[1]);
WriteCoord(MSG_ENTITY, self.angles[2]);
WriteCoord(MSG_ENTITY, self.velocity[0]);
WriteCoord(MSG_ENTITY, self.velocity[1]);
WriteCoord(MSG_ENTITY, self.velocity[2]);
WriteFloat(MSG_ENTITY, self.flags);
WriteFloat(MSG_ENTITY, self.pmove_flags);
WriteByte(MSG_ENTITY, self.weapon);
WriteByte(MSG_ENTITY, self.health);
WriteFloat(MSG_ENTITY, self.movetype);
WriteFloat(MSG_ENTITY, self.view_ofs[2]);
WriteFloat(MSG_ENTITY, self.viewzoom);
WriteFloat(MSG_ENTITY, self.jumptime);
WriteFloat(MSG_ENTITY, self.teleport_time);
return TRUE;
}
/*
=================
Player_Pain
=================
*/
void Player_Pain(int iHitBody)
{
/*
if (iHitBody == BODY_HEAD) {
Animation_PlayerTopTemp(ANIM_HEAD_FLINCH, 0.25f);
} else {
Animation_PlayerTopTemp(ANIM_GUT_FLINCH, 0.25f);
}*/
sound(self, CHAN_VOICE, sPainSounds[ floor(random() * 5) ], 1, ATTN_IDLE);
self.velocity = '0 0 0';
}
/*
=================
Player_Death
=================
*/
void Player_Death(int iHitBody)
{
if (iHitBody == BODY_HEAD) {
sound(self, CHAN_VOICE, sprintf("player/headshot%d.wav", floor((random() * 3) + 1)), 1, ATTN_NORM);
} else {
sound(self, CHAN_VOICE, sprintf("player/die%d.wav", floor((random() * 3) + 1)), 1, ATTN_NORM);
}
// Drop a corpse
entity eCorpse = spawn();
eCorpse.classname = "remove_me";
setorigin(eCorpse, self.origin);
setmodel(eCorpse, self.model);
setsize(eCorpse, self.mins, self.maxs);
eCorpse.angles = [ 0, self.angles[1], 0 ];
eCorpse.movetype = MOVETYPE_BOUNCE;
// Drop primary weapon as well as the bomb if present
if (self.fSlotPrimary) {
Weapon_DropWeapon(SLOT_PRIMARY);
} else {
if (self.fSlotSecondary) {
Weapon_DropWeapon(SLOT_SECONDARY);
}
}
if (self.fSlotGrenade) {
Weapon_DropWeapon(SLOT_GRENADE);
}
// Make ourselves disappear
self.modelindex = 0;
if (self.flags & FL_CROUCHING) {
eCorpse.frame = ANIM_CROUCH_DIE;
} else {
switch (iHitBody) {
case BODY_HEAD:
eCorpse.frame = ANIM_DIE_HEAD;
break;
case BODY_STOMACH:
eCorpse.frame = ANIM_DIE_GUT;
break;
case BODY_LEGLEFT:
case BODY_ARMLEFT:
eCorpse.frame = ANIM_DIE_LEFT;
break;
case BODY_LEGRIGHT:
case BODY_ARMRIGHT:
eCorpse.frame = ANIM_DIE_RIGHT;
break;
default:
eCorpse.frame = ANIM_DEATH1 + floor(random() * 3);
break;
}
}
Spawn_MakeSpectator();
self.classname = "player";
self.health = 0;
forceinfokey(self, "*dead", "1");
forceinfokey(self, "*team", ftos(self.team));
Rules_CountPlayers();
/* In Assassination, all Terrorists receive a $2500
* reward if they won by killing the VIP. */
if (self.team == TEAM_VIP) {
Rules_RoundOver(TEAM_T, 2500, FALSE);
return;
}
Rules_DeathCheck();
}
/*
====================
UseWorkaround
====================
*/
void UseWorkaround(entity eTarget)
{
eActivator = self;
entity eOldSelf = self;
self = eTarget;
self.PlayerUse();
self = eOldSelf;
}
/*
====================
Player_UseDown
====================
*/
void Player_UseDown(void)
{
if (self.health <= 0) {
return;
} else if (!(self.gflags & GF_USE_RELEASED)) {
return;
}
vector vSource;
makevectors(self.v_angle);
vSource = self.origin + self.view_ofs;
traceline (vSource, vSource + (v_forward * 64), FALSE, self);
if (trace_ent.PlayerUse) {
self.gflags &= ~GF_USE_RELEASED;
UseWorkaround(trace_ent);
/* Some entities want to support Use spamming */
if (!(self.gflags & GF_USE_RELEASED)) {
sound(self, CHAN_ITEM, "common/wpn_select.wav", 0.25, ATTN_IDLE);
}
} else {
sound(self, CHAN_ITEM, "common/wpn_denyselect.wav", 0.25, ATTN_IDLE);
self.gflags &= ~GF_USE_RELEASED;
}
}
/*
====================
Player_UseUp
====================
*/
void Player_UseUp(void)
{
if (!(self.gflags & GF_USE_RELEASED)) {
self.gflags |= GF_USE_RELEASED;
self.fProgressBar = 0;
}
}
/*
=================
PlayerPreThink
Run before physics
=================
*/
void Game_PlayerPreThink(void)
{
BaseGun_ShotMultiplierUpdate();
}
/*
=================
PlayerPreThink
Run after physics
=================
*/
void Game_PlayerPostThink(void)
{
Animation_PlayerUpdate();
Footsteps_Update();
self.SendFlags = 1;
}

View File

@ -0,0 +1,96 @@
#pragma target fte
#pragma progs_dat "../../../cstrike/data.pk3dir/progs.dat"
#define QWSSQC
#define CSTRIKE
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
defs.h
../../shared/cstrike/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
../../shared/entities.h
../defs.h
defsfields.h
../plugins.c
../logging.c
../nodes.c
../skill.c
../sentences.c
../../gs-entbase/server.src
money.c
../../shared/cstrike/animations.c
../../shared/cstrike/radio.c
../../shared/cstrike/weaponak47.c
../../shared/cstrike/weaponaug.c
../../shared/cstrike/weaponawp.c
../../shared/cstrike/weaponc4bomb.c
../../shared/cstrike/weapondeagle.c
../../shared/cstrike/weaponelites.c
../../shared/cstrike/weaponfiveseven.c
../../shared/cstrike/weaponflashbang.c
../../shared/cstrike/weapong3sg1.c
../../shared/cstrike/weaponglock18.c
../../shared/cstrike/weaponhegrenade.c
../../shared/cstrike/weaponknife.c
../../shared/cstrike/weaponm3.c
../../shared/cstrike/weaponm4a1.c
../../shared/cstrike/weaponmac10.c
../../shared/cstrike/weaponmp5.c
../../shared/cstrike/weaponp228.c
../../shared/cstrike/weaponp90.c
../../shared/cstrike/weaponpara.c
../../shared/cstrike/weaponscout.c
../../shared/cstrike/weaponsg550.c
../../shared/cstrike/weaponsg552.c
../../shared/cstrike/weaponsmokegrenade.c
../../shared/cstrike/weapontmp.c
../../shared/cstrike/weaponump45.c
../../shared/cstrike/weaponusp45.c
../../shared/cstrike/weaponxm1014.c
../../shared/cstrike/basegun.c
../../shared/cstrike/basemelee.c
../../shared/cstrike/weapons.c
../../shared/cstrike/equipment.c
../../shared/decals.c
../../shared/effects.c
../../shared/spraylogo.cpp
../../shared/valve/player.cpp
../../shared/pmove.c
armoury_entity.cpp
hostage_entity.cpp
func_hostage_rescue.cpp
item_suit.cpp
info_hostage_rescue.cpp
func_vip_safetyzone.cpp
info_map_parameters.cpp
../vox.c
ammo.c
../valve/damage.c
../traceattack.c
rules.c
timer.c
func_bomb_target.cpp
func_buyzone.cpp
func_escapezone.cpp
main.c
player.c
../spawn.c
spawn.c
../footsteps.c
../flashlight.c
input.c
client.c
../client.c
../vote.c
../entry.c
#endlist

View File

@ -91,8 +91,8 @@ void Spawn_RespawnClient(float fTeam)
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_WALK;
self.flags = FL_CLIENT;
self.Pain = Player_Pain;
self.Death = Player_Death;
//self.Pain = Player_Pain;
//self.Death = Player_Death;
self.iBleeds = TRUE;
self.fSlotC4Bomb = 0; // Clear the C4
self.viewzoom = 1.0; // Clear scopes

125
src/server/cstrike/armoury_entity.cpp Executable file → Normal file
View File

@ -14,6 +14,8 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
var int autocvar_fcs_nopickups = FALSE;
int iArmouryItems[19] = {
WEAPON_MP5,
WEAPON_TMP,
@ -37,24 +39,24 @@ int iArmouryItems[19] = {
};
string sArmouryModels[19] = {
"models/w_mp5.mdl",
"models/w_tmp.mdl",
"models/w_p90.mdl",
"models/w_mac10.mdl",
"models/w_ak47.mdl",
"models/w_sg552.mdl",
"models/w_m4a1.mdl",
"models/w_aug.mdl",
"models/w_scout.mdl",
"models/w_g3sg1.mdl",
"models/w_awp.mdl",
"models/w_m3.mdl",
"models/w_xm1014.mdl",
"models/w_m249.mdl",
"models/w_flashbang.mdl",
"models/w_hegrenade.mdl",
"models/w_mp5.mdl",
"models/w_tmp.mdl",
"models/w_p90.mdl",
"models/w_mac10.mdl",
"models/w_ak47.mdl",
"models/w_sg552.mdl",
"models/w_m4a1.mdl",
"models/w_aug.mdl",
"models/w_scout.mdl",
"models/w_g3sg1.mdl",
"models/w_awp.mdl",
"models/w_m3.mdl",
"models/w_xm1014.mdl",
"models/w_m249.mdl",
"models/w_flashbang.mdl",
"models/w_hegrenade.mdl",
"models/w_kevlar.mdl",
"models/w_assault.mdl",
"models/w_assault.mdl",
"models/w_smokegrenade.mdl"
};
@ -69,71 +71,14 @@ class armoury_entity:CBaseEntity
virtual void() Respawn;
};
int amoury_entity_pickup(armoury_entity item, entity player)
int
amoury_entity_pickup(armoury_entity item, entity player)
{
entity eOld = self;
self = player;
// Only MP5 til PARA
if (item.m_iItem < 14) {
if (Weapon_SlotEmpty(Weapon_GetSlot(iArmouryItems[item.m_iItem]))) {
Weapon_AddItem(iArmouryItems[item.m_iItem]);
Weapon_Draw(iArmouryItems[item.m_iItem]);
} else {
self = eOld;
return FALSE;
}
} else {
// Equipment
if (iArmouryItems[item.m_iItem] == EQUIPMENT_KEVLAR) {
if (self.armor != 100) {
self.armor = 100;
} else {
self = eOld;
return FALSE;
}
} else if (iArmouryItems[item.m_iItem] == EQUIPMENT_HELMET) {
if (self.armor == 100) {
if (!(self.iEquipment & EQUIPMENT_HELMET)) {
sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE);
} else {
self = eOld;
return FALSE;
}
} else {
if (self.iEquipment & EQUIPMENT_HELMET) {
self.armor = 100;
sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE);
} else {
self.armor = 100;
self.iEquipment = self.iEquipment | EQUIPMENT_HELMET;
sound(self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE);
}
}
} else {
int iNades = self.iAmmo_FLASHBANG + self.iAmmo_HEGRENADE + self.iAmmo_SMOKEGRENADE;
if (iNades < 3) {
if (iArmouryItems[item.m_iItem] == WEAPON_FLASHBANG) {
self.iAmmo_FLASHBANG++;
sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE);
} else if (iArmouryItems[item.m_iItem] == WEAPON_HEGRENADE) {
self.iAmmo_HEGRENADE++;
sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE);
} else if (iArmouryItems[item.m_iItem] == WEAPON_SMOKEGRENADE) {
self.iAmmo_SMOKEGRENADE++;
sound(self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE);
}
} else {
self = eOld;
return FALSE;
}
}
}
self = eOld;
return TRUE;
}
void armoury_entity::touch(void)
void
armoury_entity::touch(void)
{
if (other.classname != "player") {
return;
@ -141,23 +86,24 @@ void armoury_entity::touch(void)
if (amoury_entity_pickup(this, other)) {
m_iLeft--;
if (m_iLeft <= 0) {
Hide();
}
}
}
void armoury_entity::Respawn(void)
void
armoury_entity::Respawn(void)
{
CBaseEntity::Respawn();
setmodel(this, m_oldModel);
setsize(this, [-16,-16,0], [16,16,16]);
solid = SOLID_TRIGGER;
m_iLeft = m_iCount;
droptofloor();
}
void armoury_entity::armoury_entity(void)
void
armoury_entity::armoury_entity(void)
{
if (autocvar_fcs_nopickups == TRUE) {
remove(this);
@ -170,20 +116,15 @@ void armoury_entity::armoury_entity(void)
m_iCount = stoi(argv(i + 1));
break;
case "item":
m_iItem = stoi(argv(i + 1));
m_iItem = iArmouryItems[stoi(argv(i + 1))];
model = sArmouryModels[m_iItem];
break;
default:
break;
}
}
model = sArmouryModels[m_iItem];
precache_model(model);
CBaseEntity::CBaseEntity();
precache_model(m_oldModel);
setmodel(this, m_oldModel);
setsize(this, [-16,-16,0], [16,16,16]);
armoury_entity::Respawn();
}

View File

@ -14,218 +14,304 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
=================
SpectatorThink
var int autocvar_sv_networkeverything = FALSE;
Run every frame on every spectator
=================
*/
void Game_SpectatorThink(void)
void
Game_ClientConnect(void)
{
self.SendFlags = 1;
}
entity a;
bprint(PRINT_HIGH, sprintf("%s connected\n", self.netname));
/*
=================
ClientKill
Suicide command 'kill' executes this function.
=================
*/
void Game_ClientKill(void)
{
Damage_Apply(self, self, self.health, self.origin, TRUE, 0);
}
/*
=================
ClientConnect
Run whenever a new client joins
=================
*/
void Game_ClientConnect(void) {}
/*
=================
SpectatorConnect
Called when a spectator joins the game
=================
*/
void Game_SpectatorConnect(void)
{
//Spawn_MakeSpectator();
//Spawn_ObserverCam();
ClientConnect();
PutClientInServer();
}
/*
=================
SpectatorDisconnect
Called when a spectator leaves the game
=================
*/
void Game_SpectatorDisconnect(void)
{
Spray_RemoveAll(self);
}
/*
=================
ClientDisconnect
Run whenever a client quits
=================
*/
void Game_ClientDisconnect(void)
{
// We were part of the session
self.health = 0;
Rules_CountPlayers();
Rules_DeathCheck();
Spray_RemoveAll(self);
}
void Game_DecodeChangeParms(void)
{
g_landmarkpos[0] = parm1;
g_landmarkpos[1] = parm2;
g_landmarkpos[2] = parm3;
self.angles[0] = parm4;
self.angles[1] = parm5;
self.angles[2] = parm6;
}
void Game_SetChangeParms(void)
{
parm1 = g_landmarkpos[0];
parm2 = g_landmarkpos[1];
parm3 = g_landmarkpos[2];
parm4 = self.angles[0];
parm5 = self.angles[1];
parm6 = self.angles[2];
}
/*
=================
PutClientInServer
Puts a client into the world.
=================
*/
void Game_PutClientInServer(void)
{
if (cvar("sv_playerslots") == 1) {
entity spot;
self.SendEntity = Player_SendEntity;
Game_DecodeChangeParms();
if (startspot) {
self.origin = Landmark_GetSpot();
self.fixangle = TRUE;
} else {
spot = find(world, classname, "info_player_start");
self.origin = spot.origin;
self.angles = spot.angles;
self.fixangle = TRUE;
}
self.classname = "player";
self.health = self.max_health = 100;
forceinfokey(self, "*dead", "0");
self.takedamage = DAMAGE_YES;
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_WALK;
self.flags = FL_CLIENT;
self.Pain = Player_Pain;
self.Death = Player_Death;
self.iBleeds = TRUE;
self.pvsflags = PVSF_IGNOREPVS;
self.fSlotGrenade = 0;
self.viewzoom = 1.0;
setmodel(self, "models/player/vip/vip.mdl");
setsize(self, VEC_HULL_MIN, VEC_HULL_MAX);
self.view_ofs = VEC_PLAYER_VIEWPOS;
self.velocity = '0 0 0';
self.frame = 1; // Idle frame
self.fBombProgress = 0;
self.team = TEAM_CT;
forceinfokey(self, "*spec", "0");
return;
int playercount = 0;
for (a = world; (a = find(a, classname, "player"));) {
playercount++;
}
entity eTarget = world;
Spawn_MakeSpectator();
Spawn_ObserverCam();
self.SendEntity = Player_SendEntity;
// Because we don't want to reset these when we die
Money_AddMoney(self, autocvar_mp_startmoney);
if (cvar("mp_timelimit") > 0) {
if (autocvar_fcs_voxannounce == TRUE) {
float fTimeLeft = cvar("mp_timelimit") - (time / 60);
Vox_Singlecast(self, sprintf("we have %s minutes remaining", Vox_TimeToString(fTimeLeft)));
/* we're the first. respawn all entities? */
if (playercount == 0) {
for (a = world; (a = findfloat(a, gflags, GF_CANRESPAWN));) {
CBaseEntity caw = (CBaseEntity)a;
caw.Respawn();
}
}
}
void
Game_ClientDisconnect(void)
{
bprint(PRINT_HIGH, sprintf("%s disconnected\n", self.netname));
self.team = 0;
forceinfokey(self, "*team", "0");
/* Make this unusable */
self.solid = SOLID_NOT;
self.movetype = MOVETYPE_NONE;
self.modelindex = 0;
self.health = 0;
self.takedamage = 0;
self.SendFlags = PLAYER_MODELINDEX;
}
/*
=================
SV_RunClientCommand
Funtion that can interrupt client commands before physics are run
=================
*/
void Game_RunClientCommand(void)
void
Game_ClientKill(void)
{
/*if (clienttype(self) == CLIENTTYPE_BOT) {
((CBot)self).RunAI();
}*/
Damage_Apply(self, self, self.health, WEAPON_NONE, DMG_SKIP_ARMOR);
}
if (fGameState == GAME_FREEZE && self.health > 0) {
input_movevalues = '0 0 0';
//input_buttons = 0;
input_impulse = 0;
void
Game_PlayerPreThink(void)
{
}
void
Game_PlayerPostThink(void)
{
player pl = (player)self;
Animation_PlayerUpdate();
pl.SendFlags |= PLAYER_KEEPALIVE;
if (pl.old_modelindex != pl.modelindex) {
pl.SendFlags |= PLAYER_MODELINDEX;
}
if (pl.old_origin[0] != pl.origin[0]) {
pl.SendFlags |= PLAYER_ORIGIN;
}
if (pl.old_origin[1] != pl.origin[1]) {
pl.SendFlags |= PLAYER_ORIGIN;
}
if (pl.old_origin[2] != pl.origin[2]) {
pl.SendFlags |= PLAYER_ORIGIN_Z;
}
if (pl.old_angles[0] != pl.angles[0]) {
pl.SendFlags |= PLAYER_ANGLES_X;
}
if (pl.old_angles[1] != pl.angles[1]) {
pl.SendFlags |= PLAYER_ANGLES_Y;
}
if (pl.old_angles[2] != pl.angles[2]) {
pl.SendFlags |= PLAYER_ANGLES_Z;
}
if (pl.old_velocity[0] != pl.velocity[0]) {
pl.SendFlags |= PLAYER_VELOCITY;
}
if (pl.old_velocity[1] != pl.velocity[1]) {
pl.SendFlags |= PLAYER_VELOCITY;
}
if (pl.old_velocity[2] != pl.velocity[2]) {
pl.SendFlags |= PLAYER_VELOCITY_Z;
}
if (pl.old_flags != pl.flags) {
pl.SendFlags |= PLAYER_FLAGS;
}
if (pl.old_activeweapon != pl.activeweapon) {
pl.SendFlags |= PLAYER_WEAPON;
}
if (pl.old_items != pl.g_items) {
pl.SendFlags |= PLAYER_ITEMS;
}
if (pl.old_health != pl.health) {
pl.SendFlags |= PLAYER_HEALTH;
}
if (pl.old_armor != pl.armor) {
pl.SendFlags |= PLAYER_ARMOR;
}
if (pl.old_movetype != pl.movetype) {
pl.SendFlags |= PLAYER_MOVETYPE;
}
if (pl.old_viewofs != pl.view_ofs[2]) {
pl.SendFlags |= PLAYER_VIEWOFS;
}
if (pl.old_baseframe != pl.baseframe) {
pl.SendFlags |= PLAYER_BASEFRAME;
}
if (pl.old_frame != pl.frame) {
pl.SendFlags |= PLAYER_FRAME;
}
if (pl.old_a_ammo1 != pl.a_ammo1) {
pl.SendFlags |= PLAYER_AMMO1;
}
if (pl.old_a_ammo2 != pl.a_ammo2) {
pl.SendFlags |= PLAYER_AMMO2;
}
if (pl.old_a_ammo3 != pl.a_ammo3) {
pl.SendFlags |= PLAYER_AMMO3;
}
// The individual zones will just override this behavior
self.fInBombZone = FALSE;
self.fInBuyZone = FALSE;
self.fInHostageZone = FALSE;
self.fInEscapeZone = FALSE;
self.fInVIPZone = FALSE;
pl.old_modelindex = pl.modelindex;
pl.old_origin = pl.origin;
pl.old_angles = pl.angles;
pl.old_velocity = pl.velocity;
pl.old_flags = pl.flags;
pl.old_activeweapon = pl.activeweapon;
pl.old_items = pl.g_items;
pl.old_health = pl.health;
pl.old_armor = pl.armor;
pl.old_movetype = pl.movetype;
pl.old_viewofs = pl.view_ofs[2];
pl.old_baseframe = pl.baseframe;
pl.old_frame = pl.frame;
pl.old_a_ammo1 = pl.a_ammo1;
pl.old_a_ammo2 = pl.a_ammo2;
pl.old_a_ammo3 = pl.a_ammo3;
}
void
Game_RunClientCommand(void)
{
Footsteps_Update();
QPhysics_Run(self);
}
void Game_SetNewParms(void)
void
Game_DecodeChangeParms(void)
{
player pl = (player)self;
g_landmarkpos[0] = parm1;
g_landmarkpos[1] = parm2;
g_landmarkpos[2] = parm3;
pl.angles[0] = parm4;
pl.angles[1] = parm5;
pl.angles[2] = parm6;
pl.velocity[0] = parm7;
pl.velocity[1] = parm8;
pl.velocity[2] = parm9;
pl.g_items = parm10;
pl.activeweapon = parm11;
}
/*
=================
Client_SendEvent
Send a game event
=================
*/
void Client_SendEvent(entity eClient, float fEVType)
void
Game_SetChangeParms(void)
{
Weapon_UpdateCurrents();
player pl = (player)self;
parm1 = g_landmarkpos[0];
parm2 = g_landmarkpos[1];
parm3 = g_landmarkpos[2];
parm4 = pl.angles[0];
parm5 = pl.angles[1];
parm6 = pl.angles[2];
parm7 = pl.velocity[0];
parm8 = pl.velocity[1];
parm9 = pl.velocity[2];
parm10 = pl.g_items;
parm11 = pl.activeweapon;
}
void
Game_PutClientInServer(void)
{
if (self.classname != "player") {
spawnfunc_player();
}
player pl = (player)self;
entity spot;
pl.classname = "player";
pl.health = self.max_health = 100;
pl.takedamage = DAMAGE_YES;
pl.solid = SOLID_SLIDEBOX;
pl.movetype = MOVETYPE_WALK;
pl.flags = FL_CLIENT;
pl.viewzoom = 1.0;
pl.model = "models/player.mdl";
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, fEVType);
WriteByte(MSG_MULTICAST, num_for_edict(eClient));
msg_entity = eClient;
multicast(self.origin, MULTICAST_PVS);
string mymodel = infokey(pl, "model");
if (mymodel) {
mymodel = sprintf("models/player/%s/%s.mdl", mymodel, mymodel);
if (whichpack(mymodel)) {
pl.model = mymodel;
}
}
setmodel(pl, pl.model);
setsize(pl, VEC_HULL_MIN, VEC_HULL_MAX);
pl.view_ofs = VEC_PLAYER_VIEWPOS;
pl.velocity = [0,0,0];
pl.gravity = __NULL__;
pl.frame = 1;
pl.SendEntity = Player_SendEntity;
pl.SendFlags = UPDATE_ALL;
pl.customphysics = Empty;
pl.Pain = Player_Pain;
pl.Death = Player_Death;
pl.iBleeds = TRUE;
forceinfokey(pl, "*spec", "0");
forceinfokey(self, "*deaths", ftos(self.deaths));
if (cvar("sv_playerslots") == 1) {
Game_DecodeChangeParms();
if (startspot != "") {
setorigin(pl, Landmark_GetSpot());
} else {
spot = find(world, classname, "info_player_start");
setorigin(pl, spot.origin);
pl.angles = spot.angles;
pl.fixangle = TRUE;
}
} else {
spot = Spawn_SelectRandom("info_player_deathmatch");
setorigin(pl, spot.origin);
pl.angles = spot.angles;
pl.fixangle = TRUE;
pl.g_items |= ITEM_SUIT;
}
}
void
SV_SendChat(entity sender, string msg, entity eEnt, float fType)
{
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, fType == 0 ? EV_CHAT:EV_CHAT_TEAM);
WriteByte(MSG_MULTICAST, num_for_edict(sender) - 1);
WriteByte(MSG_MULTICAST, sender.team);
WriteString(MSG_MULTICAST, msg);
if (eEnt) {
msg_entity = eEnt;
multicast([0,0,0], MULTICAST_ONE);
} else {
multicast([0,0,0], MULTICAST_ALL);
}
localcmd(sprintf("echo [SERVER] %s: %s\n", sender.netname, msg));
}
void
Game_ParseClientCommand(string cmd)
{
tokenize(cmd);
if (argv(1) == "timeleft") {
string msg;
string timestring;
float timeleft;
timeleft = cvar("mp_timelimit") - (time / 60);
timestring = Vox_TimeToString(timeleft);
msg = sprintf("we have %s minutes remaining", timestring);
Vox_Singlecast(self, msg);
return;
}
if (argv(0) == "say") {
SV_SendChat(self, argv(1), world, 0);
return;
} else if (argv(0) == "say_team") {
entity a;
for (a = world; (a = find(a, classname, "player"));) {
if (a.team == self.team) {
SV_SendChat(self, argv(1), a, 1);
}
}
return;
}
clientcommand(self, cmd);
}
void
Game_SetNewParms(void)
{
}

View File

@ -0,0 +1,89 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* after a level-change is done we need to pick up the scraps and fill the
* info back in. */
void
Gamerules_DecodeChangeParms(player pl)
{
g_landmarkpos[0] = parm1;
g_landmarkpos[1] = parm2;
g_landmarkpos[2] = parm3;
pl.angles[0] = parm4;
pl.angles[1] = parm5;
pl.angles[2] = parm6;
pl.velocity[0] = parm7;
pl.velocity[1] = parm8;
pl.velocity[2] = parm9;
pl.g_items = parm10;
pl.activeweapon = parm11;
}
/* prepare the client-info for level-transition */
void
Gamerules_SetChangeParms(player pl)
{
parm1 = g_landmarkpos[0];
parm2 = g_landmarkpos[1];
parm3 = g_landmarkpos[2];
parm4 = pl.angles[0];
parm5 = pl.angles[1];
parm6 = pl.angles[2];
parm7 = pl.velocity[0];
parm8 = pl.velocity[1];
parm9 = pl.velocity[2];
parm10 = pl.g_items;
parm11 = pl.activeweapon;
}
/* yuck, whenever 'changelevel' does not happen. */
void
Gamerules_SetNewParms(void)
{
parm1 = parm2 = parm3 = parm4 = parm5 = parm6 = parm7 =
parm8 = parm9 = parm10 = parm11 = parm12 = parm13 = parm14 =
parm15 = parm16 = parm17 = parm18 = parm19 = parm20 = parm21 =
parm22 = parm23 = parm24 = parm25 = parm26 = parm27 = parm28 =
parm29 = parm30 = 0;
}
/* called when the player first spawns/respawns */
void
Gamerules_Spawn(player pl)
{
entity spot;
if (cvar("sv_playerslots") == 1 || cvar("coop") == 1) {
if (startspot != "") {
Gamerules_DecodeChangeParms(pl);
setorigin(pl, Landmark_GetSpot());
} else {
Gamerules_SetNewParms();
spot = find(world, classname, "info_player_start");
setorigin(pl, spot.origin);
pl.angles = spot.angles;
pl.fixangle = TRUE;
}
Weapons_RefreshAmmo(pl);
} else {
Gamerules_SetNewParms();
Gamerules_DecodeChangeParms(pl);
spot = Spawn_SelectRandom("info_player_deathmatch");
setorigin(pl, spot.origin);
pl.angles = spot.angles;
pl.fixangle = TRUE;
}
}

View File

@ -14,36 +14,17 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
=================
Input_Handle
Handles impulse and whatnot
=================
*/
void Game_Input(void)
void
Game_Input(void)
{
// Dead, specatator
if (self.health <= 0) {
/*if (self.button2) {
if (infokey(self, "*spectator") == "0") {
forceinfokey(self, "*spectator", "1");
} else {
forceinfokey(self, "*spectator", "1");
}
}*/
return;
}
// TODO: Make this fast switch only
if (self.impulse == 3) {
Weapon_Switch(SLOT_MELEE);
} else if (self.impulse == 2) {
Weapon_Switch(SLOT_SECONDARY);
} else if (self.impulse == 1) {
Weapon_Switch(SLOT_PRIMARY);
} else if (self.impulse == 4) {
Weapon_Switch(SLOT_GRENADE);
if (input_buttons & INPUT_BUTTON0) {
Weapons_Primary();
} else if (input_buttons & INPUT_BUTTON4) {
Weapons_Reload();
} else if (input_buttons & INPUT_BUTTON3) {
Weapons_Secondary();
} else {
Weapons_Release();
}
if (input_buttons & INPUT_BUTTON5) {
@ -51,22 +32,55 @@ void Game_Input(void)
} else {
Player_UseUp();
}
if (input_buttons & INPUT_BUTTON0) {
if (fGameState != GAME_FREEZE) {
Weapon_PrimaryAttack(self.weapon);
}
} else if (input_buttons & INPUT_BUTTON4) {
Weapon_Reload(self.weapon);
} else if (input_buttons & INPUT_BUTTON3) {
Weapon_SecondaryAttack(self.weapon);
} else {
Weapon_Release();
}
if (self.impulse == 100) {
Flashlight_Toggle();
}
self.impulse = 0;
if (cvar("sv_cheats") == 1) {
player pl = (player)self;
if (self.impulse == 101) {
pl.health = 100;
pl.armor = 100;
Weapons_AddItem(pl, WEAPON_M3);
Weapons_AddItem(pl, WEAPON_XM1014);
Weapons_AddItem(pl, WEAPON_MP5);
Weapons_AddItem(pl, WEAPON_P90);
Weapons_AddItem(pl, WEAPON_UMP45);
Weapons_AddItem(pl, WEAPON_MAC10);
Weapons_AddItem(pl, WEAPON_TMP);
Weapons_AddItem(pl, WEAPON_AK47);
Weapons_AddItem(pl, WEAPON_SG552);
Weapons_AddItem(pl, WEAPON_M4A1);
Weapons_AddItem(pl, WEAPON_AUG);
Weapons_AddItem(pl, WEAPON_SCOUT);
Weapons_AddItem(pl, WEAPON_AWP);
Weapons_AddItem(pl, WEAPON_G3SG1);
Weapons_AddItem(pl, WEAPON_SG550);
Weapons_AddItem(pl, WEAPON_PARA);
Weapons_AddItem(pl, WEAPON_C4BOMB);
Weapons_AddItem(pl, WEAPON_FLASHBANG);
Weapons_AddItem(pl, WEAPON_HEGRENADE);
Weapons_AddItem(pl, WEAPON_SMOKEGRENADE);
Weapons_AddItem(pl, WEAPON_USP45);
Weapons_AddItem(pl, WEAPON_GLOCK18);
Weapons_AddItem(pl, WEAPON_DEAGLE);
Weapons_AddItem(pl, WEAPON_P228);
Weapons_AddItem(pl, WEAPON_ELITES);
Weapons_AddItem(pl, WEAPON_FIVESEVEN);
Weapons_AddItem(pl, WEAPON_KNIFE);
}
if (self.impulse == 102) {
// Respawn all the entities
for (entity a = world; (a = findfloat(a, gflags, GF_CANRESPAWN));) {
CBaseEntity caw = (CBaseEntity)a;
caw.Respawn();
}
bprint(PRINT_HIGH, "Respawning all map entities...\n");
}
}
self.impulse = 0;
}

View File

@ -24,18 +24,21 @@ class item_suit:CBaseTrigger
void item_suit::touch(void)
{
if (other.classname != "player") {
player pl = (player)other;
if (pl.classname != "player") {
return;
}
player pl = (player)other;
/*if (pl.g_items & ITEM_SUIT) {
if (pl.g_items & ITEM_SUIT) {
return;
}*/
}
sound(other, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM);
/*pl.g_items |= ITEM_SUIT;*/
pl.g_items |= ITEM_SUIT;
CBaseTrigger::UseTargets();
if (cvar("sv_playerslots") == 1) {
remove(self);
} else {

View File

@ -14,168 +14,44 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
string sPainSounds[5] = {
"player/pl_pain2.wav",
"player/pl_pain4.wav",
"player/pl_pain5.wav",
"player/pl_pain6.wav",
"player/pl_pain7.wav"
};
/*
=================
Player_SendEntity
=================
*/
float Player_SendEntity(entity ePEnt, float fChanged)
void Player_Pain(int hit)
{
/* If dead */
if (self.health <= 0 && ePEnt != self) {
return FALSE;
}
/* Fix CT/VIP team */
float t1, t2;
t1 = ePEnt.team;
t2 = self.team;
if (t1 == TEAM_VIP) {
t1 = TEAM_CT;
} else if (t2 == TEAM_VIP) {
t2 = TEAM_CT;
}
/* Always make team-mates visible */
if (t1 != t2 && ePEnt.health > 0) {
/* Can we even see them? */
if (!checkpvs(ePEnt.origin, self)) {
return FALSE;
} else {
/* We're in the same PVS, but we might still not be able to see them */
traceline(self.origin, ePEnt.origin, FALSE, self);
if (trace_ent != ePEnt) {
return FALSE;
}
}
}
WriteByte(MSG_ENTITY, ENT_PLAYER);
WriteShort(MSG_ENTITY, self.modelindex);
WriteCoord(MSG_ENTITY, self.origin[0]);
WriteCoord(MSG_ENTITY, self.origin[1]);
WriteCoord(MSG_ENTITY, self.origin[2]);
WriteCoord(MSG_ENTITY, self.v_angle[0]);
WriteCoord(MSG_ENTITY, self.angles[1]);
WriteCoord(MSG_ENTITY, self.angles[2]);
WriteCoord(MSG_ENTITY, self.velocity[0]);
WriteCoord(MSG_ENTITY, self.velocity[1]);
WriteCoord(MSG_ENTITY, self.velocity[2]);
WriteFloat(MSG_ENTITY, self.flags);
WriteFloat(MSG_ENTITY, self.pmove_flags);
WriteByte(MSG_ENTITY, self.weapon);
WriteByte(MSG_ENTITY, self.health);
WriteFloat(MSG_ENTITY, self.movetype);
WriteFloat(MSG_ENTITY, self.view_ofs[2]);
WriteFloat(MSG_ENTITY, self.viewzoom);
WriteFloat(MSG_ENTITY, self.jumptime);
WriteFloat(MSG_ENTITY, self.teleport_time);
return TRUE;
}
/*
=================
Player_Pain
=================
*/
void Player_Pain(int iHitBody)
void Player_Death(int hit)
{
/*
if (iHitBody == BODY_HEAD) {
Animation_PlayerTopTemp(ANIM_HEAD_FLINCH, 0.25f);
} else {
Animation_PlayerTopTemp(ANIM_GUT_FLINCH, 0.25f);
}*/
player pl = (player)self;
pl.movetype = MOVETYPE_NONE;
pl.solid = SOLID_NOT;
pl.takedamage = DAMAGE_NO;
pl.flags &= ~FL_FLASHLIGHT;
pl.armor = pl.activeweapon = pl.g_items = 0;
sound(self, CHAN_VOICE, sPainSounds[ floor(random() * 5) ], 1, ATTN_IDLE);
self.velocity = '0 0 0';
}
pl.think = PutClientInServer;
pl.nextthink = time + 4.0f;
sound(pl, CHAN_AUTO, "fvox/flatline.wav", 1.0, ATTN_NORM);
/*
=================
Player_Death
=================
*/
void Player_Death(int iHitBody)
{
if (iHitBody == BODY_HEAD) {
sound(self, CHAN_VOICE, sprintf("player/headshot%d.wav", floor((random() * 3) + 1)), 1, ATTN_NORM);
} else {
sound(self, CHAN_VOICE, sprintf("player/die%d.wav", floor((random() * 3) + 1)), 1, ATTN_NORM);
}
// Drop a corpse
entity eCorpse = spawn();
eCorpse.classname = "remove_me";
setorigin(eCorpse, self.origin);
setmodel(eCorpse, self.model);
setsize(eCorpse, self.mins, self.maxs);
eCorpse.angles = [ 0, self.angles[1], 0 ];
eCorpse.movetype = MOVETYPE_BOUNCE;
// Drop primary weapon as well as the bomb if present
if (self.fSlotPrimary) {
Weapon_DropWeapon(SLOT_PRIMARY);
} else {
if (self.fSlotSecondary) {
Weapon_DropWeapon(SLOT_SECONDARY);
}
}
if (self.fSlotGrenade) {
Weapon_DropWeapon(SLOT_GRENADE);
}
// Make ourselves disappear
self.modelindex = 0;
if (self.flags & FL_CROUCHING) {
eCorpse.frame = ANIM_CROUCH_DIE;
} else {
switch (iHitBody) {
case BODY_HEAD:
eCorpse.frame = ANIM_DIE_HEAD;
break;
case BODY_STOMACH:
eCorpse.frame = ANIM_DIE_GUT;
break;
case BODY_LEGLEFT:
case BODY_ARMLEFT:
eCorpse.frame = ANIM_DIE_LEFT;
break;
case BODY_LEGRIGHT:
case BODY_ARMRIGHT:
eCorpse.frame = ANIM_DIE_RIGHT;
break;
default:
eCorpse.frame = ANIM_DEATH1 + floor(random() * 3);
break;
}
}
Spawn_MakeSpectator();
self.classname = "player";
self.health = 0;
forceinfokey(self, "*dead", "1");
forceinfokey(self, "*team", ftos(self.team));
Rules_CountPlayers();
/* In Assassination, all Terrorists receive a $2500
* reward if they won by killing the VIP. */
if (self.team == TEAM_VIP) {
Rules_RoundOver(TEAM_T, 2500, FALSE);
if (pl.health < -50) {
pl.health = 0;
Effect_GibHuman(pl.origin);
return;
}
Rules_DeathCheck();
pl.health = 0;
/* Let's handle corpses on the clientside */
entity corpse = spawn();
setorigin(corpse, pl.origin + [0,0,32]);
setmodel(corpse, pl.model);
setsize(corpse, VEC_HULL_MIN, VEC_HULL_MAX);
corpse.movetype = MOVETYPE_TOSS;
corpse.solid = SOLID_TRIGGER;
corpse.modelindex = pl.modelindex;
corpse.frame = ANIM_DIESIMPLE;
corpse.angles = pl.angles;
corpse.velocity = pl.velocity;
}
/*
@ -199,12 +75,12 @@ Player_UseDown
*/
void Player_UseDown(void)
{
if (self.health <= 0) {
if (self.health <= 0) {
return;
} else if (!(self.gflags & GF_USE_RELEASED)) {
return;
}
vector vSource;
makevectors(self.v_angle);
@ -213,7 +89,7 @@ void Player_UseDown(void)
if (trace_ent.PlayerUse) {
self.gflags &= ~GF_USE_RELEASED;
UseWorkaround(trace_ent);
/* Some entities want to support Use spamming */
@ -231,37 +107,99 @@ void Player_UseDown(void)
Player_UseUp
====================
*/
void Player_UseUp(void)
{
void Player_UseUp(void) {
if (!(self.gflags & GF_USE_RELEASED)) {
self.gflags |= GF_USE_RELEASED;
self.fProgressBar = 0;
}
}
/*
=================
PlayerPreThink
Run before physics
Player_SendEntity
=================
*/
void Game_PlayerPreThink(void)
{
BaseGun_ShotMultiplierUpdate();
}
/*
=================
PlayerPreThink
Run after physics
=================
*/
void Game_PlayerPostThink(void)
float Player_SendEntity(entity ePEnt, float fChanged)
{
Animation_PlayerUpdate();
Footsteps_Update();
self.SendFlags = 1;
player pl = (player)self;
if (pl.health <= 0 && ePEnt != pl) {
return FALSE;
}
WriteByte(MSG_ENTITY, ENT_PLAYER);
WriteFloat(MSG_ENTITY, fChanged);
/* really trying to get our moneys worth with 23 bits of mantissa */
if (fChanged & PLAYER_MODELINDEX) {
WriteShort(MSG_ENTITY, pl.modelindex);
}
if (fChanged & PLAYER_ORIGIN) {
WriteCoord(MSG_ENTITY, pl.origin[0]);
WriteCoord(MSG_ENTITY, pl.origin[1]);
}
if (fChanged & PLAYER_ORIGIN_Z) {
WriteCoord(MSG_ENTITY, pl.origin[2]);
}
if (fChanged & PLAYER_ANGLES_X) {
WriteFloat(MSG_ENTITY, pl.v_angle[0]);
}
if (fChanged & PLAYER_ANGLES_Y) {
WriteFloat(MSG_ENTITY, pl.angles[1]);
}
if (fChanged & PLAYER_ANGLES_Z) {
WriteFloat(MSG_ENTITY, pl.angles[2]);
}
if (fChanged & PLAYER_VELOCITY) {
WriteCoord(MSG_ENTITY, pl.velocity[0]);
WriteCoord(MSG_ENTITY, pl.velocity[1]);
}
if (fChanged & PLAYER_VELOCITY_Z) {
WriteCoord(MSG_ENTITY, pl.velocity[2]);
}
if (fChanged & PLAYER_FLAGS) {
WriteFloat(MSG_ENTITY, pl.flags);
}
if (fChanged & PLAYER_WEAPON) {
WriteByte(MSG_ENTITY, pl.activeweapon);
}
if (fChanged & PLAYER_ITEMS) {
WriteFloat(MSG_ENTITY, (__variant)pl.g_items);
}
if (fChanged & PLAYER_HEALTH) {
WriteByte(MSG_ENTITY, pl.health);
}
if (fChanged & PLAYER_ARMOR) {
WriteByte(MSG_ENTITY, pl.armor);
}
if (fChanged & PLAYER_MOVETYPE) {
WriteByte(MSG_ENTITY, pl.movetype);
}
if (fChanged & PLAYER_VIEWOFS) {
WriteFloat(MSG_ENTITY, pl.view_ofs[2]);
}
if (fChanged & PLAYER_BASEFRAME) {
WriteByte(MSG_ENTITY, pl.baseframe);
}
if (fChanged & PLAYER_FRAME) {
WriteByte(MSG_ENTITY, pl.frame);
}
if (fChanged & PLAYER_AMMO1) {
WriteByte(MSG_ENTITY, pl.a_ammo1);
}
if (fChanged & PLAYER_AMMO2) {
WriteByte(MSG_ENTITY, pl.a_ammo2);
}
if (fChanged & PLAYER_AMMO3) {
WriteByte(MSG_ENTITY, pl.a_ammo3);
}
return TRUE;
}
void Weapons_Draw(void);
void CSEv_PlayerSwitchWeapon_f(float w)
{
player pl = (player)self;
pl.activeweapon = (int)w;
Weapons_Draw();
}

View File

@ -2,91 +2,86 @@
#pragma progs_dat "../../../cstrike/data.pk3dir/progs.dat"
#define QWSSQC
#define CSTRIKE
#define VALVE
#includelist
../../shared/fteextensions.qc
../../shared/defs.h
defs.h
../../shared/cstrike/defs.h
../valve/defs.h
../../shared/math.h
../../shared/materials.h
../../shared/events.h
../../shared/entities.h
../../shared/valve/animations.h
../defs.h
defsfields.h
../plugins.c
../logging.c
../nodes.c
../skill.c
../sentences.c
../../gs-entbase/server.src
money.c
../../shared/cstrike/animations.c
../../shared/cstrike/radio.c
../../shared/cstrike/weaponak47.c
../../shared/cstrike/weaponaug.c
../../shared/cstrike/weaponawp.c
../../shared/cstrike/weaponc4bomb.c
../../shared/cstrike/weapondeagle.c
../../shared/cstrike/weaponelites.c
../../shared/cstrike/weaponfiveseven.c
../../shared/cstrike/weaponflashbang.c
../../shared/cstrike/weapong3sg1.c
../../shared/cstrike/weaponglock18.c
../../shared/cstrike/weaponhegrenade.c
../../shared/cstrike/weaponknife.c
../../shared/cstrike/weaponm3.c
../../shared/cstrike/weaponm4a1.c
../../shared/cstrike/weaponmac10.c
../../shared/cstrike/weaponmp5.c
../../shared/cstrike/weaponp228.c
../../shared/cstrike/weaponp90.c
../../shared/cstrike/weaponpara.c
../../shared/cstrike/weaponscout.c
../../shared/cstrike/weaponsg550.c
../../shared/cstrike/weaponsg552.c
../../shared/cstrike/weaponsmokegrenade.c
../../shared/cstrike/weapontmp.c
../../shared/cstrike/weaponump45.c
../../shared/cstrike/weaponusp45.c
../../shared/cstrike/weaponxm1014.c
../../shared/cstrike/basegun.c
../../shared/cstrike/basemelee.c
../../shared/cstrike/weapons.c
../../shared/cstrike/equipment.c
../../shared/decals.c
../../shared/effects.c
../../shared/spraylogo.cpp
../../shared/valve/player.cpp
../../shared/cstrike/player.cpp
../cstrike/player.c
../../shared/pmove.c
../valve/spectator.c
armoury_entity.cpp
hostage_entity.cpp
func_hostage_rescue.cpp
item_suit.cpp
info_hostage_rescue.cpp
func_vip_safetyzone.cpp
info_map_parameters.cpp
../../shared/cstrike/items.h
../../shared/valve/weapon_common.h
../../shared/cstrike/weapons.h
../../shared/cstrike/w_knife.c
../../shared/cstrike/w_usp45.c
../../shared/cstrike/w_glock18.c
../../shared/cstrike/w_deagle.c
../../shared/cstrike/w_p228.c
../../shared/cstrike/w_elites.c
../../shared/cstrike/w_fiveseven.c
../../shared/cstrike/w_m3.c
../../shared/cstrike/w_xm1014.c
../../shared/cstrike/w_mp5.c
../../shared/cstrike/w_p90.c
../../shared/cstrike/w_ump45.c
../../shared/cstrike/w_mac10.c
../../shared/cstrike/w_tmp.c
../../shared/cstrike/w_ak47.c
../../shared/cstrike/w_sg552.c
../../shared/cstrike/w_m4a1.c
../../shared/cstrike/w_aug.c
../../shared/cstrike/w_scout.c
../../shared/cstrike/w_awp.c
../../shared/cstrike/w_g3sg1.c
../../shared/cstrike/w_sg550.c
../../shared/cstrike/w_para.c
../../shared/cstrike/w_c4bomb.c
../../shared/cstrike/w_flashbang.c
../../shared/cstrike/w_hegrenade.c
../../shared/cstrike/w_smokegrenade.c
../../shared/cstrike/weapons.c
../valve/items.cpp
../../shared/valve/weapon_common.c
../vox.c
ammo.c
damage.c
../traceattack.c
rules.c
timer.c
../cstrike/item_suit.cpp
func_bomb_target.cpp
func_buyzone.cpp
func_escapezone.cpp
main.c
player.c
../spawn.c
spawn.c
../vox.c
../../shared/valve/animations.c
../cstrike/gamerules.c
../cstrike/client.c
../client.c
../valve/server.c
../server.c
../valve/damage.c
../traceattack.c
../valve/rules.c
../footsteps.c
../flashlight.c
input.c
client.c
../client.c
../cstrike/input.c
../valve/spawn.c
../vote.c
../entry.c
#endlist

View File

@ -41,7 +41,7 @@ int BaseMelee_Attack( void ) {
Effect_Impact( IMPACT_FLESH, trace_endpos, trace_plane_normal );
sound( self, CHAN_WEAPON, sprintf( "weapons/knife_hit%d.wav", floor( ( random() * 4 ) + 1 ) ), 1, ATTN_NORM );
}
Damage_Apply( trace_ent, self, wptTable[ self.weapon ].iDamage, trace_endpos, FALSE, self.weapon);
Damage_Apply( trace_ent, self, wptTable[ self.weapon ].iDamage, FALSE, self.weapon);
} else {
Effect_Impact( IMPACT_MELEE, trace_endpos, trace_plane_normal );
}

View File

@ -0,0 +1,124 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
equipmentinfo_t eqptTable [ CS_EQUIPMENT_COUNT ] = {
{ EQUIPMENT_KEVLAR, 650 },
{ EQUIPMENT_HELMET, 1000 },
{ WEAPON_FLASHBANG, 300 },
{ WEAPON_HEGRENADE, 300 },
{ WEAPON_SMOKEGRENADE, 300 },
{ EQUIPMENT_DEFUSALKIT, 200 },
{ EQUIPMENT_NIGHTVISION, 1250 },
};
#ifdef SSQC
void CSEv_PlayerBuyEquipment_f( float fID ) {
if ( Rules_BuyingPossible() == FALSE ) {
return;
}
if ( ( self.fMoney - eqptTable[ fID ].iPrice ) >= 0 ) {
if ( eqptTable[ fID ].iID == EQUIPMENT_DEFUSALKIT ) {
if ( self.team == TEAM_T ) { return; }
if ( !( self.iEquipment & EQUIPMENT_DEFUSALKIT ) ) {
self.iEquipment |= EQUIPMENT_DEFUSALKIT;
Money_AddMoney( self, -200 );
sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE );
} else {
centerprint( self, "You already have a defusal kit!" );
}
} else if ( eqptTable[ fID ].iID == EQUIPMENT_NIGHTVISION ) {
if ( !( self.iEquipment & EQUIPMENT_NIGHTVISION ) ) {
self.iEquipment |= EQUIPMENT_NIGHTVISION;
Money_AddMoney( self, -1250 );
sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE );
} else {
centerprint( self, "You already have nightvision goggles!" );
}
} else if ( eqptTable[ fID ].iID == WEAPON_HEGRENADE ) {
if ( self.iAmmo_HEGRENADE < 2 ) {
self.iAmmo_HEGRENADE++;
Money_AddMoney( self, -300 );
sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE );
} else {
centerprint( self, "You can't carry any more!" );
}
} else if ( eqptTable[ fID ].iID == WEAPON_FLASHBANG ) {
if ( self.iAmmo_FLASHBANG < 2 ) {
self.iAmmo_FLASHBANG++;
Money_AddMoney( self, -300 );
sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE );
} else {
centerprint( self, "You can't carry any more!" );
}
} else if ( eqptTable[ fID ].iID == WEAPON_SMOKEGRENADE ) {
if ( self.iAmmo_SMOKEGRENADE < 2 ) {
self.iAmmo_SMOKEGRENADE++;
Money_AddMoney( self, -300 );
sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE );
} else {
centerprint( self, "You can't carry any more!" );
}
} else if ( eqptTable[ fID ].iID == EQUIPMENT_KEVLAR ) {
if ( self.armor == 100 ) {
// You already own kevlar etc.
centerprint( self, "You already have kevlar!" );
} else {
self.armor = 100;
Money_AddMoney( self, -650 );
}
sound( self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE );
self.fAttackFinished = time + 1.0;
return;
} else if ( eqptTable[ fID ].iID == EQUIPMENT_HELMET ) {
if ( self.armor == 100 ) {
if ( self.iEquipment & EQUIPMENT_HELMET ) {
// You already have full kevlar and a helmet
centerprint( self, "You already have kevlar and a helmet!" );
} else {
// You have full kevlar, but no helmet
Money_AddMoney( self, -350 );
sound( self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE );
centerprint( self, "You already have some kevlar,\nand now you've bought a helmet!" );
self.iEquipment = self.iEquipment | EQUIPMENT_HELMET;
}
} else {
if ( self.iEquipment & EQUIPMENT_HELMET ) {
// Only get kevlar
self.armor = 100;
Money_AddMoney( self, -650 );
sound( self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE );
centerprint( self, "You already have a helmet,\nand now you've bought some kevlar!" );
} else {
// Get both
self.armor = 100;
self.iEquipment = self.iEquipment | EQUIPMENT_HELMET;
Money_AddMoney( self, -1000 );
sound( self, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_IDLE );
}
}
self.fAttackFinished = time + 1.0;
return;
}
} else {
centerprint( self, "You have insufficient funds!" );
}
self.fAttackFinished = time + 1.0;
}
#endif

View File

@ -0,0 +1,129 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
int input_sequence;
class player:CBaseEntity
{
float health;
float armor;
/* When the weapon is done firing */
float w_attack_next;
/* When to play the next idle animation */
float w_idle_next;
/* Magazine/Clip */
int a_ammo1;
/* Rest in the inventory */
int a_ammo2;
/* Special ammo */
int a_ammo3;
/* We can't use the default .items field, because FTE will assume
* effects of some bits. Such as invisibility, quad, etc. */
int g_items;
float activeweapon;
float viewzoom;
vector view_ofs;
float weapontime;
/* any mods that use hooks */
entity hook;
/* Weapon specific */
int usp45_mag;
int glock18_mag;
int deagle_mag;
int p228_mag;
int elites_mag;
int fiveseven_mag;
int m3_mag;
int xm1014_mag;
int mp5_mag;
int p90_mag;
int ump45_mag;
int mac10_mag;
int tmp_mag;
int ak47_mag;
int sg552_mag;
int m4a1_mag;
int aug_mag;
int scout_mag;
int awp_mag;
int g3sg1_mag;
int sg550_mag;
int para_mag;
#ifdef CSQC
/* External model */
entity p_model;
int playertype;
int p_hand_bone;
int p_model_bone;
float pitch;
float lastweapon;
/* Prediction */
vector net_origin;
vector net_velocity;
float net_flags;
float net_w_attack_next;
float net_w_idle_next;
float net_jumptime;
float net_teleport_time;
float net_weapontime;
float net_viewzoom;
int net_ammo1;
int net_ammo2;
int net_ammo3;
int sequence;
virtual void() gun_offset;
virtual void() draw;
virtual float() predraw;
virtual void() postdraw;
#else
int ammo_50ae;
int ammo_762mm;
int ammo_556mm;
int ammo_556mmbox;
int ammo_338mag;
int ammo_9mm;
int ammo_buckshot;
int ammo_45acp;
int ammo_357sig;
int ammo_57mm;
/* conditional networking */
int old_modelindex;
vector old_origin;
vector old_angles;
vector old_velocity;
int old_flags;
int old_activeweapon;
int old_items;
int old_health;
int old_armor;
int old_movetype;
int old_viewofs;
int old_baseframe;
int old_frame;
int old_a_ammo1;
int old_a_ammo2;
int old_a_ammo3;
#endif
};

317
src/shared/cstrike.old/radio.c Executable file
View File

@ -0,0 +1,317 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
enum {
RADIO_BLOW,
RADIO_BOMBDEF,
RADIO_BOMBPL,
RADIO_CIRCLEBACK,
RADIO_CLEAR,
RADIO_COM_FOLLOWCOM,
RADIO_COM_GETINPOS,
RADIO_COM_GO,
RADIO_COM_REPORTIN,
RADIO_CT_AFFIRM,
RADIO_CT_BACKUP,
RADIO_CT_COVERME,
RADIO_CT_ENEMYS,
RADIO_CT_FIREINHOLE,
RADIO_CT_IMHIT,
RADIO_CT_INPOS,
RADIO_CT_POINT,
RADIO_CT_REPORTINGIN,
RADIO_CTWIN,
RADIO_ENEMYDOWN,
RADIO_FALLBACK,
RADIO_FIREASSIS,
RADIO_FOLLOWME,
RADIO_GETOUT,
RADIO_GO,
RADIO_HITASSIST,
RADIO_HOSDOWN,
RADIO_LETSGO,
RADIO_LOCKNLOAD,
RADIO_MATEDOWN,
RADIO_MEETME,
RADIO_MOVEOUT,
RADIO_NEGATIVE,
RADIO_POSITION,
RADIO_REGROUP,
RADIO_RESCUED,
RADIO_ROGER,
RADIO_ROUNDDRAW,
RADIO_STICKTOG,
RADIO_STORMFRONT,
RADIO_TAKEPOINT,
RADIO_TERWIN,
RADIO_VIP,
};
#ifdef CSQC
string sRadioSamples[43] = {
"radio/blow.wav",
"radio/bombdef.wav",
"radio/bombpl.wav",
"radio/circleback.wav",
"radio/clear.wav",
"radio/com_followcom.wav",
"radio/com_getinpos.wav",
"radio/com_go.wav",
"radio/com_reportin.wav",
"radio/ct_affirm.wav",
"radio/ct_backup.wav",
"radio/ct_coverme.wav",
"radio/ct_enemys.wav",
"radio/ct_fireinhole.wav",
"radio/ct_imhit.wav",
"radio/ct_inpos.wav",
"radio/ct_point.wav",
"radio/ct_reportingin.wav",
"radio/ctwin.wav",
"radio/enemydown.wav",
"radio/fallback.wav",
"radio/fireassis.wav",
"radio/followme.wav",
"radio/getout.wav",
"radio/go.wav",
"radio/hitassist.wav",
"radio/hosdown.wav",
"radio/letsgo.wav",
"radio/locknload.wav",
"radio/matedown.wav",
"radio/meetme.wav",
"radio/moveout.wav",
"radio/negative.wav",
"radio/position.wav",
"radio/regroup.wav",
"radio/rescued.wav",
"radio/roger.wav",
"radio/rounddraw.wav",
"radio/sticktog.wav",
"radio/stormfront.wav",
"radio/takepoint.wav",
"radio/terwin.wav",
"radio/vip.wav"
};
string sRadioChat[43] = {
_("RADIO_BLOW"),
_("RADIO_BOMBDEF"),
_("RADIO_BOMBPL"),
_("RADIO_CIRCLEBACK"),
_("RADIO_CLEAR"),
_("RADIO_COM_FOLLOWCOM"),
_("RADIO_COM_GETINPOS"),
_("RADIO_COM_GO"),
_("RADIO_COM_REPORTIN"),
_("RADIO_CT_AFFIRM"),
_("RADIO_CT_BACKUP"),
_("RADIO_CT_COVERME"),
_("RADIO_CT_ENEMYS"),
_("RADIO_CT_FIREINHOLE"),
_("RADIO_CT_IMHIT"),
_("RADIO_CT_INPOS"),
_("RADIO_CT_POINT"),
_("RADIO_CT_REPORTINGIN"),
_("RADIO_CTWIN"),
_("RADIO_ENEMYDOWN"),
_("RADIO_FALLBACK"),
_("RADIO_FIREASSIS"),
_("RADIO_FOLLOWME"),
_("RADIO_GETOUT"),
_("RADIO_GO"),
_("RADIO_HITASSIST"),
_("RADIO_HOSDOWN"),
_("RADIO_LETSGO"),
_("RADIO_LOCKNLOAD"),
_("RADIO_MATEDOWN"),
_("RADIO_MEETME"),
_("RADIO_MOVEOUT"),
_("RADIO_NEGATIVE"),
_("RADIO_POSITION"),
_("RADIO_REGROUP"),
_("RADIO_RESCUED"),
_("RADIO_ROGER"),
_("RADIO_ROUNDDRAW"),
_("RADIO_STICKTOG"),
_("RADIO_STORMFRONT"),
_("RADIO_TAKEPOINT"),
_("RADIO_TERWIN"),
_("RADIO_VIP"),
};
/*
=================
Radio_InitSounds
Who doesn't love precaching sounds
=================
*/
void Radio_InitSounds( void ) {
for ( int i = 0; i < 43; i++ ) {
precache_sound( sRadioSamples[ i ] );
}
}
/*
=================
Radio_PlayMessage
Play a radio message that doesn't come from a player
=================
*/
void Radio_PlayMessage( float fMessage ) {
sound( world, CHAN_VOICE, sRadioSamples[ fMessage ], 1, ATTN_NONE, 0, SOUNDFLAG_NOSPACIALISE );
CSQC_Parse_Print( sprintf( "^2[RADIO]^xF80: %s\n", sRadioChat[ fMessage ] ), PRINT_CHAT );
}
/*
=================
Radio_PlayPlayerMessage
This radio message does come from a player
=================
*/
void Radio_PlayPlayerMessage( float fPlayerNum, float fMessage ) {
sound( world, CHAN_VOICE, sRadioSamples[ fMessage ], 1, ATTN_NONE, 0, SOUNDFLAG_NOSPACIALISE );
CSQC_Parse_Print( sprintf( "^2[RADIO] %s%s^xF80: %s\n", HUD_GetChatColorHEX( stof( getplayerkeyvalue( fPlayerNum, "*team" ) ) ), getplayerkeyvalue( fPlayerNum, "name" ), sRadioChat[ fMessage ] ), PRINT_CHAT );
}
#endif
#ifdef SSQC
/*
=================
Radio_BroadcastMessage
A global radio message for all players
=================
*/
void Radio_BroadcastMessage( float fMessage ) {
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
WriteByte( MSG_MULTICAST, EV_RADIOMSG );
WriteByte( MSG_MULTICAST, fMessage );
msg_entity = self;
multicast( '0 0 0', MULTICAST_ALL );
}
/*
=================
Radio_TeamMessage
A radio message targetted at members of a specific team
=================
*/
void Radio_TeamMessage( float fMessage, float fTeam ) {
static void Radio_TeamMessage_Send( float fMessage, entity eEnt ) {
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
WriteByte( MSG_MULTICAST, EV_RADIOMSG );
WriteByte( MSG_MULTICAST, fMessage );
msg_entity = eEnt;
multicast( '0 0 0', MULTICAST_ONE );
}
for ( entity eFind = world; ( eFind = find( eFind, classname, "player" ) ); ) {
if ( eFind.team == fTeam ) {
Radio_TeamMessage_Send( fMessage, eFind );
} else if ( eFind.team == TEAM_VIP && fTeam == TEAM_CT ) {
Radio_TeamMessage_Send( fMessage, eFind );
}
}
}
/*
=================
Radio_DefaultStart
Pick a generic, random radio string for global start messages
=================
*/
float Radio_DefaultStart( void ) {
float fRand = floor( random( 1, 4 ) );
if ( fRand == 1 ) {
return RADIO_MOVEOUT;
} else if ( fRand == 2 ) {
return RADIO_LOCKNLOAD;
} else {
return RADIO_LETSGO;
}
}
/*
=================
Radio_StartMessage
Decide which startmessage to play at the beginning of each round
=================
*/
void Radio_StartMessage( void ) {
if ( iVIPZones > 0 ) {
Radio_TeamMessage( RADIO_VIP, TEAM_CT );
Radio_TeamMessage( Radio_DefaultStart(), TEAM_T );
} else if ( iEscapeZones > 0 ) {
Radio_TeamMessage( RADIO_GETOUT, TEAM_T );
Radio_TeamMessage( Radio_DefaultStart(), TEAM_CT );
} else {
Radio_BroadcastMessage( Radio_DefaultStart() );
}
}
/*
=================
CSEv_RadioMessage_f
Triggered by clients, plays a message to members of the same team
=================
*/
void CSEv_RadioMessage_f( float fMessage ) {
static void CSEv_RadioMessage_Send( float fMessage, entity eEnt ) {
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
WriteByte( MSG_MULTICAST, EV_RADIOMSG2 );
WriteByte( MSG_MULTICAST, num_for_edict( eEnt ) - 1 );
WriteByte( MSG_MULTICAST, fMessage );
msg_entity = eEnt;
multicast( '0 0 0', MULTICAST_ONE );
}
// Don't allow spamming
if ( self.fRadioFinished > time ) {
return;
}
// When dead, don't talk
if ( self.health <= 0 ) {
return;
}
// Make sure that VIPs and CTs get eachother
float fTargetTeam = self.team;
if ( fTargetTeam == TEAM_VIP ) {
fTargetTeam = TEAM_CT;
}
for ( entity eFind = world; ( eFind = find( eFind, classname, "player" ) ); ) {
if ( eFind.team == fTargetTeam ) {
CSEv_RadioMessage_Send( fMessage, eFind );
} else if ( eFind.team == TEAM_VIP && fTargetTeam == TEAM_CT ) {
CSEv_RadioMessage_Send( fMessage, eFind );
}
}
self.fRadioFinished = time + 3.0f;
}
#endif

View File

@ -124,7 +124,7 @@ void WeaponFLASHBANG_Throw( void ) {
return;
}
if ( other.classname == "func_breakable" ) {
Damage_Apply( other, self, 50, self.origin, FALSE, 0);
Damage_Apply( other, self, 50, FALSE, 0);
}
sound( self, CHAN_WEAPON, sprintf( "weapons/grenade_hit%d.wav", floor( random() * 3 ) + 1 ), 1, ATTN_NORM );
}

601
src/shared/cstrike.old/weapons.c Executable file
View File

@ -0,0 +1,601 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
void Temp_Nothing( void ) { }
#ifdef SSQC
string sWeaponModels[ CS_WEAPON_COUNT ] = {
"",
"models/w_knife.mdl",
"models/w_usp.mdl",
"models/w_glock18.mdl",
"models/w_deagle.mdl",
"models/w_p228.mdl",
"models/w_elite.mdl",
"models/w_fiveseven.mdl",
"models/w_m3.mdl",
"models/w_xm1014.mdl",
"models/w_mp5.mdl",
"models/w_p90.mdl",
"models/w_ump45.mdl",
"models/w_mac10.mdl",
"models/w_tmp.mdl",
"models/w_ak47.mdl",
"models/w_sg552.mdl",
"models/w_m4a1.mdl",
"models/w_aug.mdl",
"models/w_scout.mdl",
"models/w_awp.mdl",
"models/w_g3sg1.mdl",
"models/w_sg550.mdl",
"models/w_m249.mdl",
"models/w_backpack.mdl",
"models/w_flashbang.mdl",
"models/w_hegrenade.mdl",
"models/w_smokegrenade.mdl"
};
#endif
weaponfunc_t wpnFuncTable[ CS_WEAPON_COUNT ] = {
{ Temp_Nothing, Temp_Nothing, Temp_Nothing, Temp_Nothing },
{ WeaponKNIFE_Draw, WeaponKNIFE_PrimaryFire, WeaponKNIFE_Secondary, Temp_Nothing },
{ WeaponUSP45_Draw, WeaponUSP45_PrimaryFire, WeaponUSP45_Secondary, WeaponUSP45_Reload },
{ WeaponGLOCK18_Draw, WeaponGLOCK18_PrimaryFire, WeaponGLOCK18_Secondary, WeaponGLOCK18_Reload },
{ WeaponDEAGLE_Draw, WeaponDEAGLE_PrimaryFire, Temp_Nothing, WeaponDEAGLE_Reload },
{ WeaponP228_Draw, WeaponP228_PrimaryFire, Temp_Nothing, WeaponP228_Reload },
{ WeaponELITES_Draw, WeaponELITES_PrimaryFire, Temp_Nothing, WeaponELITES_Reload },
{ WeaponFIVESEVEN_Draw, WeaponFIVESEVEN_PrimaryFire, Temp_Nothing, WeaponFIVESEVEN_Reload },
#ifdef SSQC
{ WeaponM3_Draw, WeaponM3_PrimaryFire, Temp_Nothing, WeaponM3_Reload },
{ WeaponXM1014_Draw, WeaponXM1014_PrimaryFire, Temp_Nothing, WeaponXM1014_Reload },
#else
{ WeaponM3_Draw, WeaponM3_PrimaryFire, WeaponM3_Secondary, WeaponM3_Reload },
{ WeaponXM1014_Draw, WeaponXM1014_PrimaryFire, WeaponXM1014_Secondary, WeaponXM1014_Reload },
#endif
{ WeaponMP5_Draw, WeaponMP5_PrimaryFire, Temp_Nothing, WeaponMP5_Reload },
{ WeaponP90_Draw, WeaponP90_PrimaryFire, Temp_Nothing, WeaponP90_Reload },
{ WeaponUMP45_Draw, WeaponUMP45_PrimaryFire, Temp_Nothing, WeaponUMP45_Reload },
{ WeaponMAC10_Draw, WeaponMAC10_PrimaryFire, Temp_Nothing, WeaponMAC10_Reload },
{ WeaponTMP_Draw, WeaponTMP_PrimaryFire, Temp_Nothing, WeaponTMP_Reload },
{ WeaponAK47_Draw, WeaponAK47_PrimaryFire, Temp_Nothing, WeaponAK47_Reload },
{ WeaponSG552_Draw, WeaponSG552_PrimaryFire, WeaponSG552_SecondaryFire, WeaponSG552_Reload },
{ WeaponM4A1_Draw, WeaponM4A1_PrimaryFire, WeaponM4A1_Secondary, WeaponM4A1_Reload },
{ WeaponAUG_Draw, WeaponAUG_PrimaryFire, WeaponAUG_SecondaryFire, WeaponAUG_Reload },
{ WeaponSCOUT_Draw, WeaponSCOUT_PrimaryFire, WeaponSCOUT_SecondaryFire, WeaponSCOUT_Reload },
{ WeaponAWP_Draw, WeaponAWP_PrimaryFire, WeaponAWP_SecondaryFire, WeaponAWP_Reload },
{ WeaponG3SG1_Draw, WeaponG3SG1_PrimaryFire, WeaponG3SG1_SecondaryFire, WeaponG3SG1_Reload },
{ WeaponSG550_Draw, WeaponSG550_PrimaryFire, WeaponSG550_SecondaryFire, WeaponSG550_Reload },
{ WeaponPARA_Draw, WeaponPARA_PrimaryFire, Temp_Nothing, WeaponPARA_Reload },
{ WeaponC4BOMB_Draw, WeaponC4BOMB_PrimaryFire, Temp_Nothing, Temp_Nothing },
{ WeaponFLASHBANG_Draw, WeaponFLASHBANG_PrimaryFire, Temp_Nothing, Temp_Nothing },
{ WeaponHEGRENADE_Draw, WeaponHEGRENADE_PrimaryFire, Temp_Nothing, Temp_Nothing },
{ WeaponSMOKEGRENADE_Draw, WeaponSMOKEGRENADE_PrimaryFire, Temp_Nothing, Temp_Nothing }
};
/*
=================
Weapon_Draw
=================
*/
void Weapon_Draw( float fWeapon ) {
if ( !fWeapon ) {
return;
}
#ifdef SSQC
// In case reloading logic is still going on
self.think = Empty;
self.viewzoom = 1.0;
self.weapon = fWeapon;
self.fAttackFinished = time + 1.0;
#endif
#ifdef CSQC
if ( fWeaponEventPlayer != player_localentnum ) {
return;
}
#endif
wpnFuncTable[ fWeapon ].vDraw();
}
/*
=================
Weapon_PrimaryAttack
=================
*/
void Weapon_PrimaryAttack( float fWeapon ) {
#ifdef SSQC
if ( self.fAttackFinished > time ) {
return;
}
if ( !( self.flags & FL_SEMI_TOGGLED ) ) {
return;
}
#endif
#ifdef CSQC
if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) {
entity ono = findfloat( world, entnum, fWeaponEventPlayer );
if ( ono != __NULL__ ) {
Animation_ShootWeapon( ono );
}
return;
}
#endif
wpnFuncTable[ fWeapon ].vPrimary();
}
/*
=================
Weapon_SecondaryAttack
=================
*/
void Weapon_SecondaryAttack( float fWeapon ) {
#ifdef SSQC
if ( self.fAttackFinished > time ) {
return;
}
#endif
#ifdef CSQC
if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) {
return;
}
#endif
wpnFuncTable[ fWeapon ].vSecondary();
}
/*
=================
Weapon_Reload
=================
*/
void Weapon_Reload( float fWeapon ) {
#ifdef SSQC
if ( self.fAttackFinished > time ) {
return;
}
self.viewzoom = 1.0;
#endif
#ifdef CSQC
if ( fWeaponEventPlayer != player_localentnum || autocvar_cl_thirdperson == TRUE ) {
entity ono = findfloat( world, entnum, fWeaponEventPlayer );
if ( ono != __NULL__ ) {
Animation_ReloadWeapon( ono );
}
return;
}
#endif
wpnFuncTable[ fWeapon ].vReload();
}
/*
=================
Weapon_GetAnimType
Returns which animationset a weapon will use on a player
=================
*/
float Weapon_GetAnimType( float fWeapon ) {
return wptTable[ fWeapon ].fAnimType;
}
/*
=================
Weapon_GetFireRate
Returns the delay between shots of a given weapon
=================
*/
float Weapon_GetFireRate( float fWeapon ) {
return wptTable[ fWeapon ].fAttackFinished;
}
/*
=================
Weapon_GetReloadTime
Returns the reloading delay before being able to be fired again
=================
*/
float Weapon_GetReloadTime( float fWeapon ) {
return wptTable[ fWeapon ].fReloadFinished;
}
/*
=================
Weapon_GetSpeedM
Returns the speed multiplier
=================
*/
float Weapon_GetSpeedM( float fWeapon ) {
return wptTable[ fWeapon ].fSpeedM;
}
#ifdef SSQC
/*
=================
Weapon_Release
Called when letting go one of the weapon firing buttons
=================
*/
void Weapon_Release( void ) {
self.flags = self.flags | FL_SEMI_TOGGLED;
if ( self.weapon == WEAPON_FLASHBANG ) {
WeaponFLASHBANG_Release();
} else if ( self.weapon == WEAPON_HEGRENADE ) {
WeaponHEGRENADE_Release();
} else if ( self.weapon == WEAPON_SMOKEGRENADE ) {
WeaponSMOKEGRENADE_Release();
} else if ( self.weapon == WEAPON_C4BOMB ) {
WeaponC4BOMB_Release();
} else {
if (self.weapon == WEAPON_XM1014) {
return;
} else if (self.weapon == WEAPON_M3) {
return;
}
if (self.(wptTable[ self.weapon ].iMagfld) <= 0) {
if (self.(wptTable[ self.weapon ].iCaliberfld)) {
Weapon_Reload(self.weapon);
}
}
}
}
/*
=================
Weapon_GetSlot
Returns which slot a weapon belongs to
=================
*/
int Weapon_GetSlot( float fWeapon ) {
return wptTable[ fWeapon ].iSlot;
}
/*
=================
Weapon_AlreadyExists
Returns whether or not we have the given weapon already
=================
*/
float Weapon_AlreadyExists( float fWeapon ) {
if ( fWeapon == WEAPON_FLASHBANG || fWeapon == WEAPON_HEGRENADE || fWeapon == WEAPON_SMOKEGRENADE ) {
int iNades = self.iAmmo_FLASHBANG + self.iAmmo_HEGRENADE + self.iAmmo_SMOKEGRENADE;
if ( iNades ) {
return TRUE;
} else {
return FALSE;
}
} else {
if ( wptTable[ fWeapon ].iSlot == SLOT_PRIMARY ) {
if ( self.fSlotPrimary == fWeapon ) {
return TRUE;
}
} else if ( wptTable[ fWeapon ].iSlot == SLOT_SECONDARY ) {
if ( self.fSlotSecondary == fWeapon ) {
return TRUE;
}
} else if ( wptTable[ fWeapon ].iSlot == SLOT_GRENADE ) {
if ( self.fSlotGrenade == fWeapon ) {
return TRUE;
}
} else if ( wptTable[ fWeapon ].iSlot == SLOT_C4BOMB ) {
if ( self.fSlotC4Bomb == fWeapon ) {
return TRUE;
}
}
}
return FALSE;
}
/*
=================
Weapon_SlotEmpty
Returns whether or not a slot is empty
=================
*/
float Weapon_SlotEmpty( int fSlot ) {
if ( fSlot == SLOT_PRIMARY ) {
if ( self.fSlotPrimary == 0 ) {
return TRUE;
}
} else if ( fSlot == SLOT_SECONDARY ) {
if ( self.fSlotSecondary == 0 ) {
return TRUE;
}
} else if ( fSlot == SLOT_GRENADE ) {
if ( self.fSlotGrenade == 0 ) {
return TRUE;
}
} else if ( fSlot == SLOT_C4BOMB ) {
if ( self.fSlotC4Bomb == 0 ) {
return TRUE;
}
}
return FALSE;
}
/*
=================
Weapon_Switch
Switch to the weapon in a given slot
=================
*/
void Weapon_Switch( int iSlot ) {
float fWeapon;
if ( iSlot == SLOT_MELEE ) {
fWeapon = self.fSlotMelee;
} else if ( iSlot == SLOT_PRIMARY ) {
fWeapon = self.fSlotPrimary;
} else if ( iSlot == SLOT_SECONDARY ) {
fWeapon = self.fSlotSecondary;
} else if ( iSlot == SLOT_GRENADE ) {
fWeapon = self.fSlotGrenade;
} else if ( iSlot == SLOT_C4BOMB ) {
fWeapon = self.fSlotC4Bomb;
}
if ( !fWeapon || self.weapon == fWeapon ) {
return;
}
Weapon_Draw( fWeapon );
}
/*
=================
Weapon_UpdateCurrents
Update the ammo fields for the clientside display
=================
*/
void Weapon_UpdateCurrents( void ) {
self.iCurrentMag = self.(wptTable[ self.weapon ].iMagfld);
self.iCurrentCaliber = self.(wptTable[ self.weapon ].iCaliberfld);
}
/*
=================
Weapon_AddItem
Gives a weapon to the player
=================
*/
void Weapon_AddItem( float fWeapon ) {
if ( Weapon_SlotEmpty ( wptTable[ fWeapon ].iSlot ) == FALSE ) {
Weapon_DropWeapon( wptTable[ fWeapon ].iSlot );
}
// Add the gun to the appropriate slot
if( wptTable[ fWeapon ].iSlot == SLOT_MELEE ) {
self.fSlotMelee = fWeapon;
} else if ( wptTable[ fWeapon ].iSlot == SLOT_SECONDARY ) {
self.fSlotSecondary = fWeapon;
} else if( wptTable[ fWeapon ].iSlot == SLOT_PRIMARY ) {
self.fSlotPrimary = fWeapon;
} else if ( wptTable[ fWeapon ].iSlot == SLOT_GRENADE ) {
self.fSlotGrenade = fWeapon;
} else if ( wptTable[ fWeapon ].iSlot == SLOT_C4BOMB ) {
self.fSlotC4Bomb = fWeapon;
}
// Make sure we've got at least one full clip
self.(wptTable[ fWeapon ].iMagfld) = wptTable[ fWeapon ].iMagSize;
}
/*
=================
Weapon_GiveAmmo
Gives a specific amount of ammo to the player
=================
*/
void Weapon_GiveAmmo( float fWeapon, float fAmount ) {
self.(wptTable[ fWeapon ].iCaliberfld ) += fAmount;
Weapon_UpdateCurrents();
}
/*
=================
Weapon_SwitchBest
Switches to the currently best suited weapon
=================
*/
void Weapon_SwitchBest( void ) {
if ( self.fSlotSecondary ) {
Weapon_Switch( SLOT_SECONDARY );
} else if ( self.fSlotPrimary ) {
Weapon_Switch( SLOT_PRIMARY );
} else {
Weapon_Switch( SLOT_MELEE );
}
}
/*
=================
Weapon_DropWeapon
Drop the weapon in a given slot
=================
*/
void Weapon_DropWeapon( int iSlot ) {
static void Weapon_DropWeapon_Touch( void ) {
if ( other.classname != "player" ) {
return;
} else if ( other == self.owner ) {
return;
}
// No bomb for the CTs
if ( ( self.weapon == WEAPON_C4BOMB ) && ( other.team == TEAM_CT ) ) {
return;
}
entity eOld = self;
self = other;
if ( Weapon_SlotEmpty( Weapon_GetSlot( eOld.weapon ) ) ) {
Weapon_AddItem( eOld.weapon );
Weapon_Draw( eOld.weapon );
self.(wptTable[ eOld.weapon ].iMagfld) = eOld.health;
Weapon_UpdateCurrents();
} else {
self = eOld;
return;
}
self = eOld;
remove( self );
}
static void Weapon_DropWeapon_Think( void ) {
self.owner = world;
}
float fWeapon;
if ( iSlot == SLOT_PRIMARY ) {
fWeapon = self.fSlotPrimary;
self.fSlotPrimary = 0;
} else if ( iSlot == SLOT_SECONDARY ) {
fWeapon = self.fSlotSecondary;
self.fSlotSecondary = 0;
} else if ( iSlot == SLOT_GRENADE ) {
fWeapon = self.fSlotGrenade;
self.fSlotGrenade = 0;
} else if ( iSlot == SLOT_C4BOMB ) {
fWeapon = self.fSlotC4Bomb;
self.fSlotC4Bomb = 0;
} else {
return;
}
entity eDrop = spawn();
setorigin( eDrop, self.origin + self.view_ofs );
setmodel( eDrop, sWeaponModels[ fWeapon ] );
eDrop.classname = "remove_me";
eDrop.owner = self;
eDrop.movetype = MOVETYPE_TOSS;
eDrop.solid = SOLID_TRIGGER;
eDrop.weapon = fWeapon;
eDrop.think = Weapon_DropWeapon_Think;
eDrop.touch = Weapon_DropWeapon_Touch;
eDrop.nextthink = time + 1.0f;
eDrop.health = self.(wptTable[ fWeapon ].iMagfld);
setsize( eDrop, '-16 -16 0', '16 16 16' );
makevectors( self.v_angle );
if (fWeapon == WEAPON_C4BOMB && autocvar_fcs_bombaltthrow) {
eDrop.velocity = v_forward * random(32, 96);
eDrop.velocity += v_right * random(-64, 64);
eDrop.velocity[2] = 0;
} else {
eDrop.velocity = self.velocity + v_forward * 256;
}
self.weapon = 0;
Weapon_SwitchBest();
}
/*
=================
CSEv_PlayerBuyWeapon_f
Client call for buying a weapon through GUI or console command
=================
*/
void CSEv_PlayerBuyWeapon_f( float fWeapon ) {
if ( Rules_BuyingPossible() == FALSE ) {
return;
}
if ( self.team == TEAM_T ) {
if ( fWeapon == WEAPON_M4A1 ) { return; }
if ( fWeapon == WEAPON_AUG ) { return; }
if ( fWeapon == WEAPON_SG550 ) { return; }
if ( fWeapon == WEAPON_FIVESEVEN ) { return; }
if ( fWeapon == WEAPON_TMP ) { return; }
} else if ( self.team == TEAM_CT ) {
if ( fWeapon == WEAPON_AK47 ) { return; }
if ( fWeapon == WEAPON_SG552 ) { return; }
if ( fWeapon == WEAPON_G3SG1 ) { return; }
if ( fWeapon == WEAPON_ELITES ) { return; }
if ( fWeapon == WEAPON_MAC10 ) { return; }
}
if ( ( self.fMoney - wptTable[ fWeapon ].iPrice ) >= 0 ) {
Weapon_AddItem(fWeapon);
Ammo_AutoFill(fWeapon);
Weapon_Draw( fWeapon );
Money_AddMoney( self, -wptTable[ fWeapon ].iPrice );
sound( self, CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_IDLE );
} else {
centerprint( self, "You have insufficient funds!" );
}
}
/*
=================
CSEv_PlayerSwitchWeapon_f
Client-HUD call that switches to a specific weapon
=================
*/
void CSEv_PlayerSwitchWeapon_f( float fWeapon ) {
if ( ( Weapon_AlreadyExists( fWeapon ) == FALSE ) && ( fWeapon != WEAPON_KNIFE ) ) {
return;
}
if (wptTable[fWeapon].iSlot == SLOT_GRENADE) {
if (fWeapon == WEAPON_HEGRENADE && !(self.iAmmo_HEGRENADE)) {
return;
} else if (fWeapon == WEAPON_FLASHBANG && !(self.iAmmo_FLASHBANG)) {
return;
} else if (fWeapon == WEAPON_SMOKEGRENADE && !(self.iAmmo_SMOKEGRENADE)) {
return;
}
}
if ( fWeapon != self.weapon ) {
Weapon_Draw( fWeapon );
}
}
/*
=================
CSEv_WeaponDrop
Client call that tells us to drop the currently equipped weapon
=================
*/
void CSEv_WeaponDrop( void ) {
Weapon_DropWeapon( wptTable[ self.weapon ].iSlot );
}
#endif

View File

@ -114,7 +114,7 @@ void WeaponSMOKEGRENADE_Throw( void ) {
return;
}
if ( other.classname == "func_breakable" ) {
Damage_Apply( other, self, 50, self.origin, FALSE, 0);
Damage_Apply( other, self, 50, FALSE, 0);
self.velocity = Caliber_Reflect( self.velocity, trace_plane_normal );
}
sound( self, CHAN_WEAPON, sprintf( "weapons/grenade_hit%d.wav", floor( random() * 3 ) + 1 ), 1, ATTN_NORM );

Some files were not shown because too many files have changed in this diff Show More