Added env_sprite (non-looping)
Added fixes to the VIP selection algorithm Particle fixes and tweaks Change how ModelGib calls are broadcast due to PVS issues on maps like cs_militia Fixed scoreboard coloring Fixed the random-number generation in some occasions Added gibmodels being able to have a random selection of submodels Added monetary rewards Added penalties for injuring/killing hostages Misc fixes to func_door and func_button in terms of triggering events
This commit is contained in:
parent
a36e2452e6
commit
b1b81e8728
38 changed files with 259 additions and 99 deletions
|
@ -49,6 +49,8 @@ void CSQC_Parse_Print(string sMessage, float fLevel ) {
|
|||
}
|
||||
|
||||
fChatTime = time + CHAT_TIME;
|
||||
} else {
|
||||
print( sMessage );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,18 +28,20 @@ Called whenever an entity is sent manually via .SendFlags and so on
|
|||
void CSQC_Ent_Update( float fIsNew ) {
|
||||
float fEntType = readbyte();
|
||||
|
||||
if ( fEntType == 1 ) {
|
||||
if ( fEntType == ENT_AMBIENTSOUND ) {
|
||||
self.origin_x = readcoord();
|
||||
self.origin_y = readcoord();
|
||||
self.origin_z = readcoord();
|
||||
|
||||
setorigin( self, self.origin );
|
||||
|
||||
CSQC_ambient_generic( readstring(), readfloat(), readbyte() );
|
||||
} else if ( fEntType == ENT_SPRITE ) {
|
||||
self.origin_x = readcoord();
|
||||
self.origin_y = readcoord();
|
||||
self.origin_z = readcoord();
|
||||
|
||||
string sSample = readstring(); // WriteString( MSG_ENTITY, self.message );
|
||||
float fVolume = readfloat(); // WriteFloat( MSG_ENTITY, self.health );
|
||||
float fAttennuation = readbyte(); // WriteByte( MSG_ENTITY, self.style );
|
||||
CSQC_ambient_generic( sSample, fVolume, fAttennuation );
|
||||
//print( sprintf( "[DEV] Ambientsound (%s), ATTN %d \n", sSample, fAttennuation ) );
|
||||
Effect_AnimatedSprite( self.origin, readfloat(), readfloat(), readfloat(), readfloat(), readfloat() );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -25,6 +25,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#define NUMSIZE_X 0.09375
|
||||
#define NUMSIZE_Y 0.09765625
|
||||
|
||||
#define HUD_ALPHA 0.6
|
||||
|
||||
// Instead of calculating them on demand, just read the offsets here
|
||||
float vHUDNumPos[10] = {
|
||||
0,
|
||||
|
@ -92,12 +94,24 @@ HUD_DrawHealth
|
|||
Draw the current amount of health
|
||||
=================
|
||||
*/
|
||||
float fOldHealth;
|
||||
float fHealthAlpha;
|
||||
void HUD_DrawHealth( void ) {
|
||||
if ( getstatf( STAT_HEALTH ) != fOldHealth ) {
|
||||
fHealthAlpha = 1.0;
|
||||
}
|
||||
|
||||
if ( fHealthAlpha >= HUD_ALPHA ) {
|
||||
fHealthAlpha -= frametime * 0.5;
|
||||
} else {
|
||||
fHealthAlpha = HUD_ALPHA;
|
||||
}
|
||||
|
||||
// Health
|
||||
vector vHealthPos = [ 16, vVideoResolution_y - 42 ];
|
||||
drawsubpic( vHealthPos, '24 24 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 2, NUMSIZE_Y], [ NUMSIZE_X, NUMSIZE_X ], VGUI_WINDOW_FGCOLOR, 1, DRAWFLAG_ADDITIVE );
|
||||
HUD_DrawNums( getstatf( STAT_HEALTH ), vHealthPos + '72 0', 1, VGUI_WINDOW_FGCOLOR );
|
||||
drawsubpic( vHealthPos, '24 24 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 2, NUMSIZE_Y], [ NUMSIZE_X, NUMSIZE_X ], VGUI_WINDOW_FGCOLOR, HUD_ALPHA, DRAWFLAG_ADDITIVE );
|
||||
HUD_DrawNums( getstatf( STAT_HEALTH ), vHealthPos + '72 0', HUD_ALPHA, VGUI_WINDOW_FGCOLOR );
|
||||
fOldHealth = getstatf( STAT_HEALTH );
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -107,11 +121,22 @@ HUD_DrawArmor
|
|||
Draw the current amount of Kevlar
|
||||
=================
|
||||
*/
|
||||
float fOldArmor;
|
||||
float fArmorAlpha;
|
||||
void HUD_DrawArmor( void ) {
|
||||
|
||||
if ( getstatf( STAT_ARMOR ) != fOldArmor ) {
|
||||
fArmorAlpha = 1.0;
|
||||
}
|
||||
|
||||
if ( fArmorAlpha >= HUD_ALPHA ) {
|
||||
fArmorAlpha -= frametime * 0.5;
|
||||
} else {
|
||||
fArmorAlpha = HUD_ALPHA;
|
||||
}
|
||||
vector vArmorPos = [ 112, vVideoResolution_y - 42 ];
|
||||
drawsubpic( vArmorPos, '24 24 0', HUD_NUMFILE_LAYER, [ 0, NUMSIZE_Y], [ NUMSIZE_X, NUMSIZE_X ], VGUI_WINDOW_FGCOLOR, 1, DRAWFLAG_ADDITIVE );
|
||||
HUD_DrawNums( getstatf( STAT_ARMOR ), vArmorPos + '72 0', 1, VGUI_WINDOW_FGCOLOR);
|
||||
drawsubpic( vArmorPos, '24 24 0', HUD_NUMFILE_LAYER, [ 0, NUMSIZE_Y], [ NUMSIZE_X, NUMSIZE_X ], VGUI_WINDOW_FGCOLOR, fArmorAlpha, DRAWFLAG_ADDITIVE );
|
||||
HUD_DrawNums( getstatf( STAT_ARMOR ), vArmorPos + '72 0', fArmorAlpha, VGUI_WINDOW_FGCOLOR);
|
||||
fOldArmor = getstatf( STAT_ARMOR );
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -157,6 +182,8 @@ HUD_DrawTimer
|
|||
Draws the roundtime at the bottom of the screen (always visible)
|
||||
=================
|
||||
*/
|
||||
int iOldUnits;
|
||||
float fTimerAlpha;
|
||||
void HUD_DrawTimer( void ) {
|
||||
int iMinutes, iSeconds, iTens, iUnits;
|
||||
vector vTimePos = [ ( vVideoResolution_x / 2 ) - 60, vVideoResolution_y - 42 ];
|
||||
|
@ -199,10 +226,20 @@ void HUD_DrawTimer( void ) {
|
|||
drawsubpic( vTimePos, '24 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 6, NUMSIZE_Y * 3], [ NUMSIZE_X, NUMSIZE_Y ], '1 0 0', fAlpha, DRAWFLAG_ADDITIVE );
|
||||
drawsubpic( vTimePos, '24 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 6, NUMSIZE_Y * 3], [ NUMSIZE_X, NUMSIZE_Y ], VGUI_WINDOW_FGCOLOR, 1 - fAlpha, DRAWFLAG_ADDITIVE );
|
||||
} else {
|
||||
HUD_DrawNumber( iMinutes, vTimePos + '48 0 0', 1, VGUI_WINDOW_FGCOLOR );
|
||||
HUD_DrawNumber( iTens, vTimePos + '70 0 0', 1, VGUI_WINDOW_FGCOLOR );
|
||||
HUD_DrawNumber( iUnits, vTimePos + '94 0 0', 1, VGUI_WINDOW_FGCOLOR );
|
||||
drawsubpic( vTimePos, '24 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 6, NUMSIZE_Y * 3], [ NUMSIZE_X, NUMSIZE_Y ], VGUI_WINDOW_FGCOLOR, 1, DRAWFLAG_ADDITIVE );
|
||||
if ( iUnits != iOldUnits ) {
|
||||
fTimerAlpha = 1.0;
|
||||
}
|
||||
|
||||
if ( fTimerAlpha >= HUD_ALPHA ) {
|
||||
fTimerAlpha -= frametime * 0.5;
|
||||
} else {
|
||||
fTimerAlpha = HUD_ALPHA;
|
||||
}
|
||||
HUD_DrawNumber( iMinutes, vTimePos + '48 0 0', fTimerAlpha, VGUI_WINDOW_FGCOLOR );
|
||||
HUD_DrawNumber( iTens, vTimePos + '70 0 0', fTimerAlpha, VGUI_WINDOW_FGCOLOR );
|
||||
HUD_DrawNumber( iUnits, vTimePos + '94 0 0', fTimerAlpha, VGUI_WINDOW_FGCOLOR );
|
||||
drawsubpic( vTimePos, '24 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 6, NUMSIZE_Y * 3], [ NUMSIZE_X, NUMSIZE_Y ], VGUI_WINDOW_FGCOLOR, fTimerAlpha, DRAWFLAG_ADDITIVE );
|
||||
iOldUnits = iUnits;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -233,15 +270,15 @@ void HUD_DrawMoney( void ) {
|
|||
if ( fMoneyAlphaEffect > 0 ) {
|
||||
fMoneyAlphaEffect -= frametime * 0.5;
|
||||
drawsubpic( vMoneyPos, '18 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 8, NUMSIZE_Y * 1], [ NUMSIZE_X * 0.75, NUMSIZE_Y ], vMoneyColorEffect, fMoneyAlphaEffect, DRAWFLAG_ADDITIVE );
|
||||
drawsubpic( vMoneyPos, '18 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 8, NUMSIZE_Y * 1], [ NUMSIZE_X * 0.75, NUMSIZE_Y ], VGUI_WINDOW_FGCOLOR, 1 - fMoneyAlphaEffect, DRAWFLAG_ADDITIVE );
|
||||
drawsubpic( vMoneyPos, '18 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 8, NUMSIZE_Y * 1], [ NUMSIZE_X * 0.75, NUMSIZE_Y ], VGUI_WINDOW_FGCOLOR, HUD_ALPHA - ( fMoneyAlphaEffect * 0.5 ), DRAWFLAG_ADDITIVE );
|
||||
|
||||
vMoneyPos_x += ( 24 * 5 );
|
||||
HUD_DrawNums( getstatf( STAT_MONEY ), vMoneyPos, fMoneyAlphaEffect, vMoneyColorEffect );
|
||||
HUD_DrawNums( getstatf( STAT_MONEY ), vMoneyPos, 1 - fMoneyAlphaEffect, VGUI_WINDOW_FGCOLOR );
|
||||
HUD_DrawNums( getstatf( STAT_MONEY ), vMoneyPos, HUD_ALPHA - ( fMoneyAlphaEffect * 0.5 ), VGUI_WINDOW_FGCOLOR );
|
||||
} else {
|
||||
drawsubpic( vMoneyPos, '18 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 8, NUMSIZE_Y * 1], [ NUMSIZE_X * 0.75, NUMSIZE_Y ], VGUI_WINDOW_FGCOLOR, 1, DRAWFLAG_ADDITIVE );
|
||||
drawsubpic( vMoneyPos, '18 25 0', HUD_NUMFILE_LAYER, [ NUMSIZE_X * 8, NUMSIZE_Y * 1], [ NUMSIZE_X * 0.75, NUMSIZE_Y ], VGUI_WINDOW_FGCOLOR, HUD_ALPHA, DRAWFLAG_ADDITIVE );
|
||||
vMoneyPos_x += ( 24 * 5 );
|
||||
HUD_DrawNums( getstatf( STAT_MONEY ), vMoneyPos, 1, VGUI_WINDOW_FGCOLOR );
|
||||
HUD_DrawNums( getstatf( STAT_MONEY ), vMoneyPos, HUD_ALPHA, VGUI_WINDOW_FGCOLOR );
|
||||
}
|
||||
|
||||
fOldMoneyValue = getstatf( STAT_MONEY );
|
||||
|
@ -254,18 +291,32 @@ HUD_DrawAmmo
|
|||
Draws the current clip, the amount of ammo for the caliber and a matching caliber icon
|
||||
=================
|
||||
*/
|
||||
float fOldClip, fOldCal;
|
||||
float fAmmoAlpha;
|
||||
void HUD_DrawAmmo( void ) {
|
||||
if ( getstatf( STAT_ACTIVEWEAPON ) == WEAPON_KNIFE || getstatf( STAT_ACTIVEWEAPON ) == WEAPON_C4BOMB ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( getstatf( STAT_CURRENT_CLIP ) != fOldClip || getstatf( STAT_CURRENT_CALIBER ) != fOldCal ) {
|
||||
fAmmoAlpha = 1.0;
|
||||
}
|
||||
|
||||
if ( fAmmoAlpha >= HUD_ALPHA ) {
|
||||
fAmmoAlpha -= frametime * 0.5;
|
||||
} else {
|
||||
fAmmoAlpha = HUD_ALPHA;
|
||||
}
|
||||
|
||||
vector vAmmoClipPos = [ vVideoResolution_x - 136, vVideoResolution_y - 42 ];
|
||||
HUD_DrawNums( getstatf( STAT_CURRENT_CLIP ), vAmmoClipPos, 1, VGUI_WINDOW_FGCOLOR );
|
||||
HUD_DrawNums( getstatf( STAT_CURRENT_CLIP ), vAmmoClipPos, fAmmoAlpha, VGUI_WINDOW_FGCOLOR );
|
||||
vector vAmmoCalPos = [ vVideoResolution_x - 64, vVideoResolution_y - 42 ];
|
||||
HUD_DrawNums( getstatf( STAT_CURRENT_CALIBER ), vAmmoCalPos, 1, VGUI_WINDOW_FGCOLOR );
|
||||
HUD_DrawNums( getstatf( STAT_CURRENT_CALIBER ), vAmmoCalPos, fAmmoAlpha, VGUI_WINDOW_FGCOLOR );
|
||||
|
||||
// Caliber icon
|
||||
drawsubpic( vVideoResolution - '42 42 0', '24 24 0', HUD_NUMFILE_LAYER, vHUDCalPos[ wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iCaliber ], [ NUMSIZE_X, NUMSIZE_X ], VGUI_WINDOW_FGCOLOR, 1, DRAWFLAG_ADDITIVE );
|
||||
drawsubpic( vVideoResolution - '42 42 0', '24 24 0', HUD_NUMFILE_LAYER, vHUDCalPos[ wptTable[ getstatf( STAT_ACTIVEWEAPON ) ].iCaliber ], [ NUMSIZE_X, NUMSIZE_X ], VGUI_WINDOW_FGCOLOR, fAmmoAlpha, DRAWFLAG_ADDITIVE );
|
||||
fOldClip = getstatf( STAT_CURRENT_CLIP );
|
||||
fOldCal = getstatf( STAT_CURRENT_CALIBER );
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -49,15 +49,17 @@ vector VGUI_Scores_DrawTeam( vector vPos, float fTeam ) {
|
|||
for ( int i = -1; i > -32; i-- ) {
|
||||
if ( stof( getplayerkeyvalue( i, "*team" ) ) == fTeam ) {
|
||||
if ( getplayerkeyvalue( i, "name" ) ) {
|
||||
vColor = HUD_GetChatColor( fTeam );
|
||||
|
||||
if ( getplayerkeyvalue( i, "name" ) == getplayerkeyvalue( player_localnum, "name" ) ) {
|
||||
vColor = HUD_GetChatColor( fTeam );
|
||||
drawfill( vNewPos + '19 -2', '493 14', vColor, VGUI_WINDOW_BGALPHA, DRAWFLAG_ADDITIVE );
|
||||
vColor = '1 1 1';
|
||||
}
|
||||
|
||||
if ( getplayerkeyvalue( i, "*dead" ) == "1" ) {
|
||||
drawstring( vNewPos + '38 0', sprintf( "%s [DEAD]", getplayerkeyvalue( i, "name" ) ), '8 8 0', vColor, 1, 0 );
|
||||
} else if ( getplayerkeyvalue( i, "*dead" ) == "2" ) {
|
||||
drawstring( vNewPos + '38 0', sprintf( "%s [VIP]", getplayerkeyvalue( i, "name" ) ), '8 8 0', vColor, 1, 0 );
|
||||
} else {
|
||||
drawstring( vNewPos + '38 0', getplayerkeyvalue( i, "name" ), '8 8 0', vColor, 1, 0 );
|
||||
}
|
||||
|
@ -65,7 +67,7 @@ vector VGUI_Scores_DrawTeam( vector vPos, float fTeam ) {
|
|||
|
||||
// Spectators don't have stats worth caring about
|
||||
if ( fTeam != TEAM_SPECTATOR ) {
|
||||
VGUI_Scores_AlignedText( vNewPos + '320 0', getplayerkeyvalue( i, "*score" ), '8 8 0', vColor );
|
||||
VGUI_Scores_AlignedText( vNewPos + '320 0', getplayerkeyvalue( i, INFOKEY_P_FRAGS ), '8 8 0', vColor );
|
||||
VGUI_Scores_AlignedText( vNewPos + '384 0', getplayerkeyvalue( i, "*deaths" ), '8 8 0', vColor );
|
||||
}
|
||||
VGUI_Scores_AlignedText( vNewPos + '456 0', getplayerkeyvalue( i, INFOKEY_P_PING ), '8 8 0', vColor );
|
||||
|
|
|
@ -43,6 +43,11 @@ enum {
|
|||
STAT_WON_CT
|
||||
};
|
||||
|
||||
enum {
|
||||
ENT_AMBIENTSOUND = 1,
|
||||
ENT_SPRITE
|
||||
};
|
||||
|
||||
enum {
|
||||
GAME_INACTIVE,
|
||||
GAME_COMMENCING,
|
||||
|
|
|
@ -41,9 +41,10 @@ Not Toggled (32) - Older FGDs show this as Not Looped.
|
|||
Note that actual looping depends purely on cue points defined in the .wav file (see notes).
|
||||
*/
|
||||
#ifdef SSQC
|
||||
.float pitch;
|
||||
void ambient_generic( void ) {
|
||||
static float ambient_generic_send( entity ePEnt, float fChanged ) {
|
||||
WriteByte( MSG_ENTITY, 1 ); // Identifier
|
||||
WriteByte( MSG_ENTITY, ENT_AMBIENTSOUND ); // Identifier
|
||||
WriteCoord( MSG_ENTITY, self.origin_x );
|
||||
WriteCoord( MSG_ENTITY, self.origin_y );
|
||||
WriteCoord( MSG_ENTITY, self.origin_z );
|
||||
|
@ -53,7 +54,7 @@ void ambient_generic( void ) {
|
|||
return TRUE;
|
||||
}
|
||||
static void ambient_generic_use( void ) {
|
||||
sound( self, CHAN_VOICE, self.message, self.health, self.style );
|
||||
sound( self, CHAN_VOICE, self.message, self.health, self.style, self.pitch );
|
||||
}
|
||||
static void ambient_generic_useloop( void ) {
|
||||
if ( self.state == TRUE ) {
|
||||
|
|
|
@ -35,18 +35,28 @@ void Damage_Apply( entity eTarget, entity eAttacker, int iDamage, vector vHitPos
|
|||
|
||||
eTarget.health = eTarget.health - iDamage; // TODO: Body part multipliers
|
||||
|
||||
// Special monetary punishment for hostage murderers
|
||||
if ( eTarget.classname == "hostage_entity" ) {
|
||||
if ( eTarget.health > 0 ) {
|
||||
Money_AddMoney( eAttacker, -150 ); // Pain
|
||||
} else {
|
||||
Money_AddMoney( eAttacker, -1500 ); // Death
|
||||
}
|
||||
}
|
||||
|
||||
// Don't be like Q1 and make everything bleed.
|
||||
if ( eTarget.iBleeds == TRUE ) {
|
||||
makevectors( eAttacker.angles );
|
||||
pointparticles( EFFECT_BLOOD, vHitPos, v_forward * -1, 1 );
|
||||
}
|
||||
|
||||
// Target is dead and a client....
|
||||
if ( eTarget.health <= 0 ) {
|
||||
if ( eTarget.flags & FL_CLIENT && eAttacker.flags & FL_CLIENT ) {
|
||||
if ( ( eTarget.flags & FL_CLIENT ) && ( eAttacker.flags & FL_CLIENT ) ) {
|
||||
Damage_CastOrbituary( eAttacker, eTarget, eAttacker.weapon, FALSE );
|
||||
eAttacker.fKills++;
|
||||
eAttacker.frags++;
|
||||
eTarget.fDeaths++;
|
||||
|
||||
forceinfokey( eAttacker, "*score", ftos( eAttacker.fKills ) );
|
||||
forceinfokey( eTarget, "*deaths", ftos( eTarget.fDeaths ) );
|
||||
|
||||
Money_AddMoney( eAttacker, 300 );
|
||||
|
|
|
@ -42,7 +42,7 @@ float EFFECT_BLOOD;
|
|||
.int iCrouching;
|
||||
.int iCrouchAttempt;
|
||||
.int iHasBomb;
|
||||
.float fKills, fDeaths;
|
||||
.float fDeaths;
|
||||
|
||||
// Match specific fields
|
||||
int iWon_T;
|
||||
|
|
|
@ -38,18 +38,18 @@ entity hostage_waypoint( void ) {
|
|||
|
||||
// Called whenver a hostage is shot
|
||||
void hostage_pain( void ) {
|
||||
self.frame = 13 - ceil( random() * 5);
|
||||
self.frame = 13 - floor( random( 1, 6 ) );
|
||||
}
|
||||
|
||||
// hosdown.wav
|
||||
void hostage_die( void ) {
|
||||
Radio_BroadcastMessage( RADIO_HOSDOWN );
|
||||
self.frame = 30 + ceil( random() * 5);
|
||||
self.frame = 30 + floor( random( 1, 6 ) );
|
||||
self.solid = SOLID_NOT;
|
||||
self.takedamage = DAMAGE_NO;
|
||||
|
||||
if ( other.eTargetPoint != other.eUser ) {
|
||||
remove( other.eTargetPoint );
|
||||
remove( other.eTargetPoint );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -57,10 +57,10 @@ void hostage_die( void ) {
|
|||
void hostage_use( void ) {
|
||||
if ( eActivator.team == TEAM_CT ) {
|
||||
if ( ( self.eUser == world ) ) {
|
||||
|
||||
// Only give cash to the CT for using it for the first time
|
||||
if ( self.iHasBeenUsed == FALSE ) {
|
||||
Money_AddMoney( eActivator, 150 );
|
||||
sound( self, CHAN_VOICE, sprintf( "hostage/hos%d.wav", ceil( random() * 5 ) ), 1.0, ATTN_IDLE );
|
||||
sound( self, CHAN_VOICE, sprintf( "hostage/hos%d.wav", random( 1, 6 ) ), 1.0, ATTN_IDLE );
|
||||
self.iHasBeenUsed = TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,12 +42,50 @@ void cycler_sprite( void ) {
|
|||
|
||||
Entities_RenderSetup();
|
||||
Entities_InitRespawnable( cycler_sprite_respawn );
|
||||
self.vUse = cycler_sprite_respawn;
|
||||
}
|
||||
|
||||
void env_glow( void ) {
|
||||
cycler_sprite();
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
env_sprite
|
||||
|
||||
This entity lets you display and cycle through the animation of a sprite.
|
||||
|
||||
Attributes:
|
||||
Name (targetname) - Property used to identify entities.
|
||||
Pitch Yaw Roll (angles) - Sets the pitch (up / down), yaw (left / right) and roll (bank) respectively. The compass in WorldCraft / Hammer corresponds to Yaw. The settings are not always (or not all) used.
|
||||
Sprite (model) - A sprite must be specified here (sprites/spritename.spr).
|
||||
Frames per second (framerate) - Framerate the sprite will run at if animated.
|
||||
=================
|
||||
*/
|
||||
.float framerate;
|
||||
void env_sprite( void ) {
|
||||
static float env_sprite_send( entity ePEnt, float fChanged ) {
|
||||
WriteByte( MSG_ENTITY, ENT_SPRITE ); // Identifier
|
||||
WriteCoord( MSG_ENTITY, self.origin_x );
|
||||
WriteCoord( MSG_ENTITY, self.origin_y );
|
||||
WriteCoord( MSG_ENTITY, self.origin_z );
|
||||
WriteFloat( MSG_ENTITY, self.modelindex );
|
||||
WriteFloat( MSG_ENTITY, self.framerate );
|
||||
WriteFloat( MSG_ENTITY, self.scale );
|
||||
WriteFloat( MSG_ENTITY, self.alpha );
|
||||
WriteFloat( MSG_ENTITY, self.effects );
|
||||
return TRUE;
|
||||
}
|
||||
static void env_sprite_use( void ) {
|
||||
}
|
||||
|
||||
precache_model( self.model );
|
||||
setorigin( self, self.origin );
|
||||
Entities_RenderSetup();
|
||||
self.SendEntity = env_sprite_send;
|
||||
self.vUse = env_sprite_use;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
env_render
|
||||
|
|
|
@ -44,7 +44,7 @@ void Footsteps_Update( void ) {
|
|||
dDelay = clamp( 0.1, 1 / ( fForce / 90 ), 1 );
|
||||
|
||||
traceline( self.origin + self.view_ofs, self.origin + '0 0 -48', FALSE, self );
|
||||
sound( self, CHAN_BODY, sprintf( "player/pl_step%d.wav", ceil( random() * 4) ), 0.5, ATTN_IDLE );
|
||||
sound( self, CHAN_BODY, sprintf( "player/pl_step%d.wav", random( 1, 5 ) ), 0.5, ATTN_IDLE );
|
||||
|
||||
self.fSteptime = time + dDelay;
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ void func_breakable_pain( void ) {
|
|||
}
|
||||
|
||||
if ( iTypeCount >= 1 ) {
|
||||
sound( self, CHAN_VOICE, sprintf( "%s%d.wav", sTypeSample, ceil( random() * iTypeCount ) ), 1.0, ATTN_NORM );
|
||||
sound( self, CHAN_VOICE, sprintf( "%s%d.wav", sTypeSample, random( 1, (float)iTypeCount + 1 ) ), 1.0, ATTN_NORM );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,7 +108,7 @@ void func_breakable_die( void ) {
|
|||
}
|
||||
|
||||
if ( iTypeCount >= 1 ) {
|
||||
sound( self, CHAN_VOICE, sprintf( "%s%d.wav", sTypeSample, ceil( random() * iTypeCount ) ), 1.0, ATTN_NORM );
|
||||
sound( self, CHAN_VOICE, sprintf( "%s%d.wav", sTypeSample, random( 1, (float)iTypeCount + 1 ) ), 1.0, ATTN_NORM );
|
||||
}
|
||||
|
||||
Effect_BreakModel( self.absmin, self.absmax, self.velocity, self.material );
|
||||
|
|
|
@ -195,6 +195,11 @@ FuncButton_Trigger
|
|||
====================
|
||||
*/
|
||||
void FuncButton_Trigger( void ) {
|
||||
if ( self.fAttackFinished > self.ltime ) {
|
||||
return;
|
||||
}
|
||||
self.fAttackFinished = self.ltime + self.wait;
|
||||
|
||||
if ( ( self.state == STATE_UP ) || ( self.state == STATE_RAISED ) ){
|
||||
FuncButton_MoveBack();
|
||||
return;
|
||||
|
|
|
@ -175,6 +175,11 @@ FuncDoor_Trigger
|
|||
====================
|
||||
*/
|
||||
void FuncDoor_Trigger( void ) {
|
||||
if ( self.fAttackFinished > self.ltime ) {
|
||||
return;
|
||||
}
|
||||
self.fAttackFinished = self.ltime + self.wait;
|
||||
|
||||
// Only trigger stuff when we are done moving
|
||||
if ( ( self.state == STATE_RAISED ) || ( self.state == STATE_LOWERED ) ) {
|
||||
if ( self.delay > 0 ) {
|
||||
|
|
|
@ -29,10 +29,13 @@ void func_vip_safetyzone_touch( void ) {
|
|||
|
||||
entity eOld = self;
|
||||
self = other;
|
||||
self.team = TEAM_CT;
|
||||
|
||||
Spawn_MakeSpectator();
|
||||
self.classname = "player";
|
||||
|
||||
self.team = TEAM_CT;
|
||||
forceinfokey( self, "*dead", "0" );
|
||||
iAlivePlayers_CT--;
|
||||
|
||||
self = eOld;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,14 +64,11 @@ float Rules_BuyingPossible( void ) {
|
|||
|
||||
// Loop through all players and respawn them
|
||||
void Rules_Restart( void ) {
|
||||
|
||||
iHostagesRescued = 0;
|
||||
|
||||
entity eFind = findchain( classname, "player" );
|
||||
entity eOld = self;
|
||||
|
||||
while ( eFind ) {
|
||||
|
||||
for ( entity eFind = world; eFind = find( eFind, classname, "player" ); ) {
|
||||
self = eFind;
|
||||
|
||||
if ( self.health > 0 ) {
|
||||
|
@ -81,69 +78,51 @@ void Rules_Restart( void ) {
|
|||
}
|
||||
|
||||
Money_GiveTeamReward();
|
||||
|
||||
eFind = eFind.chain;
|
||||
}
|
||||
|
||||
self = eOld;
|
||||
|
||||
// Select a random Terrorist for the bomb thing
|
||||
if ( iBombZones > 0 ) {
|
||||
int iRandomT = ceil( random() * iAlivePlayers_T );
|
||||
int iRandomT = floor( random( 1, (float)iAlivePlayers_T + 1 ) );
|
||||
int iPickT = 0;
|
||||
|
||||
eFind = findchain( classname, "player" );
|
||||
while ( eFind ) {
|
||||
|
||||
if ( eFind.classname == "player" && eFind.team == TEAM_T ) {
|
||||
for ( entity eFind = world; eFind = find( eFind, classname, "player" ); ) {
|
||||
if ( eFind.team == TEAM_T ) {
|
||||
iPickT++;
|
||||
|
||||
if ( iPickT == iRandomT ) {
|
||||
eOld = self;
|
||||
self = eFind;
|
||||
Weapon_AddItem( WEAPON_C4BOMB );
|
||||
self = eOld;
|
||||
}
|
||||
}
|
||||
|
||||
eFind = eFind.chain;
|
||||
}
|
||||
}
|
||||
|
||||
// If there is a VIP, select a random CT to be it
|
||||
if ( iVIPZones > 0 ) {
|
||||
int iRandomCT = ceil( random() * iAlivePlayers_CT );
|
||||
int iRandomCT = floor( random( 1, (float)iAlivePlayers_CT + 1 ) );
|
||||
int iPickCT = 0;
|
||||
|
||||
eFind = findchain( classname, "player" );
|
||||
while ( eFind ) {
|
||||
|
||||
if ( eFind.classname == "player" && eFind.team == TEAM_CT ) {
|
||||
for ( entity eFind = world; eFind = find( eFind, classname, "player" ); ) {
|
||||
if ( eFind.team == TEAM_CT ) {
|
||||
iPickCT++;
|
||||
|
||||
if ( iPickCT == iRandomCT ) {
|
||||
eOld = self;
|
||||
self = eFind;
|
||||
self.team = TEAM_VIP;
|
||||
Spawn_RespawnClient( self.team );
|
||||
self = eOld;
|
||||
forceinfokey( self, "*dead", "2" );
|
||||
}
|
||||
}
|
||||
|
||||
eFind = eFind.chain;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Respawn all the entities
|
||||
eFind = findchainfloat( fRespawns , TRUE );
|
||||
eOld = self;
|
||||
while ( eFind ) {
|
||||
|
||||
|
||||
for ( entity eFind = world; eFind = findfloat( eFind, fRespawns, TRUE ); ) {
|
||||
self = eFind;
|
||||
Entities_Respawn();
|
||||
|
||||
eFind = eFind.chain;
|
||||
}
|
||||
|
||||
self = eOld;
|
||||
|
||||
Timer_Begin( cvar( "mp_freezetime" ), GAME_FREEZE );
|
||||
|
|
|
@ -211,9 +211,8 @@ void CSEv_GamePlayerSpawn_f( float fChar ) {
|
|||
|
||||
}
|
||||
|
||||
self.fKills = 0;
|
||||
self.frags = 0;
|
||||
self.fDeaths = 0;
|
||||
forceinfokey( self, "*score", "0" );
|
||||
forceinfokey( self, "*deaths", "0" );
|
||||
}
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ void Timer_Update( void ) {
|
|||
} else {
|
||||
Timer_Begin( cvar( "mp_roundtime" ) * 60, GAME_ACTIVE ); // Unfreeze
|
||||
|
||||
float fRand = ceil( random() * 3 );
|
||||
float fRand = floor( random( 1, 4 ) );
|
||||
if ( fRand == 1 ) {
|
||||
Radio_BroadcastMessage( RADIO_MOVEOUT );
|
||||
} else if ( fRand == 2 ) {
|
||||
|
|
|
@ -33,7 +33,7 @@ void TraceAttack_FireBullets( int iShots ) {
|
|||
if ( trace_ent.takedamage == DAMAGE_YES ) {
|
||||
Damage_Apply( trace_ent, self, wptTable[ self.weapon ].iDamage, trace_endpos );
|
||||
} else {
|
||||
pointparticles( EFFECT_GUNSHOT, trace_endpos, '0 0 0', 1 );
|
||||
pointparticles( EFFECT_GUNSHOT, trace_endpos, trace_plane_normal, 1 );
|
||||
}
|
||||
}
|
||||
iShots--;
|
||||
|
|
|
@ -18,6 +18,33 @@ along with this program; if not, write to the Free Software
|
|||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef CSQC
|
||||
.float framerate;
|
||||
.float maxframe;
|
||||
void Effect_AnimatedSprite( vector vPos, float fIndex, float fFPS, float fScale, float fAlpha, float fEffects ) {
|
||||
|
||||
static void Effect_AnimatedSprite_Animate( void ) {
|
||||
if( self.frame >= self.maxframe ) {
|
||||
self.frame = 0;
|
||||
} else {
|
||||
self.frame += 1;
|
||||
}
|
||||
|
||||
self.nextthink = time + ( 1 / self.framerate );
|
||||
}
|
||||
self.modelindex = fIndex;
|
||||
setorigin( self, vPos );
|
||||
self.scale = fScale;
|
||||
self.alpha = fAlpha;
|
||||
self.effects = fEffects;
|
||||
self.framerate = fFPS;
|
||||
self.think = Effect_AnimatedSprite_Animate;
|
||||
self.drawmask = MASK_ENGINE;
|
||||
self.nextthink = time + ( 1 / self.framerate );
|
||||
//self.maxframe = modelframecount( self.modelindex );
|
||||
}
|
||||
#endif
|
||||
|
||||
void Effect_BreakModel( vector vMins, vector vMaxs, vector vVel, float fStyle ) {
|
||||
#ifdef SSQC
|
||||
WriteByte( MSG_MULTICAST, SVC_CGAMEPACKET );
|
||||
|
@ -31,11 +58,12 @@ void Effect_BreakModel( vector vMins, vector vMaxs, vector vVel, float fStyle )
|
|||
WriteByte( MSG_MULTICAST, fStyle );
|
||||
|
||||
msg_entity = self;
|
||||
multicast( '0 0 0', MULTICAST_PVS );
|
||||
multicast( '0 0 0', MULTICAST_ALL );
|
||||
#else
|
||||
static void Effect_BreakModel_Remove( void ) { remove( self ) ; }
|
||||
|
||||
float fCount = 20; // TODO: Generate gibcount based around size.
|
||||
float fCount = 20; // TODO: Generate gibcount based around size
|
||||
float fModelCount;
|
||||
vector vPos;
|
||||
string sModel = "";
|
||||
|
||||
|
@ -43,30 +71,37 @@ void Effect_BreakModel( vector vMins, vector vMaxs, vector vVel, float fStyle )
|
|||
case MATERIAL_GLASS:
|
||||
case MATERIAL_GLASS_UNBREAKABLE:
|
||||
sModel = "models/glassgibs.mdl";
|
||||
fModelCount = 8;
|
||||
break;
|
||||
case MATERIAL_WOOD:
|
||||
sModel = "models/woodgibs.mdl";
|
||||
fModelCount = 3;
|
||||
break;
|
||||
case MATERIAL_METAL:
|
||||
sModel = "models/metalplategibs.mdl";
|
||||
fModelCount = 13;
|
||||
break;
|
||||
case MATERIAL_FLESH:
|
||||
sModel = "models/fleshgibs.mdl";
|
||||
break;
|
||||
case MATERIAL_CINDER:
|
||||
sModel = "models/cindergibs.mdl";
|
||||
fModelCount = 4;
|
||||
break;
|
||||
case MATERIAL_TILE:
|
||||
sModel = "models/ceilinggibs.mdl";
|
||||
fModelCount = 4;
|
||||
break;
|
||||
case MATERIAL_COMPUTER:
|
||||
sModel = "models/computergibs.mdl";
|
||||
fModelCount = 15;
|
||||
break;
|
||||
case MATERIAL_ROCK:
|
||||
sModel = "models/rockgibs.mdl";
|
||||
fModelCount = 3;
|
||||
break;
|
||||
default:
|
||||
case MATERIAL_CINDER:
|
||||
sModel = "models/cindergibs.mdl";
|
||||
fModelCount = 9;
|
||||
break;
|
||||
}
|
||||
|
||||
while ( fCount > 0 ) {
|
||||
|
@ -77,7 +112,8 @@ void Effect_BreakModel( vector vMins, vector vMaxs, vector vVel, float fStyle )
|
|||
vPos_z = vMins_z + ( random() * ( vMaxs_z - vMins_z ) );
|
||||
|
||||
setorigin( eGib, vPos );
|
||||
setmodel( eGib, sModel ); // Placeholder
|
||||
setmodel( eGib, sModel );
|
||||
setcustomskin( eGib, "", sprintf( "geomset 0 %f\n", random( 1, fModelCount + 1 ) ) );
|
||||
eGib.movetype = MOVETYPE_BOUNCE;
|
||||
eGib.solid = SOLID_NOT;
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ void WeaponAK47_PrimaryFire( void ) {
|
|||
}
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_AK47_SHOOT1 );
|
||||
} else if ( iRand == 2 ) {
|
||||
|
|
|
@ -68,7 +68,7 @@ void WeaponAUG_PrimaryFire( void ) {
|
|||
sound( self, CHAN_WEAPON, "weapons/aug-1.wav", 1, ATTN_NORM );
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_AUG_SHOOT1 );
|
||||
} else if ( iRand == 2 ) {
|
||||
|
|
|
@ -69,7 +69,7 @@ void WeaponAWP_PrimaryFire( void ) {
|
|||
sound( self, CHAN_WEAPON, "weapons/awp1.wav", 1, ATTN_NORM );
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_AWP_SHOOT1 );
|
||||
} else if ( iRand == 2 ) {
|
||||
|
|
|
@ -92,6 +92,7 @@ void WeaponC4BOMB_Drop( vector vBombPos ) {
|
|||
|
||||
Radio_BroadcastMessage( RADIO_BOMBPL );
|
||||
iBombPlanted = TRUE;
|
||||
self.iSlotGrenade = self.iSlotGrenade - WEAPON_C4BOMB;
|
||||
Weapon_SwitchBest();
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -85,7 +85,7 @@ void WeaponELITES_PrimaryFire( void ) {
|
|||
sound( self, CHAN_WEAPON, "weapons/elite_fire.wav", 1, ATTN_NORM );
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 5 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
if ( iWeaponMode_ELITES == 0 ) {
|
||||
if ( getstatf( STAT_CURRENT_CLIP ) == 1 ) {
|
||||
View_PlayAnimation( ANIM_ELITES_SHOOT_LEFTLAST );
|
||||
|
|
|
@ -56,6 +56,8 @@ enum {
|
|||
void WeaponKNIFE_Draw( void ) {
|
||||
#ifdef SSQC
|
||||
Client_SendEvent( self, EV_WEAPON_DRAW );
|
||||
self.iCurrentClip = 0;
|
||||
self.iCurrentCaliber = 0;
|
||||
#else
|
||||
View_PlayAnimation( ANIM_KNIFE_DRAW );
|
||||
#endif
|
||||
|
|
|
@ -94,7 +94,7 @@ void WeaponM4A1_PrimaryFire( void ) {
|
|||
}
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
|
||||
if ( iRand == 1 ) {
|
||||
if ( iWeaponMode_M4A1 == TRUE ) {
|
||||
|
|
|
@ -72,7 +72,7 @@ void WeaponMP5_PrimaryFire( void ) {
|
|||
}
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_MP5_SHOOT1 );
|
||||
} else if ( iRand == 2 ) {
|
||||
|
|
|
@ -67,7 +67,7 @@ void WeaponMAC10_PrimaryFire( void ) {
|
|||
sound( self, CHAN_WEAPON, "weapons/mac10-1.wav", 1, ATTN_NORM );
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_MAC10_SHOOT1 );
|
||||
|
|
|
@ -74,7 +74,7 @@ void WeaponP228_PrimaryFire( void ) {
|
|||
View_PlayAnimation( ANIM_P228_SHOOT_EMPTY );
|
||||
} else {
|
||||
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_P228_SHOOT1 );
|
||||
|
|
|
@ -68,7 +68,7 @@ void WeaponP90_PrimaryFire( void ) {
|
|||
sound( self, CHAN_WEAPON, "weapons/p90-1.wav", 1, ATTN_NORM );
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_P90_SHOOT1 );
|
||||
|
|
|
@ -72,7 +72,7 @@ void WeaponSG552_PrimaryFire( void ) {
|
|||
}
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_SG552_SHOOT1 );
|
||||
} else if ( iRand == 2 ) {
|
||||
|
|
|
@ -71,7 +71,7 @@ void WeaponTMP_PrimaryFire( void ) {
|
|||
}
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_TMP_SHOOT1 );
|
||||
} else if ( iRand == 2 ) {
|
||||
|
|
|
@ -68,7 +68,7 @@ void WeaponUMP45_PrimaryFire( void ) {
|
|||
sound( self, CHAN_WEAPON, "weapons/ump45-1.wav", 1, ATTN_NORM );
|
||||
}
|
||||
#else
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
|
||||
if ( iRand == 1 ) {
|
||||
View_PlayAnimation( ANIM_UMP45_SHOOT1 );
|
||||
|
|
|
@ -103,7 +103,7 @@ void WeaponUSP45_PrimaryFire( void ) {
|
|||
View_PlayAnimation( ANIM_USP45_SHOOTLAST );
|
||||
}
|
||||
} else {
|
||||
int iRand = ceil( random() * 3 );
|
||||
int iRand = (int)floor( random( 1, 4 ) );
|
||||
|
||||
if ( iRand == 1 ) {
|
||||
if ( iWeaponMode_USP45 == TRUE ) {
|
||||
|
|
Binary file not shown.
|
@ -4,7 +4,7 @@ r_part te_gunshot
|
|||
texture ball
|
||||
tcoords 1 65 31 95 256 8 32
|
||||
scale 1
|
||||
count 12
|
||||
count 8
|
||||
scalefactor 1
|
||||
alpha 0.5
|
||||
die 0.8
|
||||
|
@ -13,7 +13,7 @@ r_part te_gunshot
|
|||
spawnmode ball
|
||||
spawnorg 1
|
||||
spawnvel 100
|
||||
veladd -100
|
||||
veladd 100
|
||||
friction 0.3
|
||||
gravity 800
|
||||
}
|
||||
|
@ -32,7 +32,26 @@ r_part +te_gunshot
|
|||
spawnmode ball
|
||||
spawnorg 2
|
||||
spawnvel 20
|
||||
veladd -20
|
||||
veladd 20
|
||||
}
|
||||
|
||||
r_part +te_gunshot
|
||||
{
|
||||
type ball
|
||||
texture ball
|
||||
tcoords 1 65 31 95 256 8 32
|
||||
scale 2
|
||||
count 18
|
||||
scalefactor 1
|
||||
alpha 1
|
||||
die 0.8
|
||||
rgb 25 25 25
|
||||
spawnmode ball
|
||||
spawnorg 1
|
||||
spawnvel 100
|
||||
veladd 100
|
||||
friction 0.3
|
||||
gravity 800
|
||||
}
|
||||
|
||||
r_part te_blood
|
||||
|
|
BIN
opencs/progs.dat
BIN
opencs/progs.dat
Binary file not shown.
Loading…
Reference in a new issue