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:
parent
0c62ea6371
commit
f66792ef49
134 changed files with 11114 additions and 2024 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
206
src/client/cstrike.old/defs.h
Normal file
206
src/client/cstrike.old/defs.h
Normal 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) ";
|
||||
}
|
||||
}
|
62
src/client/cstrike.old/entities.c
Normal file
62
src/client/cstrike.old/entities.c
Normal 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 );
|
||||
}
|
||||
|
541
src/client/cstrike.old/hud.c
Normal file
541
src/client/cstrike.old/hud.c
Normal 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();
|
||||
}
|
61
src/client/cstrike.old/init.c
Normal file
61
src/client/cstrike.old/init.c
Normal 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
107
src/client/cstrike.old/progs.src
Executable 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
|
205
src/client/cstrike.old/vgui_chooseteam.cpp
Normal file
205
src/client/cstrike.old/vgui_chooseteam.cpp
Normal 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 ) );
|
||||
}
|
|
@ -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) ";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
@ -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
51
src/client/cstrike/hud.h
Normal 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
|
||||
};
|
200
src/client/cstrike/hud_weaponselect.c
Normal file
200
src/client/cstrike/hud_weaponselect.c
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
137
src/client/cstrike/progs.src
Executable file → Normal 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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
189
src/server/cstrike.old/armoury_entity.cpp
Executable file
189
src/server/cstrike.old/armoury_entity.cpp
Executable 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();
|
||||
}
|
231
src/server/cstrike.old/client.c
Normal file
231
src/server/cstrike.old/client.c
Normal 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);
|
||||
}
|
|
@ -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__
|
72
src/server/cstrike.old/input.c
Normal file
72
src/server/cstrike.old/input.c
Normal 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;
|
||||
}
|
66
src/server/cstrike.old/item_suit.cpp
Normal file
66
src/server/cstrike.old/item_suit.cpp
Normal 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();
|
||||
}
|
267
src/server/cstrike.old/player.c
Normal file
267
src/server/cstrike.old/player.c
Normal 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;
|
||||
}
|
96
src/server/cstrike.old/progs.src
Executable file
96
src/server/cstrike.old/progs.src
Executable 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
|
|
@ -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
125
src/server/cstrike/armoury_entity.cpp
Executable file → Normal 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();
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
89
src/server/cstrike/gamerules.c
Normal file
89
src/server/cstrike/gamerules.c
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
}
|
124
src/shared/cstrike.old/equipment.c
Executable file
124
src/shared/cstrike.old/equipment.c
Executable 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
|
129
src/shared/cstrike.old/player.cpp
Normal file
129
src/shared/cstrike.old/player.cpp
Normal 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
317
src/shared/cstrike.old/radio.c
Executable 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
|
|
@ -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
601
src/shared/cstrike.old/weapons.c
Executable 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
|
|
@ -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
Loading…
Reference in a new issue