Browse Source

Merge original "BubbleMOD" source code.

bubblemod
Night Owl 8 years ago
parent
commit
2ad83a9ada
  1. 273
      dlls/client.cpp
  2. 47
      dlls/combat.cpp
  3. 64
      dlls/crossbow.cpp
  4. 96
      dlls/crowbar.cpp
  5. 5
      dlls/doors.cpp
  6. 19
      dlls/egon.cpp
  7. 4
      dlls/func_tank.cpp
  8. 783
      dlls/game.cpp
  9. 109
      dlls/game.h
  10. 17
      dlls/gamerules.h
  11. 14
      dlls/gauss.cpp
  12. 140
      dlls/ggrenade.cpp
  13. 8
      dlls/globals.cpp
  14. 6
      dlls/h_battery.cpp
  15. 13
      dlls/handgrenade.cpp
  16. 8
      dlls/healthkit.cpp
  17. 831
      dlls/hornetgun.cpp
  18. 6
      dlls/items.cpp
  19. 40
      dlls/mp5.cpp
  20. 393
      dlls/multiplay_gamerules.cpp
  21. 170
      dlls/player.cpp
  22. 52
      dlls/player.h
  23. 2
      dlls/python.cpp
  24. 15
      dlls/rpg.cpp
  25. 50
      dlls/satchel.cpp
  26. 53
      dlls/shotgun.cpp
  27. 120
      dlls/squeakgrenade.cpp
  28. 57
      dlls/teamplay_gamerules.cpp
  29. 6
      dlls/triggers.cpp
  30. 88
      dlls/tripmine.cpp
  31. 18
      dlls/util.h
  32. 84
      dlls/weapons.cpp
  33. 24
      dlls/weapons.h
  34. 59
      dlls/world.cpp

273
dlls/client.cpp

@ -50,6 +50,15 @@ extern int gmsgSayText; @@ -50,6 +50,15 @@ extern int gmsgSayText;
extern int g_teamplay;
// BMOD Begin - Extra funtions and vars
extern DLL_GLOBAL int g_VoteStatus;
extern DLL_GLOBAL float g_VoteTimer;
extern cvar_t bm_voting;
extern cvar_t bm_votetime;
extern cvar_t timeleft, fragsleft;
extern int CountPlayers( void );
// BMOD End - Extra funtions and vars
void LinkUserMessages( void );
/*
@ -287,6 +296,31 @@ void Host_Say( edict_t *pEntity, int teamonly ) @@ -287,6 +296,31 @@ void Host_Say( edict_t *pEntity, int teamonly )
if( (int)strlen( p ) > j )
p[j] = 0;
/ BMOD Start - Llamas!!
if( ( (CBasePlayer*)CBasePlayer::Instance( pEntity ) )->m_IsLlama )
{
switch( RANDOM_LONG( 0, 3 ) )
{
case 0:
strcpy( p, "Bleeeet!" );
break;
case 1:
strcpy( p, "Blaaaaa!!" );
break;
case 2:
strcpy( p, "Snort!" );
break;
case 3:
strcpy( p, "Blleehhaa!" );
break;
}
}
// BMOD End - Llamas!!
// BMOD Edit - L33t Sp33k!!
if( ( (CBasePlayer*)CBasePlayer::Instance( pEntity ) )->m_LeetSpeak )
UTIL_Speak_2_l33t( text, p );
else
strcat( text, p );
strcat( text, "\n" );
@ -358,6 +392,198 @@ void Host_Say( edict_t *pEntity, int teamonly ) @@ -358,6 +392,198 @@ void Host_Say( edict_t *pEntity, int teamonly )
temp,
p );
}
// BMOD Begin - client say commands
CBasePlayer *talker = (CBasePlayer*)CBasePlayer::Instance( pEntity );
// BMOD Begin - Anti Spam
talker->m_iSpamSay++;
// BMOD End - Anti Spam
if( !strcmp( p, "timeleft" ) )
{
if( timeleft.value )
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %i:%0.2i left on this map.\n",
(int)timeleft.value / 60, (int)timeleft.value % 60 ) );
else
UTIL_ClientPrintAll( HUD_PRINTTALK, "<SERVER> No time limit on this map.\n" );
}
else if( !strcmp( p, "gagform" ) )
{
UTIL_ClientPrintAll( HUD_PRINTTALK, "<SERVER> I was just kidding Form. :)\n" );
}
else if( !strcmp( p, "fragsleft" ) )
{
if( fragsleft.value )
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %i frags left on this map.\n",
(int)fragsleft.value ) );
else
UTIL_ClientPrintAll( HUD_PRINTTALK, "<SERVER> No frag limit on this map.\n" );
}
else if( !strcmp( p, "map" ) )
{
// g_pGameRules->BMOD_PreChangeLevel();
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> Current map is: \"%s\", next is: \"%s\"\n",
STRING( gpGlobals->mapname ),
CVAR_GET_STRING( "bm_nextmap" ) ) );
}
else if( !strcmp( p, "status" ) )
{
// g_pGameRules->BMOD_PreChangeLevel();
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> Timeleft: %i:%0.2i Fragsleft: %i Map: \"%s\" Next: \"%s\"\n",
(int)timeleft.value / 60,
(int)timeleft.value % 60,
(int)fragsleft.value,
STRING( gpGlobals->mapname ),
CVAR_GET_STRING( "bm_nextmap" ) ) );
}
else if( !strcmp( p, "time" ) )
{
UTIL_SayTime();
}
// map voting
else if( !strcmp( p, "rockthevote" ) && ( g_VoteStatus == 1 ) )
{
int players = CountPlayers();
int votesNeeded = ( players * 3 / 4 ) + ( ( players < 3 ) ? 1 : 0 );
char winner[81];
strcpy( winner, UTIL_CountVotes() );
int winvotes = winner[0];
if( winvotes )
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %i:%0.2i remaining in current vote. \"%s\" is leading with %i vote(s). (needs %i to win with %i players)\n",
(int)( g_VoteTimer - gpGlobals->time ) / 60,
(int)( g_VoteTimer - gpGlobals->time ) % 60,
&(winner[1]),
winvotes,
votesNeeded,
players ) );
else
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %i:%0.2i remaining in current vote. No votes have been cast. (winner needs %i to win with %i players)\n",
(int)( g_VoteTimer - gpGlobals->time ) / 60,
(int)( g_VoteTimer - gpGlobals->time ) % 60,
votesNeeded,
players ) );
}
else if( !strcmp( p, "rockthevote" ) && ( g_VoteStatus == 0 ) )
{
if( !bm_voting.value )
{
UTIL_ClientPrintAll( HUD_PRINTTALK, "<SERVER> Voting is disabled on this server.\n" );
}
else if( timeleft.value > 0 && timeleft.value < bm_votetime.value )
{
UTIL_ClientPrintAll( HUD_PRINTTALK, "<SERVER> Not enough time left for a vote!\n" );
}
else
{
g_VoteStatus = 1;
int players = CountPlayers();
int votesNeeded = ( players * 3 / 4 ) + ( ( players < 3 ) ? 1 : 0 );
UTIL_SpeakAll( "dadeda" );
UTIL_ClientPrintAll( HUD_PRINTTALK, "<SERVER> *** Vote mode enabled! ***\n" );
UTIL_ClientPrintAll( HUD_PRINTTALK, "<SERVER> Say \"vote <mapname>\" to vote for a map.\n" );
UTIL_ClientPrintAll( HUD_PRINTTALK, "<SERVER> Say \"vote extend\" to extend the current map.\n" );
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> Maps need %i votes with %i players to win.\n",
votesNeeded, players ) );
UTIL_LogPrintf( "// \"%s<%i><%s><%s>\" started a new map vote.\n",
STRING( talker->pev->netname ),
GETPLAYERUSERID( pEntity ),
GETPLAYERAUTHID( pEntity ),
g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pEntity ), "model" )
);
client = NULL;
while( ( ( client = (CBasePlayer*)UTIL_FindEntityByClassname( client, "player" ) ) != NULL )
&& ( !FNullEnt( client->edict() ) ) )
{
strcpy( client->m_sMapVote, "" );
}
g_VoteTimer = gpGlobals->time + bm_votetime.value;
}
}
else if( ( g_VoteStatus == 1 ) && ( strlen( p ) > 5 ) && ( !strncmp( p, "vote ", 5 ) ) )
{
BOOL isVote = TRUE;
int index = 5;
while( p[index] )
{
if( p[index++] == ' ' )
isVote = FALSE;
}
if( isVote )
{
char *map = p + 5;
/*if( !strcmp( map, "extend" ) )
{
strcpy( talker->m_sMapVote, "extend" );
char winner[81];
strcpy( winner, UTIL_CountVotes() );
int players = CountPlayers();
int votesNeeded = ( players * 3 / 4 ) + ( ( players < 3 ) ? 1 : 0 );
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %s voted to extend this map. (%s has %i votes, needs %i to win.)\n",
STRING( talker->pev->netname ),
&( winner[1] ),
winner[0],
votesNeeded) );
UTIL_LogPrintf( "// \"%s<%i><%s><%s>\" voted to extend the current map.\n",
STRING( talker->pev->netname ),
GETPLAYERUSERID( pEntity ),
GETPLAYERAUTHID( pEntity ),
g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pEntity ), "model" )
);
if( winner[0] >= votesNeeded )
{
g_VoteTimer = gpGlobals->time;
}
}*/
if( IS_MAP_VALID( map ) || !strcmp( map, "extend" ) )
{
strcpy( talker->m_sMapVote, map );
char winner[81];
strcpy( winner, UTIL_CountVotes() );
int players = CountPlayers();
int votesNeeded = ( players * 3 / 4 ) + ( ( players < 3 ) ? 1 : 0 );
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %s voted for \"%s\". (%s has %i votes, needs %i to win.)\n",
STRING( talker->pev->netname ),
map,
&( winner[1] ),
winner[0],
votesNeeded) );
UTIL_LogPrintf( "// \"%s<%i><%s><%s>\" voted for map \"%s\".\n",
STRING( talker->pev->netname ),
GETPLAYERUSERID( pEntity ),
GETPLAYERAUTHID( pEntity ),
g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pEntity ), "model" ),
map);
if( winner[0] >= votesNeeded )
{
g_VoteTimer = gpGlobals->time;
}
}
else
{
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> Sorry %s, \"%s\" is not on this server.\n",
STRING( talker->pev->netname ),
map ) );
UTIL_LogPrintf( "// \"%s<%i><%s><%s>\" voted for non-existant map \"%s\".\n",
STRING( talker->pev->netname ),
GETPLAYERUSERID( pEntity ),
GETPLAYERAUTHID( pEntity ),
g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pEntity ), "model" ),
map);
}
}
}
// BMOD End - client say commands
}
/*
@ -475,6 +701,25 @@ void ClientCommand( edict_t *pEntity ) @@ -475,6 +701,25 @@ void ClientCommand( edict_t *pEntity )
// clear 'Unknown command: VModEnable' in singleplayer
return;
}
else if( FStrEq( pcmd, "locate" ) )
{
if( CMD_ARGC() > 1 )
{
GetClassPtr( (CBasePlayer *)pev )->m_LocateMode = strcmp( CMD_ARGV( 1 ), "0" );
}
}
else if( FStrEq( pcmd, "leetspeak" ) )
{
if( CMD_ARGC() > 1 )
{
GetClassPtr( (CBasePlayer *)pev )->m_LeetSpeak = strcmp( CMD_ARGV( 1 ), "0" );
if( GetClassPtr( (CBasePlayer *)pev )->m_LeetSpeak )
ClientPrint( &pEntity->v, HUD_PRINTCONSOLE, "Leet-Speak enabled!\n" );
else
ClientPrint( &pEntity->v, HUD_PRINTCONSOLE, "Leet-Speak disabled. (lamer!)\n" );
}
}
else
{
// tell the user they entered an unknown command
@ -669,6 +914,30 @@ void StartFrame( void ) @@ -669,6 +914,30 @@ void StartFrame( void )
if( g_pGameRules )
g_pGameRules->Think();
// BMOD Begin - Multikills
CBasePlayer *client = NULL;
while( ( (client = (CBasePlayer*)UTIL_FindEntityByClassname( client, "player" ) ) != NULL )
&& ( client->IsPlayer() ) )
{
if( client->m_iKillsThisFrame > 1 && ( client->m_bIsConnected ) )
{
UTIL_LogPrintf( "// \"%s<%i><%s><%s>\" multi-killed %d players.\n",
STRING( client->pev->netname ),
GETPLAYERUSERID( client->edict() ),
GETPLAYERAUTHID( client->edict() ),
g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( client->edict() ), "model" ),
client->m_iKillsThisFrame
);
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %s got a %d-fer!!\n",
STRING( client->pev->netname ),
client->m_iKillsThisFrame
) );
}
client->m_iKillsThisFrame = 0;
}
// BMOD End - Multikills
if( g_fGameOver )
return;
@ -1582,6 +1851,10 @@ void UpdateClientData( const struct edict_s *ent, int sendweapons, struct client @@ -1582,6 +1851,10 @@ void UpdateClientData( const struct edict_s *ent, int sendweapons, struct client
cd->pushmsec = ent->v.pushmsec;
// BMOD Begin - Spectator Mode
cd->iuser1 = ent->v.iuser1;
cd->iuser2 = ent->v.iuser2;
// BMOD End - Spectator Mode
#if defined( CLIENT_WEAPONS )
if( sendweapons )
{

47
dlls/combat.cpp

@ -29,6 +29,7 @@ @@ -29,6 +29,7 @@
#include "animation.h"
#include "weapons.h"
#include "func_break.h"
#include "player.h"
extern DLL_GLOBAL Vector g_vecAttackDir;
extern DLL_GLOBAL int g_iSkillLevel;
@ -1484,10 +1485,15 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi @@ -1484,10 +1485,15 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi
Vector vecRight = gpGlobals->v_right;
Vector vecUp = gpGlobals->v_up;
float x, y, z;
int tracer;
if( pevAttacker == NULL )
pevAttacker = pev; // the default attacker is ourselves
CBasePlayer *pThisPlayer = NULL;
if( IsPlayer() )
pThisPlayer = (CBasePlayer *)this;
ClearMultiDamage();
gMultiDamage.type = DMG_BULLET | DMG_NEVERGIB;
@ -1507,6 +1513,42 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi @@ -1507,6 +1513,42 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi
vecEnd = vecSrc + vecDir * flDistance;
UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( pev )/*pentIgnore*/, &tr );
tracer = 0;
if( iTracerFreq != 0 && ( tracerCount++ % iTracerFreq ) == 0 )
{
Vector vecTracerSrc;
if( IsPlayer() )
{
// adjust tracer position for player
vecTracerSrc = vecSrc + Vector( 0, 0, -4 ) + gpGlobals->v_right * 2 + gpGlobals->v_forward * 16;
}
else
{
vecTracerSrc = vecSrc;
}
if( iTracerFreq != 1 ) // guns that always trace also always decal
tracer = 1;
switch( iBulletType )
{
case BULLET_MONSTER_MP5:
case BULLET_MONSTER_9MM:
case BULLET_MONSTER_12MM:
default:
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, vecTracerSrc );
WRITE_BYTE( TE_TRACER );
WRITE_COORD( vecTracerSrc.x );
WRITE_COORD( vecTracerSrc.y );
WRITE_COORD( vecTracerSrc.z );
WRITE_COORD( tr.vecEndPos.x );
WRITE_COORD( tr.vecEndPos.y );
WRITE_COORD( tr.vecEndPos.z );
MESSAGE_END();
break;
}
}
// do damage, paint decals
if( tr.flFraction != 1.0 )
{
@ -1533,7 +1575,10 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi @@ -1533,7 +1575,10 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi
pEntity->TraceAttack( pevAttacker, gSkillData.plrDmgBuckshot, vecDir, &tr, DMG_BULLET );
break;
case BULLET_PLAYER_357:
pEntity->TraceAttack( pevAttacker, gSkillData.plrDmg357, vecDir, &tr, DMG_BULLET );
if( pThisPlayer->m_RuneFlags == RUNE_357 )
pEntity->TraceAttack( pevAttacker, gSkillData.plrDmg357 * 2.5, vecDir, &tr, DMG_BULLET );
else
pEntity->TraceAttack( pevAttacker, gSkillData.plrDmg357, vecDir, &tr, DMG_BULLET );
break;
case BULLET_NONE: // FIX
pEntity->TraceAttack( pevAttacker, 50, vecDir, &tr, DMG_CLUB );

64
dlls/crossbow.cpp

@ -22,11 +22,15 @@ @@ -22,11 +22,15 @@
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
#include "BMOD_messaging.h"
#ifndef CLIENT_DLL
#define BOLT_AIR_VELOCITY 2000
#define BOLT_WATER_VELOCITY 1000
extern cvar_t bm_xbow_mod;
extern cvar_t bm_xbowtracers;
// UNDONE: Save/restore this? Don't forget to set classname and LINK_ENTITY_TO_CLASS()
//
// OVERLOADS SOME ENTVARS:
@ -75,6 +79,21 @@ void CCrossbowBolt::Spawn() @@ -75,6 +79,21 @@ void CCrossbowBolt::Spawn()
SetTouch( &CCrossbowBolt::BoltTouch );
SetThink( &CCrossbowBolt::BubbleThink );
pev->nextthink = gpGlobals->time + 0.2;
if( bm_xbowtracers.value )
{
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMFOLLOW );
WRITE_SHORT( entindex() ); // entity
WRITE_SHORT( g_sModelIndexSmoke ); // model
WRITE_BYTE( 5 ); // life
WRITE_BYTE( 1 ); // width
WRITE_BYTE( 100 ); // r, g, b
WRITE_BYTE( 100 ); // r, g, b
WRITE_BYTE( 200 ); // r, g, b
WRITE_BYTE( 255 ); // brightness
MESSAGE_END(); // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS)
}
}
void CCrossbowBolt::Precache()
@ -310,6 +329,9 @@ int CCrossbow::GetItemInfo( ItemInfo *p ) @@ -310,6 +329,9 @@ int CCrossbow::GetItemInfo( ItemInfo *p )
BOOL CCrossbow::Deploy()
{
if( bm_xbow_mod.value )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\nCROSSBOW\nSniper bolt damage lowered." );
if( m_iClip )
return DefaultDeploy( "models/v_crossbow.mdl", "models/p_crossbow.mdl", CROSSBOW_DRAW1, "bow" );
return DefaultDeploy( "models/v_crossbow.mdl", "models/p_crossbow.mdl", CROSSBOW_DRAW2, "bow" );
@ -384,10 +406,50 @@ void CCrossbow::FireSniperBolt() @@ -384,10 +406,50 @@ void CCrossbow::FireSniperBolt()
#ifndef CLIENT_DLL
if( tr.pHit->v.takedamage )
{
// BMOD - fix crossbow hit sounds.
switch( RANDOM_LONG( 0, 1 ) )
{
case 0:
EMIT_SOUND( tr.pHit, CHAN_BODY, "weapons/xbow_hitbod1.wav", 1, ATTN_NORM );
break;
case 1:
EMIT_SOUND( tr.pHit, CHAN_BODY, "weapons/xbow_hitbod2.wav", 1, ATTN_NORM );
break;
}
ClearMultiDamage();
CBaseEntity::Instance( tr.pHit )->TraceAttack( m_pPlayer->pev, 120, vecDir, &tr, DMG_BULLET | DMG_NEVERGIB );
if( bm_xbow_mod.value )
CBaseEntity::Instance( tr.pHit )->TraceAttack( m_pPlayer->pev, 90, vecDir, &tr, DMG_BULLET | DMG_NEVERGIB );
else
CBaseEntity::Instance( tr.pHit )->TraceAttack( m_pPlayer->pev, 120, vecDir, &tr, DMG_BULLET | DMG_NEVERGIB );
ApplyMultiDamage( pev, m_pPlayer->pev );
}
if( bm_xbowtracers.value )
{
// BMOD Begin - sniper bolt tracer
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMPOINTS );
WRITE_COORD( vecSrc.x );
WRITE_COORD( vecSrc.y );
WRITE_COORD( vecSrc.z );
WRITE_COORD( tr.vecEndPos.x );
WRITE_COORD( tr.vecEndPos.y );
WRITE_COORD( tr.vecEndPos.z );
WRITE_SHORT( g_sModelIndexLaser ); // model
WRITE_BYTE( 0 ); // framestart?
WRITE_BYTE( 0 ); // framerate?
WRITE_BYTE( 1 ); // life
WRITE_BYTE( 2 ); // width
WRITE_BYTE( 0 ); // noise
WRITE_BYTE( 100 ); // r, g, b
WRITE_BYTE( 100 ); // r, g, b
WRITE_BYTE( 200 ); // r, g, b
WRITE_BYTE( 200 ); // brightness
WRITE_BYTE( 0 ); // speed?
MESSAGE_END();
// BMOD End - sniper bolt tracer
}
#endif
}

96
dlls/crowbar.cpp

@ -22,6 +22,12 @@ @@ -22,6 +22,12 @@
#include "player.h"
#include "gamerules.h"
// BMOD Begin - Flying Crowbar
#include "BMOD_flyingcrowbar.h"
#include "BMOD_messaging.h"
extern cvar_t bm_cbar_mod;
// BMOD End - Flying Crowbar
#define CROWBAR_BODYHIT_VOLUME 128
#define CROWBAR_WALLHIT_VOLUME 512
@ -63,6 +69,10 @@ void CCrowbar::Precache( void ) @@ -63,6 +69,10 @@ void CCrowbar::Precache( void )
PRECACHE_SOUND( "weapons/cbar_hitbod3.wav" );
PRECACHE_SOUND( "weapons/cbar_miss1.wav" );
// BMOD Edit - Flying Crowbar
UTIL_PrecacheOther( "flying_crowbar" );
PRECACHE_MODEL( "models/w_weaponbox.mdl" );
m_usCrowbar = PRECACHE_EVENT( 1, "events/crowbar.sc" );
}
@ -83,6 +93,10 @@ int CCrowbar::GetItemInfo( ItemInfo *p ) @@ -83,6 +93,10 @@ int CCrowbar::GetItemInfo( ItemInfo *p )
BOOL CCrowbar::Deploy()
{
// BMOD Edit - Modified crowbar message
if( bm_cbar_mod.value )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\nCROWBAR\nSECONDARY FIRE: Throw crowbar." );
return DefaultDeploy( "models/v_crowbar.mdl", "models/p_crowbar.mdl", CROWBAR_DRAW, "crowbar" );
}
@ -216,6 +230,10 @@ int CCrowbar::Swing( int fFirst ) @@ -216,6 +230,10 @@ int CCrowbar::Swing( int fFirst )
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
#ifndef CLIENT_DLL
int tempDamage = gSkillData.plrDmgCrowbar;
if( m_pPlayer->m_RuneFlags == RUNE_CROWBAR )
tempDamage = 300;
// hit
fDidHit = TRUE;
CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit );
@ -225,12 +243,12 @@ int CCrowbar::Swing( int fFirst ) @@ -225,12 +243,12 @@ int CCrowbar::Swing( int fFirst )
if( ( m_flNextPrimaryAttack + 1 < UTIL_WeaponTimeBase() ) || g_pGameRules->IsMultiplayer() )
{
// first swing does full damage
pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgCrowbar, gpGlobals->v_forward, &tr, DMG_CLUB );
pEntity->TraceAttack( m_pPlayer->pev, tempDamage, gpGlobals->v_forward, &tr, DMG_CLUB );
}
else
{
// subsequent swings do half
pEntity->TraceAttack( m_pPlayer->pev, gSkillData.plrDmgCrowbar / 2, gpGlobals->v_forward, &tr, DMG_CLUB );
pEntity->TraceAttack( m_pPlayer->pev, tempDamage / 2, gpGlobals->v_forward, &tr, DMG_CLUB );
}
ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev );
@ -304,3 +322,77 @@ int CCrowbar::Swing( int fFirst ) @@ -304,3 +322,77 @@ int CCrowbar::Swing( int fFirst )
}
return fDidHit;
}
// BMOD Begin - Flying Crowbar
void CCrowbar::SecondaryAttack()
{
if( !bm_cbar_mod.value )
{
return;
}
// Don't throw underwater, and only throw if we were able to detatch
// from player.
if( ( m_pPlayer->pev->waterlevel != 3 ) )//&&
//( m_pPlayer->RemovePlayerItem( this ) ) )
{
// Get the origin, direction, and fix the angle of the throw.
Vector vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_right * 8 + gpGlobals->v_forward * 16;
Vector vecDir = gpGlobals->v_forward;
Vector vecAng = UTIL_VecToAngles( vecDir );
vecAng.z = vecDir.z - 90;
// Create a flying crowbar.
CFlyingCrowbar *pFCBar = (CFlyingCrowbar *)Create( "flying_crowbar", vecSrc, Vector( 0, 0, 0 ), m_pPlayer->edict() );
// Give the crowbar its velocity, angle, and spin.
// Lower the gravity a bit, so it flys.
pFCBar->pev->velocity = vecDir * 500 + m_pPlayer->pev->velocity;
pFCBar->pev->angles = vecAng;
pFCBar->pev->avelocity.x = -1000;
pFCBar->pev->gravity = .5;
pFCBar->m_pPlayer = m_pPlayer;
// Do player weapon anim and sound effect.
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM, 0, 94 + RANDOM_LONG( 0, 0xF ) );
// Control the speed of the next crowbar toss if
// this is a rune.
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + .5;
// Crowbar Rune?
if( m_pPlayer->m_RuneFlags != RUNE_CROWBAR )
{
// Nope! take away the crowbar
m_pPlayer->RemovePlayerItem( this );
// take item off hud
m_pPlayer->pev->weapons &= ~( 1 << this->m_iId );
// Destroy this weapon
DestroyItem();
// They no longer have an active item.
m_pPlayer->m_pActiveItem = NULL;
}
else
{
// We have RUNE! Make a swing animation
switch( ( ( m_iSwing++ ) % 2 ) + 1 )
{
case 0:
SendWeaponAnim( CROWBAR_ATTACK1HIT );
break;
case 1:
SendWeaponAnim( CROWBAR_ATTACK1HIT );
break;
case 2:
SendWeaponAnim( CROWBAR_DRAW );
break;
}
}
}
}
// BMOD End - Flying Crowbar

5
dlls/doors.cpp

@ -750,6 +750,11 @@ void CBaseDoor::Blocked( CBaseEntity *pOther ) @@ -750,6 +750,11 @@ void CBaseDoor::Blocked( CBaseEntity *pOther )
// so let it just squash the object to death real fast
if( m_flWait >= 0 )
{
// BMod Start - Door sound fix.
if( !FBitSet( pev->spawnflags, SF_DOOR_SILENT ) )
STOP_SOUND( ENT( pev ), CHAN_STATIC, (char*)STRING( pev->noiseMoving ) );
// BMod End
if( m_toggle_state == TS_GOING_DOWN )
{
DoorGoUp();

19
dlls/egon.cpp

@ -24,6 +24,7 @@ @@ -24,6 +24,7 @@
#include "effects.h"
#include "customentity.h"
#include "gamerules.h"
#include "egon.h"
#define EGON_PRIMARY_VOLUME 450
#define EGON_BEAM_SPRITE "sprites/xbeam1.spr"
@ -75,6 +76,10 @@ void CEgon::Precache( void ) @@ -75,6 +76,10 @@ void CEgon::Precache( void )
PRECACHE_SOUND( EGON_SOUND_RUN );
PRECACHE_SOUND( EGON_SOUND_STARTUP );
PRECACHE_SOUND( BUBBLE_SOUND_OFF );
PRECACHE_SOUND( BUBBLE_SOUND_RUN );
PRECACHE_SOUND( BUBBLE_SOUND_STARTUP );
PRECACHE_MODEL( EGON_BEAM_SPRITE );
PRECACHE_MODEL( EGON_FLARE_SPRITE );
@ -232,8 +237,18 @@ void CEgon::Attack( void ) @@ -232,8 +237,18 @@ void CEgon::Attack( void )
void CEgon::PrimaryAttack( void )
{
m_fireMode = FIRE_WIDE;
Attack();
// BMOD Begin - bubblegun
if( bm_gluon_mod.value )
{
FireBubbles();
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + .05;
}
else
{
m_fireMode = FIRE_WIDE;
Attack();
}
// BMOD End - bubblegun
}
void CEgon::Fire( const Vector &vecOrigSrc, const Vector &vecDir )

4
dlls/func_tank.cpp

@ -427,6 +427,10 @@ void CFuncTank::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use @@ -427,6 +427,10 @@ void CFuncTank::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
else if( !m_pController && useType != USE_OFF )
{
( (CBasePlayer*)pActivator )->m_pTank = this;
// BMOD
( (CBasePlayer*)pActivator )->BMOD_ResetSpawnKill();
StartControl( (CBasePlayer*)pActivator );
}
else

783
dlls/game.cpp

@ -16,6 +16,10 @@ @@ -16,6 +16,10 @@
#include "eiface.h"
#include "util.h"
#include "game.h"
#include "cbase.h"
#include "player.h"
#include "weapons.h"
#include "BMOD_boxmarker.h"
cvar_t displaysoundlist = {"displaysoundlist","0"};
@ -441,6 +445,102 @@ cvar_t sk_player_leg3 = { "sk_player_leg3","1" }; @@ -441,6 +445,102 @@ cvar_t sk_player_leg3 = { "sk_player_leg3","1" };
// END Cvars for Skill Level settings
// BMOD Begin - CVARs
cvar_t bm_ver = { "bm_ver", "", FCVAR_SERVER | FCVAR_UNLOGGED };
cvar_t bm_url = { "bm_url", "", FCVAR_SERVER | FCVAR_UNLOGGED };
cvar_t bm_bver = { "bm_bver", "", FCVAR_SERVER | FCVAR_UNLOGGED };
cvar_t bm_bname = { "bm_bname", "", FCVAR_SERVER | FCVAR_UNLOGGED };
cvar_t bm_burl = { "bm_burl", "", FCVAR_SERVER | FCVAR_UNLOGGED };
cvar_t bm_guns = { "bm_guns", "crowbar;357;9mmhandgun" };
cvar_t bm_ammo = { "bm_ammo", "9mmclip;9mmclip;357;357" };
cvar_t bm_g = { "bm_g", "7", FCVAR_SERVER | FCVAR_UNLOGGED };
cvar_t bm_dmg_messages = { "bm_dmg_messages", "1" };
cvar_t bm_matchkills = { "bm_matchkills", "1" };
cvar_t bm_freezetime = { "bm_freezetime", "4.5", FCVAR_SERVER };
cvar_t bm_thrust = { "bm_thrust", "0" };
cvar_t bm_spawneffects = { "bm_spawneffects", "1" };
//cvar_t bm_snarktrails = { "bm_snarktrails", "1" };
cvar_t bm_snarktrails = { "bm_snarktrails", "0AE00AC8" };
cvar_t bm_xbowtracers = { "bm_xbowtracers", "1" };
cvar_t bm_spawnkilltime = { "bm_spawnkilltime", "10", FCVAR_SERVER };
cvar_t bm_maxspawnkills = { "bm_maxspawnkills", "3" };
cvar_t bm_typekills = { "bm_typekills", "0", FCVAR_SERVER };
cvar_t bm_maxtypekills = { "bm_maxtypekills", "3" };
cvar_t bm_typecam = { "bm_typecam", "1" };
cvar_t bm_bantime = { "bm_bantime", "30" };
cvar_t bm_spamlimit = { "bm_spamlimit", "4" };
cvar_t bm_antispam = { "bm_antispam", "1" };
cvar_t bm_spawnmines = { "bm_spawnmines", "0", FCVAR_SERVER };
cvar_t bm_spawnsatchels = { "bm_spawnsatchels", "0", FCVAR_SERVER };
cvar_t bm_voting = { "bm_voting", "1", FCVAR_SERVER };
cvar_t bm_votetime = { "bm_votetime", "180", FCVAR_SERVER };
cvar_t bm_maxtime = { "bm_maxtime", "120" };
cvar_t bm_maxfrags = { "bm_maxfrags", "100" };
cvar_t bm_mods = { "bm_mods", "", FCVAR_SERVER };
cvar_t bm_rpg_mod = { "bm_rpg_mod", "1" };
cvar_t bm_shotty_mod = { "bm_shotty_mod", "0" };
cvar_t bm_xbow_mod = { "bm_xbow_mod", "1" };
cvar_t bm_mp5_mod = { "bm_mp5_mod", "1" };
cvar_t bm_cbar_mod = { "bm_cbar_mod", "1" };
cvar_t bm_tau_mod = { "bm_tau_mod", "1" };
cvar_t bm_snarks_mod = { "bm_snarks_mod", "1" };
cvar_t bm_gluon_mod = { "bm_gluon_mod", "1" };
cvar_t bm_hornet_mod = { "bm_hornet_mod", "1" };
cvar_t bm_trip_mod = { "bm_trip_mod", "1" };
/*
cvar_t bm_score_crowbar = { "bm_score_crowbar", "1" };
cvar_t bm_score_throwncbar = { "bm_score_throwncbar", "1" };
cvar_t bm_score_9mm = { "bm_score_9mm", "1" };
cvar_t bm_score_357 = { "bm_score_357", "1" };
cvar_t bm_score_mp5 = { "bm_score_mp5", "1" };
cvar_t bm_score_shotgun = { "bm_score_shotgun", "1" };
cvar_t bm_score_squidspit = { "bm_score_squidspit", "1" };
cvar_t bm_score_zapgun = { "bm_score_zapgun", "1" };
cvar_t bm_score_mp5grenade = { "bm_score_mp5grenade", "1" };
cvar_t bm_score_gluon = { "bm_score_gluon", "1" };
cvar_t bm_score_tau = { "bm_score_tau", "1" };
cvar_t bm_score_bolt = { "bm_score_bolt", "1" };
cvar_t bm_score_crossbow = { "bm_score_crossbow", "1" };
cvar_t bm_score_satchel = { "bm_score_satchel", "1" };
cvar_t bm_score_handgrenade = { "bm_score_handgrenade", "1" };
cvar_t bm_score_rpg = { "bm_score_rpg", "1" };
cvar_t bm_score_snarks = { "bm_score_snarks", "1" };
cvar_t bm_score_tripmine = { "bm_score_tripmine", "1" };
*/
cvar_t bm_map = { "bm_map", "" };
cvar_t bm_nextmap = { "bm_nextmap", "", FCVAR_SERVER | FCVAR_UNLOGGED };
cvar_t bm_rune_rand = { "bm_rune_rand", "0", FCVAR_SERVER };
cvar_t bm_runemask = { "bm_runemask", "63", FCVAR_SERVER };
cvar_t bm_rune_cbar = { "bm_rune_cbar", "1", FCVAR_SERVER };
cvar_t bm_rune_cbar_t = { "bm_rune_cbar_t", "30" };
cvar_t bm_rune_cbar_r = { "bm_rune_cbar_r", "60" };
cvar_t bm_rune_gren = { "bm_rune_gren", "1", FCVAR_SERVER };
cvar_t bm_rune_gren_t = { "bm_rune_gren_t", "30" };
cvar_t bm_rune_gren_r = { "bm_rune_gren_r", "120" };
cvar_t bm_rune_357 = { "bm_rune_357", "1", FCVAR_SERVER };
cvar_t bm_rune_357_t = { "bm_rune_357_t", "30" };
cvar_t bm_rune_357_r = { "bm_rune_357_r", "60" };
cvar_t bm_rune_health = { "bm_rune_health", "1", FCVAR_SERVER };
cvar_t bm_rune_health_t = { "bm_rune_health_t", "30" };
cvar_t bm_rune_health_r = { "bm_rune_health_r", "60" };
cvar_t bm_rune_armor = { "bm_rune_armor", "1", FCVAR_SERVER };
cvar_t bm_rune_armor_t = { "bm_rune_armor_t", "30" };
cvar_t bm_rune_armor_r = { "bm_rune_armor_r", "60" };
cvar_t bm_rune_shotty = { "bm_rune_shotty", "1", FCVAR_SERVER };
cvar_t bm_rune_shotty_t = { "bm_rune_shotty_t", "30" };
cvar_t bm_rune_shotty_r = { "bm_rune_shotty_r", "180" };
// BMOD End - CVARs
// Register your console variables here
// This gets called one time when the game is initialied
void GameDLLInit( void )
@ -849,6 +949,689 @@ void GameDLLInit( void ) @@ -849,6 +949,689 @@ void GameDLLInit( void )
CVAR_REGISTER( &sk_player_leg3 );
// END REGISTER CVARS FOR SKILL LEVEL STUFF
// BMOD Begin - CVARs
CVAR_REGISTER( &bm_bver );
CVAR_REGISTER( &bm_bname );
CVAR_REGISTER( &bm_burl );
CVAR_REGISTER( &bm_ver );
CVAR_REGISTER( &bm_url );
//CVAR_REGISTER( &bm_plat );
CVAR_REGISTER( &bm_guns );
CVAR_REGISTER( &bm_ammo );
CVAR_REGISTER( &bm_g );
CVAR_REGISTER( &bm_dmg_messages );
CVAR_REGISTER( &bm_matchkills );
//CVAR_REGISTER( &bm_trips );
CVAR_REGISTER( &bm_freezetime );
CVAR_REGISTER( &bm_thrust );
CVAR_REGISTER( &bm_spawneffects );
CVAR_REGISTER( &bm_snarktrails );
CVAR_REGISTER( &bm_xbowtracers );
CVAR_REGISTER( &bm_spawnkilltime );
CVAR_REGISTER( &bm_maxspawnkills );
CVAR_REGISTER( &bm_typekills );
CVAR_REGISTER( &bm_maxtypekills );
CVAR_REGISTER( &bm_typecam );
CVAR_REGISTER( &bm_bantime );
CVAR_REGISTER( &bm_spamlimit );
CVAR_REGISTER( &bm_antispam );
CVAR_REGISTER( &bm_spawnmines );
CVAR_REGISTER( &bm_spawnsatchels );
CVAR_REGISTER( &bm_voting );
CVAR_REGISTER( &bm_votetime );
CVAR_REGISTER( &bm_maxtime );
CVAR_REGISTER( &bm_maxfrags );
//CVAR_REGISTER( &bm_cbmad );
//CVAR_REGISTER( &bm_cheatdetect );
/* CVAR_REGISTER( &bm_score_crowbar );
CVAR_REGISTER( &bm_score_throwncbar );
CVAR_REGISTER( &bm_score_9mm );
CVAR_REGISTER( &bm_score_357 );
CVAR_REGISTER( &bm_score_mp5 );
CVAR_REGISTER( &bm_score_shotgun );
CVAR_REGISTER( &bm_score_squidspit );
CVAR_REGISTER( &bm_score_zapgun );
CVAR_REGISTER( &bm_score_mp5grenade );
CVAR_REGISTER( &bm_score_gluon );
CVAR_REGISTER( &bm_score_tau );
CVAR_REGISTER( &bm_score_bolt );
CVAR_REGISTER( &bm_score_crossbow );
CVAR_REGISTER( &bm_score_satchel );
CVAR_REGISTER( &bm_score_handgrenade );
CVAR_REGISTER( &bm_score_rpg );
CVAR_REGISTER( &bm_score_snarks );
CVAR_REGISTER( &bm_score_tripmine );
*/
CVAR_REGISTER( &bm_mods );
CVAR_REGISTER( &bm_rpg_mod );
CVAR_REGISTER( &bm_shotty_mod );
CVAR_REGISTER( &bm_xbow_mod );
CVAR_REGISTER( &bm_mp5_mod );
CVAR_REGISTER( &bm_cbar_mod );
CVAR_REGISTER( &bm_tau_mod );
CVAR_REGISTER( &bm_snarks_mod );
CVAR_REGISTER( &bm_gluon_mod );
CVAR_REGISTER( &bm_hornet_mod );
CVAR_REGISTER( &bm_trip_mod );
CVAR_REGISTER( &bm_map );
CVAR_REGISTER( &bm_nextmap );
CVAR_REGISTER( &bm_rune_rand );
CVAR_REGISTER( &bm_runemask );
CVAR_REGISTER( &bm_rune_cbar );
CVAR_REGISTER( &bm_rune_cbar_t );
CVAR_REGISTER( &bm_rune_cbar_r );
CVAR_REGISTER( &bm_rune_gren );
CVAR_REGISTER( &bm_rune_gren_t );
CVAR_REGISTER( &bm_rune_gren_r );
CVAR_REGISTER( &bm_rune_357 );
CVAR_REGISTER( &bm_rune_357_t );
CVAR_REGISTER( &bm_rune_357_r );
CVAR_REGISTER( &bm_rune_health );
CVAR_REGISTER( &bm_rune_health_t );
CVAR_REGISTER( &bm_rune_health_r );
CVAR_REGISTER( &bm_rune_armor );
CVAR_REGISTER( &bm_rune_armor_t );
CVAR_REGISTER( &bm_rune_armor_r );
CVAR_REGISTER( &bm_rune_shotty );
CVAR_REGISTER( &bm_rune_shotty_t );
CVAR_REGISTER( &bm_rune_shotty_r );
// BMOD End - CVARs
// BMOD Begin - Server commands
ADD_SERVER_COMMAND( "s", BModCmd_AdminSay );
ADD_SERVER_COMMAND( "w", BModCmd_AdminWhisper );
ADD_SERVER_COMMAND( "markspawnpoints", BModCmd_ShowSpawns );
ADD_SERVER_COMMAND( "sspeak", BModCmd_SpeakAll );
ADD_SERVER_COMMAND( "create", BModCmd_Create );
ADD_SERVER_COMMAND( "remove", BModCmd_Remove );
ADD_SERVER_COMMAND( "delete", BModCmd_Delete );
ADD_SERVER_COMMAND( "replace", BModCmd_Replace );
ADD_SERVER_COMMAND( "info", BModCmd_Info );
ADD_SERVER_COMMAND( "llama", BModCmd_Llama );
ADD_SERVER_COMMAND( "unllama", BModCmd_Unllama );
// BMOD End - Server commands
SERVER_COMMAND( "exec skill.cfg\n" );
}
// ++BMod
// New bubble mod commands
//
// CMD_ARGC () - number of arguments
// CMD_ARGV(n) - nth argument. 0=actual command.
// CMD_ARGS () -
// Helper function for finding a player pointer by UID.
CBasePlayer* GetPlayerByUID( int userId )
{
CBasePlayer *client = NULL;
while( ( ( client = (CBasePlayer*)UTIL_FindEntityByClassname( client, "player" ) ) != NULL )
&& ( client->IsPlayer() ) )
{
if( userId == GETPLAYERUSERID( client->edict() ) )
return client;
}
return 0;
}
// Admin Say
void BModCmd_AdminSay( void )
{
int j;
char *p;
char text[128];
const char *cpSay = "say";
const char *cpSayTeam = "say_team";
const char *pcmd = CMD_ARGV(0);
// We can get a raw string now, without the "say " prepended
if( CMD_ARGC() < 2 )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: s \"<string>\"\n" );
return;
}
p = (char *)CMD_ARGS();
// make sure the text has content
for( char *pc = p; pc != NULL && *pc != 0; pc++ )
{
if( isprint( *pc ) && !isspace( *pc ) )
{
pc = NULL; // we've found an alphanumeric character, so text is valid
break;
}
}
if( pc != NULL )
return; // no character found, so say nothing
sprintf( text, "%c%s ", 2, "<ADMIN>" );
j = sizeof(text) - 2 - strlen( text ); // -2 for /n and null terminator
if( (int)strlen( p ) > j )
p[j] = 0;
strcat( text, p );
strcat( text, "\n" );
UTIL_ClientPrintAll( HUD_PRINTTALK, text );
// echo to server console
g_engfuncs.pfnServerPrint( text );
UTIL_LogPrintf( "\"ADMIN<-1><-1><>\" say \"%s\"\n", p );
}
// Admin Whisper
void BModCmd_AdminWhisper( void )
{
int j;
char *p;
char text[128];
const char *cpSay = "say";
const char *cpSayTeam = "say_team";
const char *pcmd = CMD_ARGV( 0 );
// We can get a raw string now, without the "say " prepended
if( CMD_ARGC() < 3 )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: w <PlayerUID> \"<string>\"\n" );
return;
}
int UID = atoi( CMD_ARGV( 1 ) );
CBasePlayer *Player = GetPlayerByUID( UID );
if( Player == NULL )
{
g_engfuncs.pfnServerPrint( "Invalid Player UID.\n" );
return;
}
p = (char *)CMD_ARGS();
// Skip over the UID
while( *p != ' ')
p++;
while( *p == ' ')
p++;
// make sure the text has content
for( char *pc = p; pc != NULL && *pc != 0; pc++ )
{
if( isprint( *pc ) && !isspace( *pc ) )
{
pc = NULL; // we've found an alphanumeric character, so text is valid
break;
}
}
if( pc != NULL )
return; // no character found, so say nothing
sprintf( text, "%c%s ", 2, "<ADMIN>(whispers)" );
j = sizeof(text) - 2 - strlen( text ); // -2 for /n and null terminator
if( (int)strlen( p ) > j )
p[j] = 0;
strcat( text, p );
strcat( text, "\n" );
ClientPrint( Player->pev, HUD_PRINTTALK, text );
// echo to server console
g_engfuncs.pfnServerPrint( text );
UTIL_LogPrintf( "\"ADMIN<-1><-1><>\" say \"(to %s) %s\"\n", STRING( Player->pev->netname ), p );
}
// Show Spawn Points
void BModCmd_ShowSpawns( void )
{
BOOL marked = UTIL_FindEntityByClassname( NULL, "boxmarker" ) ? TRUE : FALSE;
if( marked )
{
g_engfuncs.pfnServerPrint( "Spawn points already marked!\n" );
return;
}
marked = TRUE;
CBaseEntity *pSpot = NULL;
CBaseEntity *pEnt = NULL;
CBoxMarker *pBox = NULL;
TraceResult tr;
while( ( ( pSpot = UTIL_FindEntityByClassname( pSpot, "info_player_deathmatch" ) ) != NULL ) )
{
UTIL_TraceLine( pSpot->pev->origin, pSpot->pev->origin - Vector( 0, 0, 1024 ), ignore_monsters, pSpot->edict(), &tr );
Vector vecTop = pSpot->pev->origin + Vector( 0, 0, 36 );
float height = fabs( vecTop.z - tr.vecEndPos.z ) / 2;
pEnt = CBaseEntity::Create( "boxmarker", Vector( vecTop.x, vecTop.y, ( vecTop.z + tr.vecEndPos.z ) / 2), g_vecZero, NULL );
// CBaseEntity *pEnt2 = CBaseEntity::Create( "zaprift", Vector( vecTop.x, vecTop.y, ( vecTop.z + tr.vecEndPos.z ) / 2 ), g_vecZero, NULL );
pBox = (CBoxMarker *)pEnt;
pBox->m_vecExtents = Vector(16,16,height);
}
}
// Speak to all players using vox.
void BModCmd_SpeakAll( void )
{
int j;
char *p;
char text[128];
if( CMD_ARGC() < 2 )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: sspeak \"<vox string>\"\n" );
return;
}
p = (char *)CMD_ARGS();
// remove quotes if present
if( *p == '"' )
{
p++;
p[strlen( p ) - 1] = 0;
}
// make sure the text has content
for( char *pc = p; pc != NULL && *pc != 0; pc++ )
{
if( isprint( *pc ) && !isspace( *pc ) )
{
pc = NULL; // we've found an alphanumeric character, so text is valid
break;
}
}
if( pc != NULL )
return; // no character found, so say nothing
strcpy( text, "");
j = sizeof( text ) - 2 - strlen( text ); // -2 for /n and null terminator
if( (int)strlen( p ) > j )
p[j] = 0;
strcat( text, p );
//strcat( text, "\n" );
UTIL_SpeakAll( text );
}
// create entity x y z ay
void BModCmd_Create( void )
{
if( ( CMD_ARGC() < 6 ) )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: create <entity> <xpos> <ypos> <zpos> <y angle>\n" );
return;
}
char *entity = (char *)CMD_ARGV( 1 );
Vector position = Vector( atoi( CMD_ARGV( 2 ) ), atoi( CMD_ARGV( 3 ) ), atoi( CMD_ARGV( 4 ) ) );
Vector angle = Vector( 0, atoi( CMD_ARGV( 5 ) ), 0 );
if( angle.y < 0 )
{
angle.y = RANDOM_LONG( 0, 360 );
}
// Fix weapon names
if( !strcmp( entity, "weapon_9mmhandgun" ) )
{
strcpy( entity, "weapon_glock" );
}
else if( !strcmp( entity, "weapon_9mmAR" ) )
{
strcpy( entity, "weapon_mp5" );
}
else if( !strcmp( entity, "weapon_python" ) )
{
strcpy( entity, "weapon_357" );
}
// Fix ammo names
if( !strcmp( entity, "ammo_9mmclip" ) )
{
strcpy( entity, "ammo_glockclip" );
}
else if( !strcmp( entity, "ammo_9mmAR" ) )
{
strcpy( entity, "ammo_mp5clip" );
}
else if( !strcmp( entity, "ammo_ARgrenades" ) )
{
strcpy( entity, "ammo_mp5grenades" );
}
if( !strncmp( entity, "weapon_", 7 ) ||
!strcmp( entity, "item_healthkit" ) ||
!strcmp( entity, "item_battery" ) ||
!strcmp( entity, "item_longjump" ) ||
!strncmp( entity, "ammo_", 5 ) ||
!strcmp( entity, "info_player_deathmatch" ) )
{
CBaseEntity *ent = CBaseEntity::Create(entity, position, angle, NULL );
if( !strcmp( entity, "info_player_deathmatch" ) )
ent->pev->classname = MAKE_STRING( "info_player_deathmatch" );
}
else
{
g_engfuncs.pfnServerPrint( "You only add items, ammo, weapons, or spawn points with this command.\n" );
}
}
// remove entity
void BModCmd_Remove( void )
{
if( ( CMD_ARGC() < 2 ) )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: remove <entity name>\n" );
return;
}
char *entity = (char *)CMD_ARGV( 1 );
CBaseEntity *target = NULL;
// Fix weapon names
if( !strcmp(entity, "weapon_glock" ) )
{
strcpy(entity, "weapon_9mmhandgun" );
}
else if( !strcmp( entity, "weapon_mp5" ) )
{
strcpy( entity, "weapon_9mmAR" );
}
else if( !strcmp( entity, "weapon_python" ) )
{
strcpy( entity, "weapon_357" );
}
// Fix ammo names
if( !strcmp( entity, "ammo_9mmclip" ) )
{
strcpy( entity, "ammo_glockclip" );
}
else if( !strcmp( entity, "ammo_9mmAR") )
{
strcpy( entity, "ammo_mp5clip");
}
else if( !strcmp( entity, "ammo_ARgrenades") )
{
strcpy( entity, "ammo_mp5grenades");
}
if( !strncmp( entity, "weapon_", 7 ) ||
!strcmp( entity, "item_healthkit" ) ||
!strcmp( entity, "item_battery" ) ||
!strcmp( entity, "item_longjump" ) ||
!strncmp( entity, "ammo_", 5 ) )
{
while( ( target = UTIL_FindEntityInSphere( target, Vector( 0, 0, 0 ), 4096 ) ) != NULL )
{
if( !strcmp( STRING( target->pev->classname ), entity ) && ( target->pev->owner == NULL ) )
{
target->Killed( NULL, 0 );
}
}
}
else
{
g_engfuncs.pfnServerPrint( "You only remove items, ammo, or weapons with this command.\n" );
}
}
// delete a single entity
void BModCmd_Delete( void )
{
if( ( CMD_ARGC() < 5 ) )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: delete <entity name> <xpos> <ypos> <zpos>\n" );
return;
}
char *entity = (char *)CMD_ARGV( 1 );
Vector position = Vector( atoi( CMD_ARGV( 2 ) ), atoi( CMD_ARGV( 3 ) ), atoi( CMD_ARGV( 4 ) ) );
CBaseEntity *target = NULL;
// Fix weapon names
if( !strcmp( entity, "weapon_glock" ) )
{
strcpy( entity, "weapon_9mmhandgun" );
}
else if( !strcmp( entity, "weapon_mp5" ) )
{
strcpy( entity, "weapon_9mmAR" );
}
else if( !strcmp( entity, "weapon_python" ) )
{
strcpy( entity, "weapon_357" );
}
// Fix ammo names
if( !strcmp( entity, "ammo_9mmclip" ) )
{
strcpy( entity, "ammo_glockclip" );
}
else if( !strcmp( entity, "ammo_9mmAR" ) )
{
strcpy( entity, "ammo_mp5clip" );
}
else if( !strcmp( entity, "ammo_ARgrenades" ) )
{
strcpy( entity, "ammo_mp5grenades" );
}
if( !strncmp( entity, "weapon_", 7 ) ||
!strcmp( entity, "item_healthkit" ) ||
!strcmp( entity, "item_battery" ) ||
!strcmp( entity, "item_longjump" ) ||
!strncmp( entity, "ammo_", 5 ) ||
!strcmp( entity, "info_player_deathmatch" ) )
{
bool deleted = FALSE;
while( !deleted && ( target = UTIL_FindEntityInSphere( target, position, 64 ) ) != NULL )
{
if( !strcmp( STRING( target->pev->classname ), entity ) && ( target->pev->owner == NULL ) )
{
target->Killed( NULL, 0 );
deleted = TRUE;
g_engfuncs.pfnServerPrint( "Entity deleted.\n" );
}
}
if( !deleted )
{
g_engfuncs.pfnServerPrint( "Entity not found.\n" );
}
}
else
{
g_engfuncs.pfnServerPrint( "You only delete items, ammo, weapons, or spawn points with this command.\n" );
}
}
// replace entity
void BModCmd_Replace( void )
{
if( ( CMD_ARGC() < 3 ) )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: replace <entity> <with entity>\n" );
return;
}
char *entity = (char *)CMD_ARGV( 1 );
char *entity2 = (char *)CMD_ARGV( 2 );
CBaseEntity *target = NULL;
// Fix weapon names
if( !strcmp( entity, "weapon_glock" ) )
{
strcpy( entity, "weapon_9mmhandgun" );
}
else if( !strcmp( entity, "weapon_mp5" ) )
{
strcpy( entity, "weapon_9mmAR" );
}
else if( !strcmp( entity, "weapon_python" ) )
{
strcpy( entity, "weapon_357" );
}
if( !strcmp( entity2, "weapon_9mmhandgun" ) )
{
strcpy( entity2, "weapon_glock" );
}
else if( !strcmp( entity2, "weapon_9mmAR" ) )
{
strcpy( entity2, "weapon_mp5" );
}
else if( !strcmp( entity2, "weapon_python" ) )
{
strcpy( entity2, "weapon_357" );
}
// Fix ammo names
if( !strcmp( entity, "ammo_9mmclip" ) )
{
strcpy( entity, "ammo_glockclip" );
}
else if( !strcmp( entity, "ammo_9mmAR") )
{
strcpy( entity, "ammo_mp5clip");
}
else if( !strcmp( entity, "ammo_ARgrenades") )
{
strcpy( entity, "ammo_mp5grenades" );
}
if( !strcmp( entity2, "ammo_9mmclip") )
{
strcpy( entity2, "ammo_glockclip" );
}
else if( !strcmp( entity2, "ammo_9mmAR" ) )
{
strcpy( entity2, "ammo_mp5clip" );
}
else if( !strcmp( entity2, "ammo_ARgrenades" ) )
{
strcpy( entity2, "ammo_mp5grenades" );
}
if( ( !strncmp( entity, "weapon_", 7 ) ||
!strcmp( entity, "item_healthkit" ) ||
!strcmp( entity, "item_battery" ) ||
!strcmp( entity, "item_longjump" ) ||
!strncmp( entity, "ammo_", 5 ) ) &&
( !strncmp( entity2, "weapon_", 7 ) ||
!strcmp( entity2, "item_healthkit" ) ||
!strcmp( entity2, "item_battery" ) ||
!strcmp( entity2, "item_longjump" ) ||
!strncmp( entity2, "ammo_", 5 ) ) )
{
while( ( target = UTIL_FindEntityInSphere( target, Vector( 0, 0, 0 ), 4096 ) ) != NULL )
{
if( !strcmp( STRING( target->pev->classname ), entity ) && ( target->pev->owner == NULL ) )
{
CBaseEntity::Create(entity2, target->pev->origin, target->pev->angles, NULL );
target->Killed(NULL, 0);
}
}
}
else
{
g_engfuncs.pfnServerPrint( "You only replace items, ammo, or weapons with this command.\n" );
}
}
// info on a player
void BModCmd_Info( void )
{
if( CMD_ARGC() < 2 )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: info <PlayerUID>\n" );
return;
}
int UID = atoi( CMD_ARGV( 1 ) );
CBasePlayer *Player = GetPlayerByUID( UID );
if( Player == NULL )
{
g_engfuncs.pfnServerPrint( "Invalid Player UID.\n" );
return;
}
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "Player: %s\n",STRING( Player->pev->netname ) ) );
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "Health/Armor: %d/%d\n",(int)Player->pev->health, (int)Player->pev->armorvalue ) );
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "Spawn Kills: %d\n",Player->m_iSpawnKills ) );
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "Type Kills: %d\n",Player->m_iTypeKills ) );
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "Leet: %d\n",Player->m_LeetSpeak ) );
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "Locate: %d\n",Player->m_LocateMode ) );
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "Llama: %d\n",Player->m_IsLlama ) );
g_engfuncs.pfnServerPrint( "\n" );
}
// Llamafy a player
void BModCmd_Llama( void )
{
if( CMD_ARGC() < 2 )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: llama <PlayerUID>\n" );
return;
}
int UID = atoi( CMD_ARGV( 1 ) );
CBasePlayer *Player = GetPlayerByUID( UID );
if( Player == NULL )
{
g_engfuncs.pfnServerPrint( "Invalid Player UID.\n" );
return;
}
Player->m_IsLlama = TRUE;
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %s is now a llama! Bleeet!\n", STRING( Player->pev->netname ) ) );
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "%s is now a llama! Bleeet!\n", STRING( Player->pev->netname ) ) );
}
// Unllamafy a player
void BModCmd_Unllama( void )
{
if( CMD_ARGC() < 2 )
{
g_engfuncs.pfnServerPrint( "Not enough arguments.\nUSAGE: unllama <PlayerUID>\n" );
return;
}
int UID = atoi( CMD_ARGV( 1 ) );
CBasePlayer *Player = GetPlayerByUID( UID );
if( Player == NULL )
{
g_engfuncs.pfnServerPrint( "Invalid Player UID.\n" );
return;
}
Player->m_IsLlama = FALSE;
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %s is unllamafied.\n", STRING( Player->pev->netname ) ) );
g_engfuncs.pfnServerPrint( UTIL_VarArgs( "%s is unllamafied.\n", STRING( Player->pev->netname ) ) );
}

109
dlls/game.h

@ -41,3 +41,112 @@ extern cvar_t *g_psv_gravity; @@ -41,3 +41,112 @@ extern cvar_t *g_psv_gravity;
extern cvar_t *g_psv_aim;
extern cvar_t *g_footsteps;
#endif // GAME_H
// BMOD Begin - CVARs
extern cvar_t bm_ver;
extern cvar_t bm_url;
extern cvar_t bm_bver;
extern cvar_t bm_bname;
extern cvar_t bm_burl;
//extern cvar_t bm_plat;
//extern cvar_t bm_trips;
extern cvar_t bm_guns;
extern cvar_t bm_ammo;
extern cvar_t bm_g;
extern cvar_t bm_dmg_messages;
extern cvar_t bm_matchkills;
extern cvar_t bm_freezetime;
extern cvar_t bm_thrust;
extern cvar_t bm_spawneffects;
extern cvar_t bm_snarktrails;
extern cvar_t bm_xbowtracers;
extern cvar_t bm_spawnkilltime;
extern cvar_t bm_maxspawnkills;
extern cvar_t bm_typekills;
extern cvar_t bm_maxtypekills;
extern cvar_t bm_typecam;
extern cvar_t bm_bantime;
extern cvar_t bm_antispam;
extern cvar_t bm_spamlimit;
extern cvar_t bm_spawnmines;
extern cvar_t bm_spawnsatchels;
extern cvar_t bm_voting;
extern cvar_t bm_votetime;
extern cvar_t bm_maxtime;
extern cvar_t bm_maxfrags;
// extern cvar_t bm_cbmad;
// extern cvar_t bm_cheatdetect;
extern cvar_t bm_mods;
extern cvar_t bm_cbar_mod;
extern cvar_t bm_mp5_mod;
extern cvar_t bm_shotty_mod;
extern cvar_t bm_xbow_mod;
extern cvar_t bm_rpg_mod;
extern cvar_t bm_tau_mod;
extern cvar_t bm_gluon_mod;
extern cvar_t bm_hornet_mod;
extern cvar_t bm_trip_mod;
extern cvar_t bm_snarks_mod;
/*
extern cvar_t bm_score_crowbar;
extern cvar_t bm_score_throwncbar;
extern cvar_t bm_score_9mm;
extern cvar_t bm_score_357;
extern cvar_t bm_score_mp5;
extern cvar_t bm_score_shotgun;
extern cvar_t bm_score_squidspit;
extern cvar_t bm_score_zapgun;
extern cvar_t bm_score_mp5grenade;
extern cvar_t bm_score_gluon;
extern cvar_t bm_score_tau;
extern cvar_t bm_score_bolt;
extern cvar_t bm_score_crossbow;
extern cvar_t bm_score_satchel;
extern cvar_t bm_score_handgrenade;
extern cvar_t bm_score_rpg;
extern cvar_t bm_score_snarks;
extern cvar_t bm_score_tripmine;
*/
extern cvar_t bm_map;
extern cvar_t bm_nextmap;
extern cvar_t bm_rune_rand;
extern cvar_t bm_runemask;
extern cvar_t bm_rune_cbar;
extern cvar_t bm_rune_cbar_t;
extern cvar_t bm_rune_cbar_r;
extern cvar_t bm_rune_gren;
extern cvar_t bm_rune_gren_t;
extern cvar_t bm_rune_gren_r;
extern cvar_t bm_rune_357;
extern cvar_t bm_rune_357_t;
extern cvar_t bm_rune_357_r;
extern cvar_t bm_rune_health;
extern cvar_t bm_rune_health_t;
extern cvar_t bm_rune_health_r;
extern cvar_t bm_rune_armor;
extern cvar_t bm_rune_armor_t;
extern cvar_t bm_rune_armor_r;
extern cvar_t bm_rune_shotty;
extern cvar_t bm_rune_shotty_t;
extern cvar_t bm_rune_shotty_r;
// BMOD End - CVARs
// BMOD Begin - server commands
void BModCmd_AdminSay( void );
void BModCmd_AdminWhisper( void );
void BModCmd_ShowSpawns( void );
void BModCmd_SpeakAll( void );
void BModCmd_Create( void );
void BModCmd_Remove( void );
void BModCmd_Delete( void );
void BModCmd_Replace( void );
void BModCmd_Info( void );
void BModCmd_Llama( void );
void BModCmd_Unllama( void );
// BMOD End - server commands

17
dlls/gamerules.h

@ -99,6 +99,8 @@ public: @@ -99,6 +99,8 @@ public:
virtual void ClientUserInfoChanged( CBasePlayer *pPlayer, char *infobuffer ) {} // the player has changed userinfo; can change it now
// Client kills/scoring
// BMOD
//virtual int BMOD_IPointsForKill( CBasePlayer *pAttacker, CBasePlayer *pKilled, entvars_t *pInflictor);// how many points do I award whoever kills this player?
virtual int IPointsForKill( CBasePlayer *pAttacker, CBasePlayer *pKilled ) = 0;// how many points do I award whoever kills this player?
virtual void PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor ) = 0;// Called each time a player dies
virtual void DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, entvars_t *pInflictor )= 0;// Call this from within a GameRules class to report an obituary.
@ -160,6 +162,10 @@ public: @@ -160,6 +162,10 @@ public:
// Immediately end a multiplayer game
virtual void EndMultiplayerGame( void ) {}
// BMOD Begin - Extra gamerules
virtual void BMOD_PreChangeLevel( void );
// BMOD End - Extra gamerules
};
extern CGameRules *InstallGameRules( void );
@ -352,6 +358,17 @@ public: @@ -352,6 +358,17 @@ public:
// Immediately end a multiplayer game
virtual void EndMultiplayerGame( void ) { GoToIntermission(); }
// BMOD Begin - Extra gamerules
virtual void BMOD_ClientDisconnected( edict_t *pClient, CBasePlayer *pPlayer );
virtual void BMOD_PlayerSpawn( CBasePlayer *pPlayer );
virtual void BMOD_InitHUD( CBasePlayer *pl );
virtual void BMOD_PreChangeLevel( void );
virtual void BMOD_Think( void );
virtual void BMOD_GiveGunsAndAmmo( CBasePlayer *pPlayer );
virtual void BMOD_UpdateGuns( void );
virtual void BMOD_UpdateMods( void );
// BMOD End - Extra gamerules
protected:
virtual void ChangeLevel( void );
virtual void GoToIntermission( void );

14
dlls/gauss.cpp

@ -25,6 +25,10 @@ @@ -25,6 +25,10 @@
#include "shake.h"
#include "gamerules.h"
// BMOD Edit - tau mod
extern cvar_t bm_tau_mod;
#include "BMOD_messaging.h"
#define GAUSS_PRIMARY_CHARGE_VOLUME 256// how loud gauss is while charging
#define GAUSS_PRIMARY_FIRE_VOLUME 450// how loud gauss is when discharged
@ -125,6 +129,10 @@ int CGauss::GetItemInfo( ItemInfo *p ) @@ -125,6 +129,10 @@ int CGauss::GetItemInfo( ItemInfo *p )
BOOL CGauss::Deploy()
{
// BMOD Edit - tau mod
if( bm_tau_mod.value )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\nTAU\nOnly does direct fire damage through walls." );
m_pPlayer->m_flPlayAftershock = 0.0;
return DefaultDeploy( "models/v_gauss.mdl", "models/p_gauss.mdl", GAUSS_DRAW, "gauss" );
}
@ -493,7 +501,11 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage ) @@ -493,7 +501,11 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
damage_radius = flDamage * 2.5;
}
::RadiusDamage( beam_tr.vecEndPos + vecDir * 8, pev, m_pPlayer->pev, flDamage, damage_radius, CLASS_NONE, DMG_BLAST );
// BMOD Edit - tau mod
if( bm_tau_mod.value )
::RadiusDamage( beam_tr.vecEndPos + vecDir * 8, pev, m_pPlayer->pev, 2, damage_radius, CLASS_NONE, DMG_BLAST );
else
::RadiusDamage( beam_tr.vecEndPos + vecDir * 8, pev, m_pPlayer->pev, flDamage, damage_radius, CLASS_NONE, DMG_BLAST );
CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 );

140
dlls/ggrenade.cpp

@ -26,6 +26,10 @@ @@ -26,6 +26,10 @@
#include "nodes.h"
#include "soundent.h"
#include "decals.h"
#include "player.h"
// BMOD Edit - mp5 mod
extern cvar_t bm_mp5_mod;
//===================grenade
@ -51,6 +55,23 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType ) @@ -51,6 +55,23 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
{
float flRndSound;// sound randomizer
// BMOD Begin - Grenade Rune
CBasePlayer *pPlayer = UTIL_CastPlayer( pev->owner );
if( !strcmp( STRING( pev->classname ), "hand_grenade" ) && pPlayer && ( pPlayer->m_RuneFlags == RUNE_GRENADE ) )
{
pev->nextthink = gpGlobals->time + 0.1;
pev->dmg = 150;
m_iMegaSmokeFrame = 0;
SetThink( MegaSmoke );
}
else
{
pev->nextthink = gpGlobals->time + 0.3;
SetThink( Smoke );
}
// BMOD End - Grenade Rune
pev->model = iStringNull;//invisible
pev->solid = SOLID_NOT;// intangible
@ -118,9 +139,7 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType ) @@ -118,9 +139,7 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
}
pev->effects |= EF_NODRAW;
SetThink( &CGrenade::Smoke );
pev->velocity = g_vecZero;
pev->nextthink = gpGlobals->time + 0.3;
if( iContents != CONTENTS_WATER )
{
@ -130,6 +149,115 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType ) @@ -130,6 +149,115 @@ void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
}
}
void CGrenade::MegaSmoke( void )
{
m_iMegaSmokeFrame++;
if( m_iMegaSmokeFrame == 1 )
{
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMTORUS );
WRITE_COORD( pev->origin.x );
WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z - 50 );
WRITE_COORD( pev->origin.x );
WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z - 50 + ( pev->dmg * 2.5 ) );
WRITE_SHORT( g_sModelIndexLaser );
WRITE_BYTE( 0 ); // start frame?
WRITE_BYTE( 10 ); // rame rate?
WRITE_BYTE( 5 ); // life
WRITE_BYTE( 40 ); // width
WRITE_BYTE( 0 ); // noise
WRITE_BYTE( 250 ); //Color
WRITE_BYTE( 120 );
WRITE_BYTE( 20 );
WRITE_BYTE( 255 ); // brightness
WRITE_BYTE( 0 ); // scroll speed
MESSAGE_END();
}
// coord coord coord (center position)
// coord coord coord (axis and radius)
// short (sprite index)
// byte (starting frame)
// byte (frame rate in 0.1's)
// byte (life in 0.1's)
// byte (line width in 0.1's)
// byte (noise amplitude in 0.01's)
// byte,byte,byte (color)
// byte (brightness)
// byte (scroll speed in 0.1's)
if( UTIL_PointContents( pev->origin ) == CONTENTS_WATER )
{
UTIL_Bubbles( pev->origin - Vector( 64, 64, 64 ), pev->origin + Vector( 64, 64, 64 ), 100 );
}
else
{
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_SMOKE );
WRITE_COORD( pev->origin.x );
WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z );
WRITE_SHORT( g_sModelIndexSmoke );
WRITE_BYTE( ( pev->dmg - 50 ) * 0.80 ); // scale * 10
WRITE_BYTE( 12 ); // framerate
MESSAGE_END();
}
pev->dmg *= .80;
pev->origin.z += pev->dmg / 2;
if( m_iMegaSmokeFrame < 4 )
{
int iContents = UTIL_PointContents( pev->origin );
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_EXPLOSION ); // This makes a dynamic light and the explosion sprites/sound
WRITE_COORD( pev->origin.x ); // Send to PAS because of the sound
WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z );
if( iContents != CONTENTS_WATER )
{
WRITE_SHORT( g_sModelIndexFireball );
}
else
{
WRITE_SHORT( g_sModelIndexWExplosion );
}
WRITE_BYTE( ( pev->dmg - 50 ) * .60 ); // scale * 10
WRITE_BYTE( 15 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END();
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 );
switch( RANDOM_LONG( 0, 2 ) )
{
case 0:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/debris1.wav", 0.55, ATTN_NORM );
break;
case 1:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/debris2.wav", 0.55, ATTN_NORM );
break;
case 2:
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/debris3.wav", 0.55, ATTN_NORM );
break;
}
if( iContents != CONTENTS_WATER )
{
int sparkCount = RANDOM_LONG( 1, 4 );
for( int i = 0; i < sparkCount; i++ )
Create( "spark_shower", pev->origin, Vector( 0, 0, 1 ), NULL );
}
}
pev->nextthink = gpGlobals->time + 0.1;
if( m_iMegaSmokeFrame == 4 )
UTIL_Remove( this );
}
void CGrenade::Smoke( void )
{
if( UTIL_PointContents( pev->origin ) == CONTENTS_WATER )
@ -377,7 +505,13 @@ CGrenade *CGrenade::ShootContact( entvars_t *pevOwner, Vector vecStart, Vector v @@ -377,7 +505,13 @@ CGrenade *CGrenade::ShootContact( entvars_t *pevOwner, Vector vecStart, Vector v
// Explode on contact
pGrenade->SetTouch( &CGrenade::ExplodeTouch );
pGrenade->pev->dmg = gSkillData.plrDmgM203Grenade;
// BMOD Begin - mp5 mod
// pGrenade->pev->dmg = gSkillData.plrDmgM203Grenade;
if( bm_mp5_mod.value )
pGrenade->pev->dmg = 80;
else
pGrenade->pev->dmg = gSkillData.plrDmgM203Grenade;
// BMOD End - mp5 mod
return pGrenade;
}

8
dlls/globals.cpp

@ -37,3 +37,11 @@ DLL_GLOBAL int gDisplayTitle; @@ -37,3 +37,11 @@ DLL_GLOBAL int gDisplayTitle;
DLL_GLOBAL BOOL g_fGameOver;
DLL_GLOBAL const Vector g_vecZero = Vector( 0, 0, 0 );
DLL_GLOBAL int g_Language;
// BMOD Begin - Map Voting
DLL_GLOBAL int g_VoteStatus = 0; // 0 = ready to start votes
// 1 = voting is session
// 2 = map won vote
DLL_GLOBAL float g_VoteTimer = 0;
DLL_GLOBAL BOOL g_runes_exist = 0;
DLL_GLOBAL BOOL g_runes_learn = 0;

6
dlls/h_battery.cpp

@ -26,6 +26,7 @@ @@ -26,6 +26,7 @@
#include "saverestore.h"
#include "skill.h"
#include "gamerules.h"
#include "player.h"
class CRecharge : public CBaseToggle
{
@ -143,6 +144,8 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use @@ -143,6 +144,8 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
if( !m_hActivator->IsPlayer() )
return;
CBasePlayer *pPlayer = (CBasePlayer *)pActivator;
// Play the on sound or the looping charging sound
if( !m_iOn )
{
@ -162,6 +165,9 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use @@ -162,6 +165,9 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
m_iJuice--;
m_hActivator->pev->armorvalue += 1;
if( pPlayer->m_RuneFlags == RUNE_BATTERY )
pPlayer->pev->armorvalue += 1;
if( m_hActivator->pev->armorvalue > 100 )
m_hActivator->pev->armorvalue = 100;
}

13
dlls/handgrenade.cpp

@ -103,6 +103,19 @@ void CHandGrenade::Holster( int skiplocal /* = 0 */ ) @@ -103,6 +103,19 @@ void CHandGrenade::Holster( int skiplocal /* = 0 */ )
pev->nextthink = gpGlobals->time + 0.1;
}
//BMOD Begin - fix for short fuse hand grenades.
if( m_flStartThrow )
{
Vector vecSrc = m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_forward * 16;
float time = m_flStartThrow - gpGlobals->time + 3.0;
if( time < 0 )
time = 0;
CGrenade::ShootTimed( m_pPlayer->pev, vecSrc, Vector( 0, 0, 0 ), time );
m_flStartThrow = 0;
m_flReleaseThrow = 0;
}
//BMOD End - fix for short fuse hand grenades.
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM );
}

8
dlls/healthkit.cpp

@ -71,6 +71,9 @@ BOOL CHealthKit::MyTouch( CBasePlayer *pPlayer ) @@ -71,6 +71,9 @@ BOOL CHealthKit::MyTouch( CBasePlayer *pPlayer )
if( pPlayer->TakeHealth( gSkillData.healthkitCapacity, DMG_GENERIC ) )
{
if( pPlayer->m_RuneFlags == RUNE_HEALTH )
pPlayer->TakeHealth( gSkillData.healthkitCapacity, DMG_GENERIC );
MESSAGE_BEGIN( MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev );
WRITE_STRING( STRING( pev->classname ) );
MESSAGE_END();
@ -179,6 +182,8 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u @@ -179,6 +182,8 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
if( !pActivator->IsPlayer() )
return;
CBasePlayer *pPlayer = (CBasePlayer *)pActivator;
// if there is no juice left, turn it off
if( m_iJuice <= 0 )
{
@ -220,6 +225,9 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u @@ -220,6 +225,9 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
// charge the player
if( pActivator->TakeHealth( 1, DMG_GENERIC ) )
{
if( pPlayer->m_RuneFlags == RUNE_HEALTH )
pPlayer->TakeHealth( 1, DMG_GENERIC );
m_iJuice--;
}

831
dlls/hornetgun.cpp

@ -23,6 +23,17 @@ @@ -23,6 +23,17 @@
#include "player.h"
#include "hornet.h"
#include "gamerules.h"
#include "effects.h"
#include "BMOD_messaging.h"
#include "decals.h"
#include "BMOD_zapgunrift.h"
#include "shake.h"
#include "squeakgrenade.h"
short iBSquidSpitSprite;
extern cvar_t bm_freezetime;
extern cvar_t bm_hornet_mod;
enum hgun_e
{
@ -34,14 +45,424 @@ enum hgun_e @@ -34,14 +45,424 @@ enum hgun_e
HGUN_SHOOT
};
enum hgun_phase
{
HGUN_IDLE = 0,
HGUN_CHARGE,
HGUN_ZAP,
HGUN_ZAP_DONE,
HGUN_SPIT
};
enum firemode_e
{
FIREMODE_TRACK = 0,
FIREMODE_FAST
};
//=========================================================
// Bullsquid's spit projectile
//=========================================================
class BMODSquidSpit : public CBaseEntity
{
public:
void Spawn( void );
static void Shoot( entvars_t *Owner, Vector vecStart, Vector vecVelocity );
void Touch( CBaseEntity *pOther );
void EXPORT Animate( void );
static TYPEDESCRIPTION m_SaveData[];
int m_maxFrame;
entvars_t *pevOwner;
};
LINK_ENTITY_TO_CLASS( squidspit, BMODSquidSpit );
void BMODSquidSpit:: Spawn( void )
{
pev->movetype = MOVETYPE_FLY;
pev->classname = MAKE_STRING( "squidspit" );
pev->solid = SOLID_BBOX;
pev->rendermode = kRenderTransAlpha;
pev->renderamt = 255;
SET_MODEL( ENT( pev ), "sprites/bigspit.spr" );
pev->frame = 0;
pev->scale = 0.5;
UTIL_SetSize( pev, Vector( -4, -4, -4 ), Vector( 4, 4, 4 ) );
m_maxFrame = (float)MODEL_FRAMES( pev->modelindex ) - 1;
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMFOLLOW );
WRITE_SHORT( entindex() ); // entity
WRITE_SHORT( g_sModelIndexLightning ); // model
WRITE_BYTE( 2 ); // life
WRITE_BYTE( 4 ); // width
WRITE_BYTE( 128 ); // r, g, b
WRITE_BYTE( 200 ); // r, g, b
WRITE_BYTE( 0 ); // r, g, b
WRITE_BYTE( 255 ); // brightness
MESSAGE_END(); // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS)
}
void BMODSquidSpit::Animate( void )
{
pev->nextthink = gpGlobals->time + 0.1;
if( pev->frame++ )
{
if( pev->frame > m_maxFrame )
{
pev->frame = 0;
}
}
}
void BMODSquidSpit::Shoot( entvars_t *Owner, Vector vecStart, Vector vecVelocity )
{
BMODSquidSpit *pSpit = GetClassPtr( (BMODSquidSpit *)NULL );
pSpit->Spawn();
UTIL_SetOrigin( pSpit->pev, vecStart );
pSpit->pev->velocity = vecVelocity;
pSpit->pev->owner = ENT( Owner );
pSpit->pevOwner = Owner;
pSpit->SetThink( Animate );
pSpit->pev->nextthink = gpGlobals->time + 0.1;
}
void BMODSquidSpit::Touch( CBaseEntity *pOther )
{
TraceResult tr;
int iPitch;
// splat sound
iPitch = RANDOM_FLOAT( 90, 110 );
EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "bullchicken/bc_acid1.wav", 1, ATTN_NORM, 0, iPitch );
switch( RANDOM_LONG( 0, 1 ) )
{
case 0:
EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "bullchicken/bc_spithit1.wav", 1, ATTN_NORM, 0, iPitch );
break;
case 1:
EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "bullchicken/bc_spithit2.wav", 1, ATTN_NORM, 0, iPitch );
break;
}
// make a splat on the wall
UTIL_TraceLine( pev->origin, pev->origin + pev->velocity, dont_ignore_monsters, ENT( pev ), &tr );
UTIL_DecalTrace( &tr, DECAL_SPIT1 + RANDOM_LONG( 0, 1 ) );
// make some flecks
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, tr.vecEndPos );
WRITE_BYTE( TE_SPRITE_SPRAY );
WRITE_COORD( tr.vecEndPos.x ); // pos
WRITE_COORD( tr.vecEndPos.y );
WRITE_COORD( tr.vecEndPos.z );
WRITE_COORD( tr.vecPlaneNormal.x ); // dir
WRITE_COORD( tr.vecPlaneNormal.y );
WRITE_COORD( tr.vecPlaneNormal.z );
WRITE_SHORT( iBSquidSpitSprite ); // model
WRITE_BYTE( 5 ); // count
WRITE_BYTE( 30 ); // speed
WRITE_BYTE( 80 ); // noise ( client will divide by 100 )
MESSAGE_END();
if( pOther->IsPlayer() )
{
ClearMultiDamage();
pOther->TraceAttack( pevOwner, 30, pev->origin + pev->velocity, &tr, DMG_GENERIC );
ApplyMultiDamage( pev, pevOwner );
}
SetThink( SUB_Remove );
pev->nextthink = gpGlobals->time;
}
#include "BMOD_hornetgun.h"
LINK_ENTITY_TO_CLASS( weapon_hornetgun, CHgun )
//=========================================================
// ClearBeams - remove all beams
//=========================================================
void CHgun::ClearBeams()
{
for( int i = 0; i < HGUN_MAX_BEAMS; i++ )
{
if( m_pBeam[i] )
{
UTIL_Remove( m_pBeam[i] );
m_pBeam[i] = NULL;
}
}
m_iBeams = 0;
STOP_SOUND( ENT(m_pPlayer->pev), CHAN_WEAPON, "debris/zap4.wav" );
}
//=========================================================
// ArmBeam - small beam from arm to nearby geometry
//=========================================================
void CHgun::ArmBeam( Vector color )
{
TraceResult tr;
float flDist = 1.0;
if( m_iBeams >= HGUN_MAX_BEAMS )
return;
// UTIL_MakeAimVectors( pev->angles );
Vector vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12;
for( int i = 0; i < 3; i++ )
{
Vector vecAim = gpGlobals->v_right * RANDOM_FLOAT( -1, 1 ) + gpGlobals->v_up * RANDOM_FLOAT( -1, 1 );
TraceResult tr1;
UTIL_TraceLine( vecSrc, vecSrc + vecAim * 512, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr1 );
if( flDist > tr1.flFraction )
{
tr = tr1;
flDist = tr.flFraction;
}
}
// Couldn't find anything close enough
if( flDist == 1.0 )
return;
// DecalGunshot( &tr, BULLET_PLAYER_CROWBAR );
m_pBeam[m_iBeams] = CBeam::BeamCreate( "sprites/lgtning.spr", 30 );
if( !m_pBeam[m_iBeams] )
return;
m_pBeam[m_iBeams]->PointEntInit( tr.vecEndPos, m_pPlayer->entindex() );
m_pBeam[m_iBeams]->SetEndAttachment( 1 );
// m_pBeam[m_iBeams]->SetColor( 96, 128, 16 );
m_pBeam[m_iBeams]->SetColor( color.x, color.y, color.z );
m_pBeam[m_iBeams]->SetBrightness( 64 );
m_pBeam[m_iBeams]->SetNoise( 80 );
m_pBeam[m_iBeams]->pev->spawnflags |= SF_BEAM_TEMPORARY;
m_iBeams++;
}
//=========================================================
// ZapBeam - heavy damage directly forward
//=========================================================
void CHgun::ZapBeam( void )
{
Vector vecSrc, vecAim, vecOrig;
TraceResult tr;
CBaseEntity *pEntity;
/*
if (m_iBeams >= HGUN_MAX_BEAMS)
return;
*/
// UTIL_MakeVectors( m_pPlayer->pev->v_angle );
vecOrig = m_pPlayer->GetGunPosition();
vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12;
vecAim = gpGlobals->v_forward;
UTIL_TraceLine( vecOrig, vecOrig + vecAim * 2048, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
for( int i = 0; i < 2; i++ )
{
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMPOINTS );
WRITE_COORD( vecSrc.x );
WRITE_COORD( vecSrc.y );
WRITE_COORD( vecSrc.z );
WRITE_COORD( tr.vecEndPos.x );
WRITE_COORD( tr.vecEndPos.y );
WRITE_COORD( tr.vecEndPos.z );
WRITE_SHORT( iZapBeamSpr );
WRITE_BYTE( 0 ); // Starting frame
WRITE_BYTE( 0 ); // framerate * 0.1
WRITE_BYTE( 2 ); // life * 0.1
WRITE_BYTE( 50 ); // width
WRITE_BYTE( 20 ); // noise
WRITE_BYTE( 180 ); // color r,g,b
WRITE_BYTE( 255 ); // color r,g,b
WRITE_BYTE( 96 ); // color r,g,b
WRITE_BYTE( 255 ); // brightness
WRITE_BYTE( 0 ); // scroll speed
MESSAGE_END();
}
UTIL_DecalTrace( &tr, DECAL_SMALLSCORCH1 + RANDOM_LONG( 0, 2 ) );
/*
m_pBeam[m_iBeams] = CBeam::BeamCreate( "sprites/lgtning.spr", 50 );
if( !m_pBeam[m_iBeams] )
return;
m_pBeam[m_iBeams]->PointEntInit( tr.vecEndPos, m_pPlayer->entindex() );
m_pBeam[m_iBeams]->SetEndAttachment( 1 );
m_pBeam[m_iBeams]->SetColor( 180, 255, 96 );
m_pBeam[m_iBeams]->SetBrightness( 255 );
m_pBeam[m_iBeams]->SetNoise( 20 );
m_pBeam[m_iBeams]->pev->spawnflags |= SF_BEAM_TEMPORARY;
m_iBeams++;
*/
pEntity = CBaseEntity::Instance(tr.pHit);
if( pEntity != NULL && pEntity->pev->takedamage )
{
// pEntity->TakeDamage( pev, VARS (pev->owner), 45, DMG_SHOCK );
ClearMultiDamage();
entvars_t *Owner;
Owner = VARS( pev->owner );
pEntity->TraceAttack( Owner, 90, vecAim, &tr, DMG_SHOCK | DMG_ALWAYSGIB );
ApplyMultiDamage( pev, Owner );
UTIL_ScreenFade( pEntity, Vector(180,255,96), 2, 0.5, 128, FFADE_IN );
}
UTIL_EmitAmbientSound( ENT( m_pPlayer->pev ), tr.vecEndPos, "weapons/electro4.wav", 0.5, ATTN_NORM, 0, RANDOM_LONG( 140, 160 ) );
if( UTIL_PointContents( tr.vecEndPos ) == CONTENTS_WATER )
{
CBaseEntity *pRift = CBaseEntity::Create( "zaprift", tr.vecEndPos, UTIL_VecToAngles( tr.vecPlaneNormal ), m_pPlayer->edict() );
// UTIL_EmitAmbientSound( ENT(m_pPlayer->pev), tr.vecEndPos, "weapons/electro4.wav", 50, ATTN_NORM, 0, 300 );
}
}
//=========================================================
// Freeze Ray -
//=========================================================
void CHgun::FreezeRay( void )
{
Vector vecSrc, vecAim, vecOrig;
TraceResult tr;
CBaseEntity *pEntity;
if( ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < 12 ) || m_pPlayer->pev->waterlevel == 3 )
{
return;
}
vecOrig = m_pPlayer->GetGunPosition();
vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12;
vecAim = gpGlobals->v_forward;
UTIL_TraceLine( vecOrig, vecOrig + vecAim * 2048, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMPOINTS );
WRITE_COORD( vecSrc.x );
WRITE_COORD( vecSrc.y );
WRITE_COORD( vecSrc.z );
WRITE_COORD( tr.vecEndPos.x );
WRITE_COORD( tr.vecEndPos.y );
WRITE_COORD( tr.vecEndPos.z );
WRITE_SHORT( iZapBeamSpr );
WRITE_BYTE( 0 ); // Starting frame
WRITE_BYTE( 0 ); // framerate * 0.1
WRITE_BYTE( 3 ); // life * 0.1
WRITE_BYTE( 200 ); // width
WRITE_BYTE( 2 ); // noise
WRITE_BYTE( 220 ); // color r,g,b
WRITE_BYTE( 220 ); // color r,g,b
WRITE_BYTE( 255 ); // color r,g,b
WRITE_BYTE( 255 ); // brightness
WRITE_BYTE( 0 ); // scroll speed
MESSAGE_END();
UTIL_DecalTrace( &tr, DECAL_MOMMASPLAT );
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_SPRITETRAIL );// TE_RAILTRAIL);
WRITE_COORD( vecSrc.x );
WRITE_COORD( vecSrc.y );
WRITE_COORD( vecSrc.z );
WRITE_COORD( tr.vecEndPos.x );
WRITE_COORD( tr.vecEndPos.y );
WRITE_COORD( tr.vecEndPos.z );
WRITE_SHORT( m_sGlowSpr ); // model
WRITE_BYTE( 20 ); // count
WRITE_BYTE( 10 ); // life * 10
WRITE_BYTE( RANDOM_LONG( 1, 2 ) ); // size * 10
WRITE_BYTE( 10 ); // amplitude * 0.1
WRITE_BYTE( 0 ); // speed * 100
MESSAGE_END();
pEntity = CBaseEntity::Instance( tr.pHit );
if( pEntity != NULL && pEntity->pev->takedamage && pEntity->IsPlayer() )
{
CBasePlayer *pPlayer = (CBasePlayer *)pEntity;
UTIL_ScreenFade( pPlayer, Vector( 0, 0, 255 ), 2.0, 1.0, 128, FFADE_IN );
pPlayer->pev->rendermode = kRenderNormal;
pPlayer->pev->renderfx = kRenderFxGlowShell;
pPlayer->pev->rendercolor.x = 240; // red
pPlayer->pev->rendercolor.y = 240; // green
pPlayer->pev->rendercolor.z = 255; // blue
pPlayer->pev->renderamt = 60; // glow shell distance from entity
float freezetime = max (.6, bm_freezetime.value);
// freeze the player and set the "unfreeze" time...
pPlayer->EnableControl(FALSE);
pPlayer->m_vFreezeAngle = pPlayer->pev->v_angle;
// pPlayer->pev->movetype = MOVETYPE_TOSS;
pPlayer->m_flFreezeTime = gpGlobals->time + freezetime;
//RuneMsg( pPlayer, "YOU ARE FROZEN!!!", Vector(100,100,255), freezetime - .5);
PrintMessage( pPlayer, BMOD_CHAN_RUNE, Vector(100,100,255), Vector (.1, freezetime - .5, .1), "YOU ARE FROZEN!!!");
}
UTIL_EmitAmbientSound( ENT(m_pPlayer->pev), tr.vecEndPos, "weapons/electro4.wav", 0.5, ATTN_NORM, 0, RANDOM_LONG( 140, 160 ));
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] = 0;
m_flNextPrimaryAttack = gpGlobals->time + .25;
m_flRechargeTime = gpGlobals->time + 0.5;
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
SendWeaponAnim( HGUN_SHOOT );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT( 10, 15 );
m_pPlayer->pev->punchangle.x = RANDOM_FLOAT( 0, 2 );
}
//=========================================================
// BeamGlow - brighten all beams
//=========================================================
void CHgun::BeamGlow()
{
int b = m_iBeams * 32;
if( b > 255 )
b = 255;
for( int i = 0; i < m_iBeams; i++ )
{
if( m_pBeam[i]->GetBrightness() != 255 )
{
m_pBeam[i]->SetBrightness( b );
}
}
}
BOOL CHgun::IsUseable( void )
{
return TRUE;
@ -55,6 +476,7 @@ void CHgun::Spawn() @@ -55,6 +476,7 @@ void CHgun::Spawn()
m_iDefaultAmmo = HIVEHAND_DEFAULT_GIVE;
m_iFirePhase = 0;
m_iFireMode = 0;
FallInit();// get ready to fall down.
}
@ -68,6 +490,23 @@ void CHgun::Precache( void ) @@ -68,6 +490,23 @@ void CHgun::Precache( void )
m_usHornetFire = PRECACHE_EVENT( 1, "events/firehornet.sc" );
UTIL_PrecacheOther( "hornet" );
UTIL_PrecacheOther( "zaprift" );
UTIL_PrecacheOther( "zapbounce" );
PRECACHE_SOUND( "debris/zap4.wav" );
PRECACHE_SOUND( "weapons/electro4.wav" );
PRECACHE_SOUND( "hassault/hw_shoot1.wav" );
iZapBeamSpr = PRECACHE_MODEL( "sprites/lgtning.spr" );
PRECACHE_MODEL( "sprites/bigspit.spr" );
iBSquidSpitSprite = PRECACHE_MODEL( "sprites/tinyspit.spr" );// client side spittle.
PRECACHE_SOUND( "bullchicken/bc_acid1.wav" );
PRECACHE_SOUND( "bullchicken/bc_spithit1.wav" );
PRECACHE_SOUND( "bullchicken/bc_spithit2.wav" );
PRECACHE_SOUND( "bullchicken/bc_attack2.wav" );
PRECACHE_SOUND( "bullchicken/bc_attack3.wav" );
PRECACHE_SOUND( "leech/leech_bite1.wav" );
m_sGlowSpr = PRECACHE_MODEL( "sprites/glow04.spr" );
}
int CHgun::AddToPlayer( CBasePlayer *pPlayer )
@ -78,7 +517,7 @@ int CHgun::AddToPlayer( CBasePlayer *pPlayer ) @@ -78,7 +517,7 @@ int CHgun::AddToPlayer( CBasePlayer *pPlayer )
if( g_pGameRules->IsMultiplayer() )
{
// in multiplayer, all hivehands come full.
pPlayer->m_rgAmmo[PrimaryAmmoIndex()] = HORNET_MAX_CARRY;
pPlayer->m_rgAmmo[PrimaryAmmoIndex()] = 12;
}
#endif
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
@ -93,7 +532,7 @@ int CHgun::GetItemInfo( ItemInfo *p ) @@ -93,7 +532,7 @@ int CHgun::GetItemInfo( ItemInfo *p )
{
p->pszName = STRING( pev->classname );
p->pszAmmo1 = "Hornets";
p->iMaxAmmo1 = HORNET_MAX_CARRY;
p->iMaxAmmo1 = m_iMaxammo;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = WEAPON_NOCLIP;
@ -108,11 +547,18 @@ int CHgun::GetItemInfo( ItemInfo *p ) @@ -108,11 +547,18 @@ int CHgun::GetItemInfo( ItemInfo *p )
BOOL CHgun::Deploy()
{
// BMOD Edit - Modified hornet message
if( bm_hornet_mod.value )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "HORNET GUN\nACID SPIT - LIGHTNING - FREEZE RAY - SNARKS\nSECONDARY FIRE: Switches modes." );
return DefaultDeploy( "models/v_hgun.mdl", "models/p_hgun.mdl", HGUN_UP, "hive" );
}
void CHgun::Holster( int skiplocal /* = 0 */ )
{
ClearBeams();
m_iFirePhase = HGUN_IDLE;
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
SendWeaponAnim( HGUN_DOWN );
@ -123,7 +569,376 @@ void CHgun::Holster( int skiplocal /* = 0 */ ) @@ -123,7 +569,376 @@ void CHgun::Holster( int skiplocal /* = 0 */ )
}
}
void CHgun::PrimaryAttack()
void CHgun::SecondaryAttack()
{
if( !bm_hornet_mod.value )
{
OldSecondaryAttack();
return;
}
m_iFireMode = ( m_iFireMode + 1 ) % 5;
switch( m_iFireMode )
{
case 0:
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\n\nAcid Spit Mode - 3 per shot");
break;
case 1:
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\n\nLightning Mode - 4 per shot");
break;
case 2:
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\n\nMultizap Mode - 12 per shot");
break;
case 3:
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\n\nFreeze Ray Mode - 12 per shot");
break;
case 4:
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\n\nSnark Launcher Mode - 1 Snark per shot");
break;
}
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "leech/leech_bite1.wav", 1, ATTN_NORM );
m_flNextSecondaryAttack = gpGlobals->time + .5;
}
void CHgun::ZapGun()
{
if( m_iFirePhase == HGUN_IDLE )
Reload();
if( ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < 4 ) || ( m_fNextPhaseTime > gpGlobals->time ) )
{
return;
}
if( m_pPlayer->pev->waterlevel > 0 )
{
// m_pPlayer->TakeDamage( VARS( eoNullEntity ), VARS( eoNullEntity ), 50, DMG_SHOCK );
UTIL_ScreenFade( this, Vector( 180, 255, 96 ), 2, 0.5, 128, FFADE_IN );
CBaseEntity *pRift = CBaseEntity::Create( "zaprift", pev->origin, pev->angles, ENT( pev ) );
m_pPlayer->TakeDamage( m_pPlayer->pev, m_pPlayer->pev, 100, DMG_SHOCK );
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "debris/zap4.wav", 1, ATTN_NORM, 0, 100 + m_iBeams * 10 );
m_flNextPrimaryAttack = m_flNextPrimaryAttack + 1.5;
return;
}
switch( m_iFirePhase )
{
case HGUN_IDLE:
m_flTimeWeaponIdle = gpGlobals->time;
m_iFirePhase = HGUN_CHARGE;
m_fNextPhaseTime = 0;
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
case HGUN_CHARGE:
if( m_fNextPhaseTime < gpGlobals->time )
{
if( m_iBeams < HGUN_MAX_BEAMS )
{
ArmBeam( Vector( 96, 128, 16 ) );
BeamGlow();
m_fNextPhaseTime = gpGlobals->time + HGUN_CHARGE_TIME;
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "debris/zap4.wav", 1, ATTN_NORM, 0,100 + m_iBeams * 10 );
}
else
{
m_iFirePhase = HGUN_ZAP;
m_fNextPhaseTime = gpGlobals->time + .1;
}
}
break;
case HGUN_ZAP:
ClearBeams();
ZapBeam();
m_iFirePhase = HGUN_ZAP_DONE;
m_fNextPhaseTime = gpGlobals->time + HGUN_ZAP_TIME;
EMIT_SOUND_DYN( ENT(m_pPlayer->pev), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, RANDOM_LONG( 130, 160 ) );
SendWeaponAnim( HGUN_SHOOT );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= 4;
m_flRechargeTime = gpGlobals->time + 0.5;
m_pPlayer->pev->punchangle.x = RANDOM_FLOAT( 0, 2 );
break;
case HGUN_ZAP_DONE:
ClearBeams();
m_flNextPrimaryAttack = gpGlobals->time + .25;
m_flTimeWeaponIdle = gpGlobals->time + .1;
break;
}
}
void CHgun::MultiZapGun()
{
CZapBounce *pRift = NULL;
if( m_iFirePhase == HGUN_IDLE )
Reload();
if( ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < 12 ) || ( m_fNextPhaseTime > gpGlobals->time ) )
{
return;
}
if( m_pPlayer->pev->waterlevel > 0 )
{
UTIL_ScreenFade( this, Vector( 180, 255, 96 ), 2, 0.5, 128, FFADE_IN );
m_pPlayer->TakeDamage( m_pPlayer->pev, m_pPlayer->pev, 100, DMG_SHOCK );
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "debris/zap4.wav", 1, ATTN_NORM, 0, 100 + m_iBeams * 10 );
m_flNextPrimaryAttack = m_flNextPrimaryAttack + 1.5;
return;
}
switch( m_iFirePhase )
{
case HGUN_IDLE:
m_flTimeWeaponIdle = gpGlobals->time;
m_iFirePhase = HGUN_CHARGE;
m_fNextPhaseTime = 0;
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
case HGUN_CHARGE:
if( m_fNextPhaseTime < gpGlobals->time )
{
if( m_iBeams < HGUN_MAX_BEAMS / 2 )
{
ArmBeam( Vector( 16, 96, 128 ) );
BeamGlow();
m_fNextPhaseTime = gpGlobals->time + HGUN_CHARGE_TIME;
EMIT_SOUND_DYN( ENT(m_pPlayer->pev), CHAN_WEAPON, "debris/zap4.wav", 1, ATTN_NORM, 0,100 + m_iBeams * 10 );
}
else
m_iFirePhase = HGUN_ZAP;
m_fNextPhaseTime = gpGlobals->time + .1;
}
break;
case HGUN_ZAP:
ClearBeams();
pRift = (CZapBounce*)CBaseEntity::Create( "zapbounce",
m_pPlayer->GetGunPosition( ) + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12,
gpGlobals->v_forward,
m_pPlayer->edict() );
if( pRift )
{
pRift->m_fDamage = 90;
pRift->m_iBounce = 5;
pRift->pentIgnore = ENT( m_pPlayer->pev );
pRift->m_bFirstZap = TRUE;
pRift->BounceThink();
}
m_iFirePhase = HGUN_ZAP_DONE;
m_fNextPhaseTime = gpGlobals->time + HGUN_ZAP_TIME;
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "hassault/hw_shoot1.wav", 1, ATTN_NORM, 0, RANDOM_LONG( 130, 160 ) );
SendWeaponAnim( HGUN_SHOOT );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= 12;
m_flRechargeTime = gpGlobals->time + 0.5;
m_pPlayer->pev->punchangle.x = RANDOM_FLOAT( 0, 2 );
break;
case HGUN_ZAP_DONE:
ClearBeams();
m_flNextPrimaryAttack = gpGlobals->time + .25;
m_flTimeWeaponIdle = gpGlobals->time + .1;
break;
}
}
void CHgun::PrimaryAttack( void )
{
if( !bm_hornet_mod.value )
{
OldPrimaryAttack();
return;
}
Reload();
switch( m_iFireMode )
{
case 0:
SquidSpit();
break;
case 1:
ZapGun();
break;
case 2:
MultiZapGun();
break;
case 3:
FreezeRay();
break;
case 4:
LaunchSnark();
break;
}
}
void CHgun::SquidSpit( void )
{
if( ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < 3 ) || ( m_iFirePhase != HGUN_IDLE ) )
{
return;
}
Vector vecSrc, vecDir, vecOrig;
int iSpittle, iSpitSpeed;
TraceResult tr;
// UTIL_MakeVectors( m_pPlayer->pev->v_angle );
// Vector anglesAim = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle;
// UTIL_MakeVectors( anglesAim );
vecOrig = m_pPlayer->GetGunPosition();
vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12;
// vecDir = m_pPlayer->pev->v_angle;
// vecDir = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
vecDir = gpGlobals->v_forward;
UTIL_TraceLine( vecOrig, vecOrig + vecDir * 2048, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
vecDir = ( tr.vecEndPos - vecSrc ).Normalize();
if( m_pPlayer->pev->waterlevel == 3 )
{
iSpittle = 15;
iSpitSpeed = 120;
}
else
{
// CSquidSpit::Shoot( m_pPlayer->edict(), vecSrc, vecDir * 900 );
// CBaseEntity *pSpit = CBaseEntity::Create( "squidspit", vecSrc, vecDir , pev->owner );
BMODSquidSpit::Shoot( m_pPlayer->pev, vecSrc, vecDir * 1100 );
iSpittle = 5;
iSpitSpeed = 80;
}
m_flNextPrimaryAttack = gpGlobals->time + .25;
// spew the spittle temporary ents.
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc );
WRITE_BYTE( TE_SPRITE_SPRAY );
WRITE_COORD( vecSrc.x ); // pos
WRITE_COORD( vecSrc.y );
WRITE_COORD( vecSrc.z );
WRITE_COORD( vecDir.x ); // dir
WRITE_COORD( vecDir.y );
WRITE_COORD( vecDir.z );
WRITE_SHORT( iBSquidSpitSprite ); // model
WRITE_BYTE( iSpittle ); // count
WRITE_BYTE( iSpitSpeed ); // speed
WRITE_BYTE( 25 ); // noise ( client will divide by 100 )
MESSAGE_END();
switch( RANDOM_LONG( 0, 1 ) )
{
case 0:
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "bullchicken/bc_attack2.wav", 1, ATTN_NORM );
break;
case 1:
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "bullchicken/bc_attack3.wav", 1, ATTN_NORM );
break;
}
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= 3;
m_flRechargeTime = gpGlobals->time + 0.5;
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
SendWeaponAnim( HGUN_SHOOT );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT ( 10, 15 );
m_pPlayer->pev->punchangle.x = RANDOM_FLOAT( 0, 2 );
}
void CHgun::LaunchSnark( void )
{
if( ( m_pPlayer->m_rgAmmo[m_pPlayer->GetAmmoIndex( "Snarks" )] < 1 ) || ( m_iFirePhase != HGUN_IDLE ) )
{
return;
}
Vector vecSrc, vecDir, vecOrig;
int iSpittle, iSpitSpeed;
TraceResult tr;
vecOrig = m_pPlayer->GetGunPosition();
vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -12;
// vecDir = m_pPlayer->pev->v_angle;
// vecDir = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
vecDir = gpGlobals->v_forward;
UTIL_TraceLine( vecSrc + gpGlobals->v_forward * 20, vecSrc + gpGlobals->v_forward * 40, dont_ignore_monsters, NULL, &tr );
vecDir = ( tr.vecEndPos - vecSrc ).Normalize();
if( m_pPlayer->pev->waterlevel == 3 )
{
iSpittle = 15;
iSpitSpeed = 120;
}
else
{
CBaseEntity *pSqueak = CBaseEntity::Create( "monster_snark", tr.vecEndPos, m_pPlayer->pev->v_angle, m_pPlayer->edict() );
pSqueak->pev->velocity = gpGlobals->v_forward * 1500 + m_pPlayer->pev->velocity;
( (CSqueakGrenade*)pSqueak )->m_bWasLaunched = TRUE;
EMIT_SOUND_DYN( ENT( pSqueak->pev ), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 105 );
iSpittle = 5;
iSpitSpeed = 80;
}
m_flNextPrimaryAttack = gpGlobals->time + .4;
// spew the spittle temporary ents.
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc );
WRITE_BYTE( TE_SPRITE_SPRAY );
WRITE_COORD( vecSrc.x ); // pos
WRITE_COORD( vecSrc.y );
WRITE_COORD( vecSrc.z );
WRITE_COORD( vecDir.x ); // dir
WRITE_COORD( vecDir.y );
WRITE_COORD( vecDir.z );
WRITE_SHORT( iBSquidSpitSprite ); // model
WRITE_BYTE( iSpittle ); // count
WRITE_BYTE( iSpitSpeed ); // speed
WRITE_BYTE( 25 ); // noise ( client will divide by 100 )
MESSAGE_END();
switch( RANDOM_LONG( 0, 1 ) )
{
case 0:
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "bullchicken/bc_attack2.wav", 1, ATTN_NORM );
break;
case 1:
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "bullchicken/bc_attack3.wav", 1, ATTN_NORM );
break;
}
m_pPlayer->m_rgAmmo[m_pPlayer->GetAmmoIndex( "Snarks" )] -= 1;
m_flRechargeTime = gpGlobals->time + 0.5;
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
SendWeaponAnim( HGUN_SHOOT );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT( 10, 15 );
m_pPlayer->pev->punchangle.x = RANDOM_FLOAT( 0, 2 );
}
void CHgun::OldPrimaryAttack()
{
Reload();
@ -165,7 +980,7 @@ void CHgun::PrimaryAttack() @@ -165,7 +980,7 @@ void CHgun::PrimaryAttack()
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
}
void CHgun::SecondaryAttack( void )
void CHgun::OldSecondaryAttack( void )
{
Reload();
@ -246,10 +1061,11 @@ void CHgun::SecondaryAttack( void ) @@ -246,10 +1061,11 @@ void CHgun::SecondaryAttack( void )
void CHgun::Reload( void )
{
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] >= HORNET_MAX_CARRY )
m_iMaxammo = (bm_hornet_mod.value) ? 12 : 8
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] >= m_iMaxammo )
return;
while( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < HORNET_MAX_CARRY && m_flRechargeTime < gpGlobals->time )
while( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] < m_iMaxammo && m_flRechargeTime < gpGlobals->time )
{
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]++;
m_flRechargeTime += 0.5;
@ -259,6 +1075,9 @@ void CHgun::Reload( void ) @@ -259,6 +1075,9 @@ void CHgun::Reload( void )
void CHgun::WeaponIdle( void )
{
Reload();
m_iFirePhase = HGUN_IDLE;
if( m_iBeams )
ClearBeams();
if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return;

6
dlls/items.cpp

@ -121,6 +121,8 @@ void CItem::ItemTouch( CBaseEntity *pOther ) @@ -121,6 +121,8 @@ void CItem::ItemTouch( CBaseEntity *pOther )
return;
}
pPlayer->BMOD_ResetTypeKill();
if( MyTouch( pPlayer ) )
{
SUB_UseTargets( pOther, USE_TOGGLE, 0 );
@ -226,6 +228,10 @@ class CItemBattery : public CItem @@ -226,6 +228,10 @@ class CItemBattery : public CItem
char szcharge[64];
pPlayer->pev->armorvalue += gSkillData.batteryCapacity;
if( pPlayer->m_RuneFlags == RUNE_BATTERY )
pPlayer->pev->armorvalue += gSkillData.batteryCapacity;
pPlayer->pev->armorvalue = min( pPlayer->pev->armorvalue, MAX_NORMAL_BATTERY );
EMIT_SOUND( pPlayer->edict(), CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_NORM );

40
dlls/mp5.cpp

@ -35,6 +35,10 @@ enum mp5_e @@ -35,6 +35,10 @@ enum mp5_e
MP5_FIRE3
};
// BMOD Edit - mp5 mod
extern cvar_t bm_mp5_mod;
#include "BMOD_messaging.h"
LINK_ENTITY_TO_CLASS( weapon_mp5, CMP5 )
LINK_ENTITY_TO_CLASS( weapon_9mmAR, CMP5 )
@ -92,7 +96,15 @@ int CMP5::GetItemInfo( ItemInfo *p ) @@ -92,7 +96,15 @@ int CMP5::GetItemInfo( ItemInfo *p )
p->pszAmmo1 = "9mm";
p->iMaxAmmo1 = _9MM_MAX_CARRY;
p->pszAmmo2 = "ARgrenades";
p->iMaxAmmo2 = M203_GRENADE_MAX_CARRY;
// BMOD Begin - mp5 mod
// p->iMaxAmmo2 = M203_GRENADE_MAX_CARRY;
if( bm_mp5_mod.value )
p->iMaxAmmo2 = 5;
else
p->iMaxAmmo2 = 10;
// BMOD End - mp5 mod
p->iMaxClip = MP5_MAX_CLIP;
p->iSlot = 2;
p->iPosition = 0;
@ -117,6 +129,12 @@ int CMP5::AddToPlayer( CBasePlayer *pPlayer ) @@ -117,6 +129,12 @@ int CMP5::AddToPlayer( CBasePlayer *pPlayer )
BOOL CMP5::Deploy()
{
// BMOD Begin - mp5 mod
if( bm_mp5_mod.value )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "MP5\nContact grenade damage is lowered.\nGrenade carry capacity is 5." );
// BMOD End - mp5 mod
return DefaultDeploy( "models/v_9mmAR.mdl", "models/p_9mmAR.mdl", MP5_DEPLOY, "mp5" );
}
@ -228,7 +246,14 @@ void CMP5::SecondaryAttack( void ) @@ -228,7 +246,14 @@ void CMP5::SecondaryAttack( void )
PLAYBACK_EVENT( flags, m_pPlayer->edict(), m_usMP52 );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1;
// BMOD Begin - mp5 mod
if( bm_mp5_mod.value )
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.5;
else
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1;
// BMOD End - mp5 mod
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5;// idle pretty soon after shooting.
if( !m_pPlayer->m_rgAmmo[m_iSecondaryAmmoType] )
@ -338,7 +363,16 @@ class CMP5AmmoGrenade : public CBasePlayerAmmo @@ -338,7 +363,16 @@ class CMP5AmmoGrenade : public CBasePlayerAmmo
}
BOOL AddAmmo( CBaseEntity *pOther )
{
int bResult = ( pOther->GiveAmmo( AMMO_M203BOX_GIVE, "ARgrenades", M203_GRENADE_MAX_CARRY ) != -1 );
//int bResult = ( pOther->GiveAmmo( AMMO_M203BOX_GIVE, "ARgrenades", M203_GRENADE_MAX_CARRY ) != -1 );
// BMOD Begin - mp5 mod
int bResult;
if( bm_mp5_mod.value )
bResult = ( pOther->GiveAmmo( 1, "ARgrenades", 5 ) != -1 );
else
bResult = ( pOther->GiveAmmo( 2, "ARgrenades", 10 ) != -1 );
// BMOD End - mp5 mod
if( bResult )
{

393
dlls/multiplay_gamerules.cpp

@ -22,10 +22,11 @@ @@ -22,10 +22,11 @@
#include "player.h"
#include "weapons.h"
#include "gamerules.h"
#include "monsters.h"
#include "skill.h"
#include "game.h"
#include "items.h"
#include "BMOD_hornetgun.h"
#ifndef NO_VOICEGAMEMGR
#include "voice_gamemgr.h"
#endif
@ -38,8 +39,13 @@ extern int gmsgScoreInfo; @@ -38,8 +39,13 @@ extern int gmsgScoreInfo;
extern int gmsgMOTD;
extern int gmsgServerName;
extern cvar_t bm_bantime;
extern cvar_t bm_matchkills;
extern int g_teamplay;
extern edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer );
#define ITEM_RESPAWN_TIME 30
#define WEAPON_RESPAWN_TIME 20
#define AMMO_RESPAWN_TIME 20
@ -79,6 +85,9 @@ CHalfLifeMultiplay::CHalfLifeMultiplay() @@ -79,6 +85,9 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
RefreshSkillData();
m_flIntermissionEndTime = 0;
g_flIntermissionStartTime = 0;
// BMOD Edit - Precalculate the bm_map and bm_nextmap vars
BMOD_PreChangeLevel();
// 11/8/98
// Modified by YWB: Server .cfg file is now a cvar, so that
@ -117,6 +126,23 @@ CHalfLifeMultiplay::CHalfLifeMultiplay() @@ -117,6 +126,23 @@ CHalfLifeMultiplay::CHalfLifeMultiplay()
SERVER_COMMAND( szCommand );
}
}
// BMOD Config files
char bmodcfgfile[81];
strcpy( bmodcfgfile, CVAR_GET_STRING( "bm_map" ) );
strcat( bmodcfgfile, ".cfg" );
if( bmodcfgfile && bmodcfgfile[0] )
{
char szCommand[256];
ALERT( at_console, "Executing map config file\n" );
sprintf( szCommand, "exec maps/%s\n", bmodcfgfile );
SERVER_COMMAND( szCommand );
}
// BMOD Init save slots.
UTIL_SaveRestorePlayer( NULL, 0, 1 );
}
BOOL CHalfLifeMultiplay::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
@ -203,6 +229,9 @@ void CHalfLifeMultiplay::Think( void ) @@ -203,6 +229,9 @@ void CHalfLifeMultiplay::Think( void )
int frags_remaining = 0;
int time_remaining = 0;
// BMOD Edit - Extra Game Think stuff
BMOD_Think();
if( g_fGameOver ) // someone else quit the game already
{
// bounds check
@ -311,6 +340,13 @@ BOOL CHalfLifeMultiplay::FShouldSwitchWeapon( CBasePlayer *pPlayer, CBasePlayerI @@ -311,6 +340,13 @@ BOOL CHalfLifeMultiplay::FShouldSwitchWeapon( CBasePlayer *pPlayer, CBasePlayerI
return FALSE;
}
// BMOD - if this player is typing, dont switch weapons
if( pPlayer->BMOD_IsTyping() )
{
return FALSE;
}
// BMOD
if( !pPlayer->m_pActiveItem )
{
// player doesn't have an active item!
@ -478,6 +514,10 @@ void CHalfLifeMultiplay::InitHUD( CBasePlayer *pl ) @@ -478,6 +514,10 @@ void CHalfLifeMultiplay::InitHUD( CBasePlayer *pl )
MESSAGE_BEGIN( MSG_ONE, SVC_INTERMISSION, NULL, pl->edict() );
MESSAGE_END();
}
// BMOD Begin - extra gamerules InitHUD
BMOD_InitHUD( pl );
// BMOD End - extra gamerules InitHUD
}
//=========================================================
@ -511,6 +551,10 @@ void CHalfLifeMultiplay::ClientDisconnected( edict_t *pClient ) @@ -511,6 +551,10 @@ void CHalfLifeMultiplay::ClientDisconnected( edict_t *pClient )
}
pPlayer->RemoveAllItems( TRUE );// destroy all of the players weapons and items
// BMOD Begin - extra client disconnect
BMOD_ClientDisconnected( pClient, pPlayer );
// BMOD End - extra client disconnect
}
}
}
@ -540,6 +584,10 @@ float CHalfLifeMultiplay::FlPlayerFallDamage( CBasePlayer *pPlayer ) @@ -540,6 +584,10 @@ float CHalfLifeMultiplay::FlPlayerFallDamage( CBasePlayer *pPlayer )
//=========================================================
BOOL CHalfLifeMultiplay::FPlayerCanTakeDamage( CBasePlayer *pPlayer, CBaseEntity *pAttacker )
{
// BMOD Edit - Freeze ray
if( pPlayer->m_flFreezeTime > 0 )
return FALSE;
return TRUE;
}
@ -569,9 +617,13 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer ) @@ -569,9 +617,13 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer )
pPlayer->pev->weapons |= ( 1 << WEAPON_SUIT );
addDefault = TRUE;
// BMOD Begin - extra Playerspawn stuff
BMOD_PlayerSpawn( pPlayer );
// BMOD End - extra Playerspawn stuff
while( ( pWeaponEntity = UTIL_FindEntityByClassname( pWeaponEntity, "game_player_equip" ) ) )
addDefault = pPlayer->IsObserver() ? FALSE : TRUE;
while( !addDefault && ( pWeaponEntity = UTIL_FindEntityByClassname( pWeaponEntity, "game_player_equip" ) ) )
{
pWeaponEntity->Touch( pPlayer );
addDefault = FALSE;
@ -579,10 +631,27 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer ) @@ -579,10 +631,27 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer )
if( addDefault )
{
pPlayer->GiveNamedItem( "weapon_crowbar" );
/*pPlayer->GiveNamedItem( "weapon_crowbar" );
pPlayer->GiveNamedItem( "weapon_9mmhandgun" );
pPlayer->GiveAmmo( 68, "9mm", _9MM_MAX_CARRY );// 4 full reloads
}
*/
// BMOD Begin - Starting weapons
//pPlayer->GiveNamedItem( "weapon_crowbar" );
//pPlayer->GiveNamedItem( "weapon_9mmhandgun" );
//pPlayer->GiveAmmo( GLOCK_MAX_CLIP * 2, "9mm", _9MM_MAX_CARRY );// 2 full reloads
//pPlayer->GiveNamedItem( "weapon_357" );
// pPlayer->GiveNamedItem( "weapon_rpg" );
//pPlayer->GiveAmmo( PYTHON_MAX_CLIP * 2, "357", _357_MAX_CARRY );// 2 full reloads
// BMOD End - Starting weapons
BMOD_GiveGunsAndAmmo( pPlayer );
//pPlayer->SelectItem( "weapon_9mmhandgun" );
}
// BMOD Edit - spawn kills
pPlayer->m_fSpawnTimeStamp = gpGlobals->time + .1;
pPlayer->pev->rendermode = kRenderTransAdd;
pPlayer->pev->renderfx = kRenderFxHologram;
pPlayer->pev->renderamt = 255;
}
//=========================================================
@ -646,6 +715,30 @@ void CHalfLifeMultiplay::PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller, @@ -646,6 +715,30 @@ void CHalfLifeMultiplay::PlayerKilled( CBasePlayer *pVictim, entvars_t *pKiller,
pKiller->frags -= 1;
}
// BMOD Begin - Llamas do not count!
if( peKiller && peKiller != pVictim && pVictim->m_IsLlama )
{
pVictim->m_iDeaths -= 1;
pKiller->frags -= IPointsForKill( peKiller, pVictim );
}
// BMOD End - Llamas do not count!
// BMOD Begin - spawn kills do not count!
if( peKiller && peKiller != pVictim && pVictim->BMOD_WasSpawnKilled() )
{
pVictim->m_iDeaths -= 1;
pKiller->frags -= IPointsForKill( peKiller, pVictim );
}
// BMOD End - spawn kills do not count!
// BMOD Begin - type kills do not count!
if( peKiller && peKiller != pVictim && pVictim->BMOD_WasTypeKilled() )
{
pVictim->m_iDeaths -= 1;
pKiller->frags -= IPointsForKill( peKiller, pVictim );
}
// BMOD End - type kills do not count!
// update the scores
// killed scores
MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
@ -690,11 +783,48 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, @@ -690,11 +783,48 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller,
CBaseEntity *Killer = CBaseEntity::Instance( pKiller );
const char *killer_weapon_name = "world"; // by default, the player is killed by the world
const char *killer_weapon_name_client = "world"; // by default, the player is killed by the world
int killer_index = 0;
// Hack to fix name change
char *tau = "tau_cannon";
char *gluon = "gluon gun";
char *grenade = "grenade";
char *zapgun = "zapgun";
char *multizapper = "multizapper";
char *squidspit = "squidspit";
char *freezeray = "freezeray";
char *snarklauncher = "snarklauncher";
char keyvalues[81] = "";
switch( pVictim->m_LastHitGroup )
{
case HITGROUP_HEAD:
strcat( keyvalues, " (location \"head\")" );
break;
case HITGROUP_CHEST:
strcat( keyvalues, " (location \"chest\")" );
break;
case HITGROUP_STOMACH:
strcat( keyvalues, " (location \"stomach\")" );
break;
case HITGROUP_LEFTARM:
strcat( keyvalues, " (location \"left arm\")" );
break;
case HITGROUP_RIGHTARM:
strcat( keyvalues, " (location \"right arm\")" );
break;
case HITGROUP_LEFTLEG:
strcat( keyvalues, " (location \"left leg\")" );
break;
case HITGROUP_RIGHTLEG:
strcat( keyvalues, " (location \"right leg\")" );
break;
default:
strcat( keyvalues, " (location \"generic\")" );
break;
};
if( pKiller->flags & FL_CLIENT )
{
@ -731,10 +861,43 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, @@ -731,10 +861,43 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller,
else if( strncmp( killer_weapon_name, "func_", 5 ) == 0 )
killer_weapon_name += 5;
if( !strcmp( killer_weapon_name, "hornetgun" ) && bm_hornet_mod.value )
{
//CHgun* gun = (CHgun*)CBaseEntity::Instance( pKiller );
//UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> Firemode: %i.\n",
// gun->m_iFireMode
// ) );
switch( ( ( (CHgun*)( (CBasePlayerWeapon*)( (CBasePlayer*)CBaseEntity::Instance( pKiller ) )->m_pActiveItem ) )->m_iFireMode ) )
{
case 0:
killer_weapon_name = squidspit;
break;
case 1:
killer_weapon_name = zapgun;
break;
case 2:
killer_weapon_name = multizapper;
break;
case 3:
killer_weapon_name = freezeray;
break;
case 4:
killer_weapon_name = snarklauncher;
break;
default:
break;
}
}
killer_weapon_name_client = killer_weapon_name;
if( !strcmp( killer_weapon_name_client, "hand_grenade" ) )
killer_weapon_name_client = grenade;
MESSAGE_BEGIN( MSG_ALL, gmsgDeathMsg );
WRITE_BYTE( killer_index ); // the killer
WRITE_BYTE( ENTINDEX( pVictim->edict() ) ); // the victim
WRITE_STRING( killer_weapon_name ); // what they were killed by (should this be a string?)
WRITE_STRING( killer_weapon_name_client ); // what they were killed by (should this be a string?)
MESSAGE_END();
// replace the code names with the 'real' names
@ -769,10 +932,212 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, @@ -769,10 +932,212 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller,
}
else if( pKiller->flags & FL_CLIENT )
{
( (CBasePlayer *)Killer )->m_iKillsThisFrame++;
// BMOD Begin - Spawn kills
if( pVictim->BMOD_WasSpawnKilled() && strcmp( killer_weapon_name, "tripmine" ) )
{
strcat( keyvalues, " (spawn)" );
( (CBasePlayer *)Killer )->m_iKillsThisFrame--;
( (CBasePlayer *)Killer )->m_iSpawnKills++;
char szKills[81] = "";
int iLeft = (int)bm_maxspawnkills.value - (int)( (CBasePlayer *)Killer )->m_iSpawnKills;
if( bm_maxspawnkills.value )
{
if( iLeft > 0 )
{
sprintf( szKills, "(%d more and you're banned)", iLeft );
}
}
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "%s is a spawn-killing ninny! No points! %s\n", STRING( pKiller->netname ), szKills ) );
if( bm_maxspawnkills.value && iLeft < 1 )
{
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %s was banned %d minutes for spawn-killing.\n",
STRING( pKiller->netname ), (int)bm_bantime.value ) );
UTIL_LogPrintf( "\"SERVER<-1><-1><>\" say \"%s was banned %d minutes for spawn-killing.\"\n",
STRING( pKiller->netname ), (int)bm_bantime.value);
UTIL_LogPrintf( "// \"%s<%i><%s><%s>\" was banned %d mins for spawn-killing.\n",
STRING( pKiller->netname ),
GETPLAYERUSERID( ENT( pKiller ) ),
GETPLAYERAUTHID( ENT( pKiller ) ),
g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( ENT( pKiller ) ), "model" ),
(int)bm_bantime.value );
( (CBasePlayer *)Killer )->m_bBanMe = TRUE;
( (CBasePlayer *)Killer )->m_fMessageTimer = gpGlobals->time + .1;
}
}
// BMOD End - Spawn kills
// BMOD Begin - Type kills
if( pVictim->BMOD_WasTypeKilled() )
{
strcat( keyvalues, " (typekill)" );
( (CBasePlayer *)Killer )->m_iKillsThisFrame--;
( (CBasePlayer *)Killer )->m_iTypeKills++;
char szKills[81] = "";
int iLeft = (int)bm_maxtypekills.value - (int)( (CBasePlayer *)Killer )->m_iTypeKills;
if( bm_maxtypekills.value )
{
if( iLeft > 0 )
{
sprintf( szKills, "(%d more and you're banned)", iLeft );
}
}
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "%s is a type-killing lamer! No points! %s\n",
STRING( pKiller->netname ), szKills ) );
if( bm_maxtypekills.value && iLeft < 1 )
{
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "<SERVER> %s was banned %d minutes for type-killing.\n",
STRING( pKiller->netname ), (int)bm_bantime.value ) );
UTIL_LogPrintf( "\"SERVER<-1><-1><>\" say \"%s was banned %d minutes for type-killing.\"\n",
STRING( pKiller->netname ), (int)bm_bantime.value );
UTIL_LogPrintf( "// \"%s<%i><%s><%s>\" was banned %d mins for type-killing.\n",
STRING( pKiller->netname ),
GETPLAYERUSERID( ENT( pKiller ) ),
GETPLAYERAUTHID( ENT( pKiller ) ),
g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( ENT( pKiller ) ), "model" ),
(int)bm_bantime.value );
( (CBasePlayer *)Killer )->m_bBanMe = TRUE;
( (CBasePlayer *)Killer )->m_fMessageTimer = gpGlobals->time + .1;
}
}
// BMOD End - Type kills
// BMOD Start - match kills.
// tag kills where killer matched weapons with victim.
if( bm_matchkills.value && strcmp( killer_weapon_name, "tripmine" ) && strcmp( killer_weapon_name, "snark" ) &&
( pVictim->m_pActiveItem &&
( (CBasePlayer *)Killer )->m_pActiveItem &&
!strcmp( STRING( ( (CBasePlayer *)Killer )->m_pActiveItem->pev->classname ),
STRING( pVictim->m_pActiveItem->pev->classname ) ) &&
( (CBasePlayer *)Killer )->m_RuneFlags == RUNE_NONE )
|| // OR...
( !strcmp( killer_weapon_name, "flying_crowbar" ) &&
( !pVictim->m_pActiveItem ||
!strcmp( STRING( pVictim->m_pActiveItem->pev->classname ),
"weapon_crowbar" ) ) )
|| // OR...
( !pVictim->m_pActiveItem &&
( (CBasePlayer *)Killer )->m_pActiveItem &&
!strcmp( STRING( ( (CBasePlayer *)Killer )->m_pActiveItem->pev->classname ),
"weapon_crowbar" ) ) )
{
strcat(keyvalues, " (match)" );
ClientPrint( ( (CBasePlayer *)Killer )->pev, HUD_PRINTNOTIFY, "Match kill!\n" );
}
// BMOD End - match kills.
// BMOD Start - log opponent gun
// tag kills where killer matched weapons with victim.
if( !pVictim->m_pActiveItem )
{
strcat( keyvalues, " (defgun \"flying_crowbar\")" );
}
else
{
const char *weapon_name;
weapon_name = STRING( pVictim->m_pActiveItem->pev->classname );
// Hack to fix name change
char *tau = "tau_cannon";
char *gluon = "gluon gun";
char *zapgun = "zapgun";
char *multizapper = "multizapper";
char *squidspit = "squidspit";
char *freezeray = "freezeray";
char *snarklauncher = "snarklauncher";
char *rpg = "rpg_rocket";
char *hand_grenade = "hand_grenade";
// strip the monster_* or weapon_* from the classname
if( strncmp( weapon_name, "weapon_", 7 ) == 0 )
weapon_name += 7;
else if( strncmp( weapon_name, "monster_", 8 ) == 0 )
weapon_name += 8;
else if( strncmp( weapon_name, "func_", 5 ) == 0 )
weapon_name += 5;
// fix some names for better matches.
if( !strcmp( weapon_name, "egon" ) )
weapon_name = gluon;
else if( !strcmp( weapon_name, "gauss" ) )
weapon_name = tau;
else if( !strcmp( weapon_name, "rpg" ) )
weapon_name = rpg;
else if( !strcmp( weapon_name, "handgrenade" ) )
weapon_name = hand_grenade;
else if( !strcmp( weapon_name, "hornetgun" ) && bm_hornet_mod.value )
{
//weapon_name = zapgun;
switch( ( ( (CHgun*)( (CBasePlayerWeapon*)pVictim->m_pActiveItem ) )->m_iFireMode ) )
{
case 0:
weapon_name = squidspit;
break;
case 1:
weapon_name = zapgun;
break;
case 2:
weapon_name = multizapper;
break;
case 3:
weapon_name = freezeray;
break;
case 4:
weapon_name = snarklauncher;
break;
default:
break;
}
}
strcat( keyvalues, UTIL_VarArgs( " (defgun \"%s\")", weapon_name ) );
}
// BMOD End - log opponent gun
// BMOD Start - Log runes
if( ( (CBasePlayer *)Killer )->m_RuneFlags )
{
strcat( keyvalues, " (rune \"" );
switch( ( (CBasePlayer *)Killer )->m_RuneFlags )
{
case RUNE_CROWBAR:
strcat( keyvalues, "crowbar" );
break;
case RUNE_HEALTH:
strcat( keyvalues, "health" );
break;
case RUNE_BATTERY:
strcat( keyvalues, "armor" );
break;
case RUNE_357:
strcat( keyvalues, "357" );
break;
case RUNE_SHOTGUN:
strcat( keyvalues, "shotgun" );
break;
case RUNE_GRENADE:
strcat( keyvalues, "grenade" );
break;
}
strcat( keyvalues, "\")" );
}
// BMOD End - Log runes
// BMOD Llamas don't count.
if( pVictim->m_IsLlama )
return;
// team match?
if( g_teamplay )
{
UTIL_LogPrintf( "\"%s<%i><%s><%s>\" killed \"%s<%i><%s><%s>\" with \"%s\"\n",
UTIL_LogPrintf( "\"%s<%i><%s><%s>\" killed \"%s<%i><%s><%s>\" with \"%s\"%s\n",
STRING( pKiller->netname ),
GETPLAYERUSERID( ENT(pKiller) ),
GETPLAYERAUTHID( ENT(pKiller) ),
@ -781,11 +1146,11 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, @@ -781,11 +1146,11 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller,
GETPLAYERUSERID( pVictim->edict() ),
GETPLAYERAUTHID( pVictim->edict() ),
g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pVictim->edict() ), "model" ),
killer_weapon_name );
killer_weapon_name, keyvalues );
}
else
{
UTIL_LogPrintf( "\"%s<%i><%s><%i>\" killed \"%s<%i><%s><%i>\" with \"%s\"\n",
UTIL_LogPrintf( "\"%s<%i><%s><%i>\" killed \"%s<%i><%s><%i>\" with \"%s\"%s\n",
STRING( pKiller->netname ),
GETPLAYERUSERID( ENT(pKiller) ),
GETPLAYERAUTHID( ENT(pKiller) ),
@ -794,13 +1159,12 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller, @@ -794,13 +1159,12 @@ void CHalfLifeMultiplay::DeathNotice( CBasePlayer *pVictim, entvars_t *pKiller,
GETPLAYERUSERID( pVictim->edict() ),
GETPLAYERAUTHID( pVictim->edict() ),
GETPLAYERUSERID( pVictim->edict() ),
killer_weapon_name );
killer_weapon_name, keyvalues );
}
}
else
{
// killed by the world
// team match?
if( g_teamplay )
{
@ -1449,7 +1813,9 @@ int CountPlayers( void ) @@ -1449,7 +1813,9 @@ int CountPlayers( void )
{
CBaseEntity *pEnt = UTIL_PlayerByIndex( i );
if( pEnt )
// BMOD Edit - Only count connected players.
//if( pEnt )
if( pEnt && ( !FNullEnt( pEnt->edict() ) ) && pEnt->m_bIsConnected )
{
num = num + 1;
}
@ -1520,6 +1886,7 @@ ChangeLevel @@ -1520,6 +1886,7 @@ ChangeLevel
Server is changing to a new level, check mapcycle.txt for map name and setup info
==============
*/
/*
void CHalfLifeMultiplay::ChangeLevel( void )
{
static char szPreviousMapCycleFile[256];
@ -1646,7 +2013,7 @@ void CHalfLifeMultiplay::ChangeLevel( void ) @@ -1646,7 +2013,7 @@ void CHalfLifeMultiplay::ChangeLevel( void )
SERVER_COMMAND( szCommands );
}
}
*/
#define MAX_MOTD_CHUNK 60
#define MAX_MOTD_LENGTH 1536 // (MAX_MOTD_CHUNK * 4)

170
dlls/player.cpp

@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
#include "decals.h"
#include "gamerules.h"
#include "game.h"
#include "BMOD_rune.h"
#include "hltv.h"
// #define DUCKFIX
@ -43,7 +44,9 @@ extern DLL_GLOBAL BOOL g_fGameOver; @@ -43,7 +44,9 @@ extern DLL_GLOBAL BOOL g_fGameOver;
extern DLL_GLOBAL BOOL g_fDrawLines;
int gEvilImpulse101;
extern DLL_GLOBAL int g_iSkillLevel, gDisplayTitle;
extern DLL_GLOBAL BOOL g_runes_exist;
extern cvar_t bm_dmg_messages;
BOOL gInitHUD = TRUE;
extern void CopyToBodyQue( entvars_t *pev);
@ -183,6 +186,7 @@ int gmsgTeamNames = 0; @@ -183,6 +186,7 @@ int gmsgTeamNames = 0;
int gmsgStatusText = 0;
int gmsgStatusValue = 0;
int gmsgSpectator = 0;
void LinkUserMessages( void )
{
@ -225,6 +229,7 @@ void LinkUserMessages( void ) @@ -225,6 +229,7 @@ void LinkUserMessages( void )
gmsgFade = REG_USER_MSG( "ScreenFade", sizeof(ScreenFade) );
gmsgAmmoX = REG_USER_MSG( "AmmoX", 2 );
gmsgTeamNames = REG_USER_MSG( "TeamNames", -1 );
gmsgSpectator = REG_USER_MSG( "Spectator", 2 );
gmsgStatusText = REG_USER_MSG( "StatusText", -1 );
gmsgStatusValue = REG_USER_MSG( "StatusValue", 3 );
@ -456,6 +461,9 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl @@ -456,6 +461,9 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl
return 0;
}
float flArmor = 0;
float flArmorDone = 0;
// keep track of amount of damage last sustained
m_lastDamageAmount = flDamage;
@ -464,8 +472,6 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl @@ -464,8 +472,6 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl
{
float flNew = flDamage * flRatio;
float flArmor;
flArmor = ( flDamage - flNew ) * flBonus;
// Does this use more armor than we have?
@ -474,14 +480,45 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl @@ -474,14 +480,45 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl
flArmor = pev->armorvalue;
flArmor *= ( 1 / flBonus );
flNew = flDamage - flArmor;
flArmorDone = pev->armorvalue;
pev->armorvalue = 0;
}
else
{
pev->armorvalue -= flArmor;
flArmorDone = pev->armorvalue;
}
flDamage = flNew;
}
char AttackerText[128];
char DefenderText[128];
char HitGroup[128] = "";
if( m_LastHitGroup == HITGROUP_HEAD )
strcpy( HitGroup, "HEADSHOT!" );
if( bm_dmg_messages.value > 0 )
{
if( pAttacker == this )
{
sprintf( DefenderText, "Did %i/%i damage to yourself. %s\n", (int)flDamage, (int)flArmorDone, HitGroup );
ClientPrint( pev, HUD_PRINTNOTIFY, DefenderText );
}
else if( pAttacker->IsPlayer() )
{
sprintf( DefenderText, "Took %i/%i damage from %s. %s\n", (int)flDamage, (int)flArmorDone, STRING( pAttacker->pev->netname ), HitGroup );
sprintf( AttackerText, "Did %i/%i damage to %s. %s\n", (int)flDamage, (int)flArmorDone, STRING( pev->netname ), HitGroup );
ClientPrint( pev, HUD_PRINTNOTIFY, DefenderText );
ClientPrint( pAttacker->pev, HUD_PRINTNOTIFY, AttackerText );
}
else
{
sprintf( DefenderText, "Took %i/%i damage.\n", (int)flDamage, (int)flArmorDone );
ClientPrint( pev, HUD_PRINTNOTIFY, DefenderText );
}
}
// this cast to INT is critical!!! If a player ends up with 0.5 health, the engine will get that
// as an int (zero) and think the player is dead! (this will incite a clientside screentilt, etc)
fTookDamage = CBaseMonster::TakeDamage( pevInflictor, pevAttacker, (int)flDamage, bitsDamageType );
@ -671,7 +708,7 @@ void CBasePlayer::PackDeadPlayerItems( void ) @@ -671,7 +708,7 @@ void CBasePlayer::PackDeadPlayerItems( void )
iWeaponRules = g_pGameRules->DeadPlayerWeapons( this );
iAmmoRules = g_pGameRules->DeadPlayerAmmo( this );
if( iWeaponRules == GR_PLR_DROP_GUN_NO && iAmmoRules == GR_PLR_DROP_AMMO_NO )
if( ( iWeaponRules == GR_PLR_DROP_GUN_NO && iAmmoRules == GR_PLR_DROP_AMMO_NO ) || BMOD_WasTypeKilled() )
{
// nothing to pack. Remove the weapons and return. Don't call create on the box!
RemoveAllItems( TRUE );
@ -897,6 +934,34 @@ void CBasePlayer::Killed( entvars_t *pevAttacker, int iGib ) @@ -897,6 +934,34 @@ void CBasePlayer::Killed( entvars_t *pevAttacker, int iGib )
pev->solid = SOLID_NOT;
GibMonster(); // This clears pev->model
pev->effects |= EF_NODRAW;
if( ( RANDOM_LONG( 0, 100 ) < 15 ) || ( m_LastHitGroup == HITGROUP_HEAD ) )
{
switch( RANDOM_LONG( 0, 6 ) )
{
case 0:
UTIL_SpeakAll( "buzwarn buzwarn, cleanup in sector alpha" );
break;
case 1:
UTIL_SpeakAll( "buzwarn buzwarn, cleanup in sector zulu" );
break;
case 2:
UTIL_SpeakAll( "buzwarn buzwarn, cleanup in sector delta" );
break;
case 3:
UTIL_SpeakAll( "buzwarn buzwarn, cleanup in sector thirteen" );
break;
case 4:
UTIL_SpeakAll( "buzwarn buzwarn, cleanup in sector b" );
break;
case 5:
UTIL_SpeakAll( "buzwarn buzwarn, cleanup in sector c" );
break;
case 6:
UTIL_SpeakAll( "buzwarn buzwarn, cleanup in sector d" );
break;
}
}
return;
}
@ -1231,6 +1296,18 @@ void CBasePlayer::PlayerDeathThink( void ) @@ -1231,6 +1296,18 @@ void CBasePlayer::PlayerDeathThink( void )
{
float flForward;
// BMOD Begin - Freeze Ray
if( m_flFreezeTime > 0 )
{
EnableControl( TRUE );
pev->rendermode = kRenderNormal;
pev->renderfx = kRenderFxNone;
pev->renderamt = 0;
m_flFreezeTime = 0;
}
// BMOD End - Freeze Ray
if( FBitSet( pev->flags, FL_ONGROUND ) )
{
flForward = pev->velocity.Length() - 20;
@ -1264,8 +1341,16 @@ void CBasePlayer::PlayerDeathThink( void ) @@ -1264,8 +1341,16 @@ void CBasePlayer::PlayerDeathThink( void )
pev->movetype = MOVETYPE_NONE;
if( pev->deadflag == DEAD_DYING )
{
pev->deadflag = DEAD_DEAD;
// Fix for spinning corpses.
StopAnimation();
pev->effects |= EF_NOINTERP;
pev->framerate = 0.0;
CopyToBodyQue( pev );
pev->effects |= EF_NODRAW;
}
StopAnimation();
pev->effects |= EF_NOINTERP;
@ -1344,20 +1429,22 @@ void CBasePlayer::StartDeathCam( void ) @@ -1344,20 +1429,22 @@ void CBasePlayer::StartDeathCam( void )
iRand--;
}
CopyToBodyQue( pev );
//CopyToBodyQue( pev );
StartObserver( pSpot->v.origin, pSpot->v.v_angle );
}
else
{
// no intermission spot. Push them up in the air, looking down at their corpse
TraceResult tr;
CopyToBodyQue( pev );
//CopyToBodyQue( pev );
UTIL_TraceLine( pev->origin, pev->origin + Vector( 0, 0, 128 ), ignore_monsters, edict(), &tr );
StartObserver( tr.vecEndPos, UTIL_VecToAngles( tr.vecEndPos - pev->origin ) );
return;
}
}
// Replaced by BMOD Observer code
/*
void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
{
m_afPhysicsFlags |= PFLAG_OBSERVER;
@ -1371,7 +1458,7 @@ void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle ) @@ -1371,7 +1458,7 @@ void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
pev->modelindex = 0;
UTIL_SetOrigin( pev, vecPosition );
}
*/
//
// PlayerUse - handles USE keypress
//
@ -1745,6 +1832,19 @@ void CBasePlayer::PreThink( void ) @@ -1745,6 +1832,19 @@ void CBasePlayer::PreThink( void )
CheckTimeBasedDamage();
m_iMessageFire = FALSE;
BMOD_Think();
// BMOD Begin - Extra Player Prethink
BMOD_Identify();
if( IsObserver() )
{
Observer_HandleButtons();
return;
}
BMOD_PreThink();
// BMOD End - Extra Player Prethink
CheckSuitUpdate();
if( pev->deadflag >= DEAD_DYING )
@ -2563,6 +2663,8 @@ pt_end: @@ -2563,6 +2663,8 @@ pt_end:
#else
return;
#endif
// BMOD
BMOD_PostThink();
}
// checks if the spot is clear of players
@ -2775,6 +2877,60 @@ void CBasePlayer::Spawn( void ) @@ -2775,6 +2877,60 @@ void CBasePlayer::Spawn( void )
m_flNextChatTime = gpGlobals->time;
// BMOD Begin - Extra Player Spawn
m_hObserverTarget = NULL;
m_flFreezeTime = 0;
m_RuneFlags = RUNE_NONE;
pev->rendermode = kRenderNormal;
pev->renderfx = kRenderFxNone;
pev->renderamt = 0;
//m_LocateMode = FALSE;
//m_LeetSpeak = FALSE;
// Spawn Runes
if (!g_runes_exist)
{
g_runes_exist = true;
CBaseEntity *pSpot = NULL;
do
pSpot = UTIL_FindEntityByClassname( pSpot, "info_player_deathmatch" );
while( !pSpot );
// Spawn random runes
for( int i = 0; i < CVAR_GET_FLOAT( "bm_rune_rand" ); i++ )
{
CRune *rune = (CRune *)CBaseEntity::Create( "item_CrowbarRune", pSpot->pev->origin, Vector( 0, 0, 0 ), edict() );
rune->m_randomize = TRUE;
rune->Respawn();
}
// Spawn crowbar runes
for( i = 0; i < CVAR_GET_FLOAT( "bm_rune_cbar" ); i++ )
CBaseEntity::Create( "item_CrowbarRune", pSpot->pev->origin, Vector( 0, 0, 0 ), edict() );
// Spawn grenade runes
for( i = 0; i < CVAR_GET_FLOAT( "bm_rune_gren" ); i++ )
CBaseEntity::Create( "item_GrenadeRune", pSpot->pev->origin, Vector( 0, 0, 0 ), edict() );
// Spawn 357 runes
for( i = 0; i < CVAR_GET_FLOAT( "bm_rune_357" ); i++ )
CBaseEntity::Create( "item_357Rune", pSpot->pev->origin, Vector( 0, 0, 0 ), edict() );
// Spawn health runes
for( i = 0; i < CVAR_GET_FLOAT( "bm_rune_health" ); i++ )
CBaseEntity::Create( "item_HealthRune", pSpot->pev->origin, Vector( 0, 0, 0 ), edict() );
// Spawn armor runes
for( i = 0; i < CVAR_GET_FLOAT( "bm_rune_armor" ); i++ )
CBaseEntity::Create( "item_BatteryRune", pSpot->pev->origin, Vector( 0, 0, 0 ), edict() );
// Spawn shotgun runes
for( i = 0; i < CVAR_GET_FLOAT( "bm_rune_shotty" ); i++ )
CBaseEntity::Create( "item_ShotgunRune", pSpot->pev->origin, Vector( 0, 0, 0 ), edict() );
}
// BMOD End - Extra Player Spawn
g_pGameRules->PlayerSpawn( this );
}

52
dlls/player.h

@ -15,6 +15,8 @@ @@ -15,6 +15,8 @@
#ifndef PLAYER_H
#define PLAYER_H
#include "BMOD_player.h"
#include "pm_materials.h"
#define PLAYER_FATAL_FALL_SPEED 1024// approx 60 feet
@ -308,6 +310,56 @@ public: @@ -308,6 +310,56 @@ public:
char m_SbarString1[ SBAR_STRING_SIZE ];
float m_flNextChatTime;
// BMOD Begin - extra player functions
void StopObserver( void );
void Observer_FindNextPlayer( bool bReverse );
void Observer_HandleButtons();
void Observer_SetMode( int iMode );
int IsObserver() { return pev->iuser1; };
void BMOD_PreThink(void);
void BMOD_Think(void);
void BMOD_PostThink(void);
void BMOD_Identify( void );
int BMOD_WasSpawnKilled( void );
int BMOD_IsASpawn( void );
void BMOD_ResetSpawnKill( void );
int m_iSpawnKills;
float m_fMessageTimer;
BOOL m_iMessageFire;
int m_iMessageCounter;
EHANDLE m_hObserverTarget;
BOOL m_iFirstSpawn;
BOOL m_bIsConnected;
float m_fMsgTimer;
BOOL m_bSentMsg;
float m_fSpawnTimeStamp;
Vector m_vFreezeAngle;
float m_flFreezeTime;
float m_flTypeKillStamp;
BOOL m_bTypeMode;
void BMOD_ResetTypeKill( void );
int BMOD_WasTypeKilled( void );
int BMOD_IsTyping( void );
int m_iTypeKills;
BOOL m_bBanMe;
int m_iKillsThisFrame;
int m_iSpamSay;
BOOL m_LocateMode;
BOOL m_LeetSpeak;
BOOL m_IsLlama;
char m_sMapVote[81];
int m_RuneFlags; // Holds which runes this player owns.
float m_RuneTime; // Time at which this rune wears off.
// BMOD End - extra player functions
};
#define AUTOAIM_2DEGREES 0.0348994967025

2
dlls/python.cpp

@ -192,7 +192,7 @@ void CPython::PrimaryAttack() @@ -192,7 +192,7 @@ void CPython::PrimaryAttack()
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
Vector vecDir;
vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 8192, BULLET_PLAYER_357, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 8192, BULLET_PLAYER_357, 1, 0, m_pPlayer->pev, m_pPlayer->random_seed );
int flags;
#if defined( CLIENT_WEAPONS )

15
dlls/rpg.cpp

@ -23,6 +23,10 @@ @@ -23,6 +23,10 @@
#include "player.h"
#include "gamerules.h"
// BMOD Edit - RPG mod
extern cvar_t bm_rpg_mod;
#include "BMOD_messaging.h"
enum rpg_e
{
RPG_IDLE = 0,
@ -143,7 +147,12 @@ void CRpgRocket::Spawn( void ) @@ -143,7 +147,12 @@ void CRpgRocket::Spawn( void )
pev->nextthink = gpGlobals->time + 0.4;
pev->dmg = gSkillData.plrDmgRPG;
// BMOD Begin - RPG mod
if( bm_rpg_mod.value )
pev->dmg = 100;
else
pev->dmg = gSkillData.plrDmgRPG;;
// BMOD End - RPG mod
}
//=========================================================
@ -394,6 +403,10 @@ int CRpg::AddToPlayer( CBasePlayer *pPlayer ) @@ -394,6 +403,10 @@ int CRpg::AddToPlayer( CBasePlayer *pPlayer )
BOOL CRpg::Deploy()
{
// BMOD Edit - RPG mod
if( bm_rpg_mod.value )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\nRPG\nDamage is lowered." );
if( m_iClip == 0 )
{
return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW_UL, "rpg" );

50
dlls/satchel.cpp

@ -40,6 +40,9 @@ enum satchel_radio_e @@ -40,6 +40,9 @@ enum satchel_radio_e
SATCHEL_RADIO_HOLSTER
};
// BMOD Edit - spawn satchels
extern cvar_t bm_spawnsatchels;
class CSatchelCharge : public CGrenade
{
void Spawn( void );
@ -49,6 +52,10 @@ class CSatchelCharge : public CGrenade @@ -49,6 +52,10 @@ class CSatchelCharge : public CGrenade
void EXPORT SatchelSlide( CBaseEntity *pOther );
void EXPORT SatchelThink( void );
// BMOD Begin - extra satchel charge stuff
BOOL IsSpawnSatchel( void );
// BMOD End - extra satchel charge stuff
public:
void Deactivate( void );
};
@ -145,6 +152,21 @@ void CSatchelCharge::SatchelThink( void ) @@ -145,6 +152,21 @@ void CSatchelCharge::SatchelThink( void )
{
pev->velocity.z -= 8;
}
// BMOD Begin - spawn satchels
if( !( bm_spawnsatchels.value ) && ( pev->flags & FL_ONGROUND ) && !( pev->velocity.Length() ) )
{
SetThink( NULL );
if( IsSpawnSatchel() )
{
Use( UTIL_CastPlayer(pev->owner), UTIL_CastPlayer( pev->owner ), USE_ON, 0 );
UTIL_SpeakBadWeapon();
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "%s tried to place a spawn satchel!\n", STRING( VARS( pev->owner )->netname ) ) );
}
}
// BMOD End - spawn satchels
}
void CSatchelCharge::Precache( void )
@ -478,4 +500,32 @@ void DeactivateSatchels( CBasePlayer *pOwner ) @@ -478,4 +500,32 @@ void DeactivateSatchels( CBasePlayer *pOwner )
pFind = FIND_ENTITY_BY_CLASSNAME( pFind, "monster_satchel" );
}
}
BOOL CSatchelCharge::IsSpawnSatchel()
{
if( bm_spawnsatchels.value )
return FALSE;
BOOL result = FALSE;
CBaseEntity *pEntity = NULL;
TraceResult tr;
Vector vecTop;
Vector vecSrc = pev->origin;
int bInWater = ( UTIL_PointContents( vecSrc ) == CONTENTS_WATER );
vecSrc.z += 1;// in case grenade is lying on the ground
// iterate on all entities in the vicinity.
while( ( pEntity = UTIL_FindEntityByClassname( pEntity, "info_player_deathmatch" ) ) != NULL )
{
UTIL_TraceLine( pEntity->pev->origin, pEntity->pev->origin - Vector( 0, 0, 1024 ), ignore_monsters, ENT( pev ), &tr );
Vector vecTop = pEntity->pev->origin + Vector( 0, 0, 36 );
float height = fabs( vecTop.z - tr.vecEndPos.z ) / 2;
if( UTIL_OBB_PointTest( vecSrc, Vector( vecTop.x, vecTop.y, ( vecTop.z + tr.vecEndPos.z ) / 2 ), Vector( 16, 16, height ) ) )
result = TRUE;
}
return result;
}
#endif

53
dlls/shotgun.cpp

@ -21,6 +21,9 @@ @@ -21,6 +21,9 @@
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
#include "BMOD_messaging.h"
extern cvar_t bm_shotty_mod;
// special deathmatch shotgun spreads
#define VECTOR_CONE_DM_SHOTGUN Vector( 0.08716, 0.04362, 0.00 )// 10 degrees by 5 degrees
@ -110,6 +113,9 @@ int CShotgun::GetItemInfo( ItemInfo *p ) @@ -110,6 +113,9 @@ int CShotgun::GetItemInfo( ItemInfo *p )
BOOL CShotgun::Deploy()
{
if( bm_shotty_mod.value == 1 )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20), Vector( 1, 4, 2 ), "\nSHOTGUN\nFast fire rate / fast reload." );
return DefaultDeploy( "models/v_shotgun.mdl", "models/p_shotgun.mdl", SHOTGUN_DRAW, "shotgun" );
}
@ -155,12 +161,12 @@ void CShotgun::PrimaryAttack() @@ -155,12 +161,12 @@ void CShotgun::PrimaryAttack()
if( g_pGameRules->IsMultiplayer() )
#endif
{
vecDir = m_pPlayer->FireBulletsPlayer( 4, vecSrc, vecAiming, VECTOR_CONE_DM_SHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
vecDir = m_pPlayer->FireBulletsPlayer( 4, vecSrc, vecAiming, VECTOR_CONE_DM_SHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 1, 0, m_pPlayer->pev, m_pPlayer->random_seed );
}
else
{
// regular old, untouched spread.
vecDir = m_pPlayer->FireBulletsPlayer( 6, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
vecDir = m_pPlayer->FireBulletsPlayer( 6, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 1, 0, m_pPlayer->pev, m_pPlayer->random_seed );
}
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
@ -174,6 +180,19 @@ void CShotgun::PrimaryAttack() @@ -174,6 +180,19 @@ void CShotgun::PrimaryAttack()
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75;
if( bm_shotty_mod.value )
{
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.6;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.6;
}
if( m_pPlayer->m_RuneFlags == RUNE_SHOTGUN )
{
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.25;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.25;
}
if( m_iClip != 0 )
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0;
else
@ -226,12 +245,12 @@ void CShotgun::SecondaryAttack( void ) @@ -226,12 +245,12 @@ void CShotgun::SecondaryAttack( void )
#endif
{
// tuned for deathmatch
vecDir = m_pPlayer->FireBulletsPlayer( 8, vecSrc, vecAiming, VECTOR_CONE_DM_DOUBLESHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
vecDir = m_pPlayer->FireBulletsPlayer( 8, vecSrc, vecAiming, VECTOR_CONE_DM_DOUBLESHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 1, 0, m_pPlayer->pev, m_pPlayer->random_seed );
}
else
{
// untouched default single player
vecDir = m_pPlayer->FireBulletsPlayer( 12, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
vecDir = m_pPlayer->FireBulletsPlayer( 12, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 1, 0, m_pPlayer->pev, m_pPlayer->random_seed );
}
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
@ -245,6 +264,19 @@ void CShotgun::SecondaryAttack( void ) @@ -245,6 +264,19 @@ void CShotgun::SecondaryAttack( void )
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.5;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.5;
if( bm_shotty_mod.value )
{
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + .9;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + .9;
}
if( m_pPlayer->m_RuneFlags == RUNE_SHOTGUN )
{
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5;
}
if( m_iClip != 0 )
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 6.0;
else
@ -293,8 +325,17 @@ void CShotgun::Reload( void ) @@ -293,8 +325,17 @@ void CShotgun::Reload( void )
else
{
// Add them to the clip
m_iClip += 1;
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= 1;
if( m_pPlayer->m_RuneFlags == RUNE_SHOTGUN || bm_shotty_mod.value )
{
int ammo = min( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType], SHOTGUN_MAX_CLIP - m_iClip );
m_iClip += ammo;
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= ammo;
}
else
{
m_iClip += 1;
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= 1;
}
m_fInSpecialReload = 1;
}
}

120
dlls/squeakgrenade.cpp

@ -13,63 +13,10 @@ @@ -13,63 +13,10 @@
*
****/
#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD )
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "soundent.h"
#include "gamerules.h"
enum w_squeak_e
{
WSQUEAK_IDLE1 = 0,
WSQUEAK_FIDGET,
WSQUEAK_JUMP,
WSQUEAK_RUN
};
enum squeak_e
{
SQUEAK_IDLE1 = 0,
SQUEAK_FIDGETFIT,
SQUEAK_FIDGETNIP,
SQUEAK_DOWN,
SQUEAK_UP,
SQUEAK_THROW
};
#ifndef CLIENT_DLL
class CSqueakGrenade : public CGrenade
{
void Spawn( void );
void Precache( void );
int Classify( void );
void EXPORT SuperBounceTouch( CBaseEntity *pOther );
void EXPORT HuntThink( void );
int BloodColor( void ) { return BLOOD_COLOR_YELLOW; }
void Killed( entvars_t *pevAttacker, int iGib );
void GibMonster( void );
virtual int Save( CSave &save );
virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
static float m_flNextBounceSoundTime;
// CBaseEntity *m_pTarget;
float m_flDie;
Vector m_vecTarget;
float m_flNextHunt;
float m_flNextHit;
Vector m_posPrev;
EHANDLE m_hOwner;
int m_iMyClass;
};
// BMOD Edit
#include "squeakgrenade.h"
float CSqueakGrenade::m_flNextBounceSoundTime = 0;
@ -134,6 +81,8 @@ void CSqueakGrenade::Spawn( void ) @@ -134,6 +81,8 @@ void CSqueakGrenade::Spawn( void )
pev->gravity = 0.5;
pev->friction = 0.5;
m_bWasLaunched = FALSE;
pev->dmg = gSkillData.snarkDmgPop;
m_flDie = gpGlobals->time + SQUEEK_DETONATE_DELAY;
@ -147,6 +96,29 @@ void CSqueakGrenade::Spawn( void ) @@ -147,6 +96,29 @@ void CSqueakGrenade::Spawn( void )
pev->sequence = WSQUEAK_RUN;
ResetSequenceInfo();
// +BubbleMod
char color[3];
int alp = UTIL_axtoi(strncpy( color, bm_snarktrails.string + 6, 2 ));
if( alp )
{
int red = UTIL_axtoi( strncpy( color, bm_snarktrails.string, 2 ) );
int grn = UTIL_axtoi( strncpy( color, bm_snarktrails.string + 2, 2 ) );
int blu = UTIL_axtoi( strncpy( color, bm_snarktrails.string + 4, 2 ) );
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
WRITE_BYTE( TE_BEAMFOLLOW );
WRITE_SHORT( entindex() ); // entity
WRITE_SHORT( g_sModelIndexSmokeTrail ); // model
WRITE_BYTE( 40 ); // life
WRITE_BYTE( 5 ); // width
WRITE_BYTE( red ); // r, g, b
WRITE_BYTE( grn ); // r, g, b
WRITE_BYTE( blu ); // r, g, b
WRITE_BYTE( alp ); // brightness
MESSAGE_END(); // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS)
}
// -BubbleMod
}
void CSqueakGrenade::Precache( void )
@ -201,7 +173,7 @@ void CSqueakGrenade::HuntThink( void ) @@ -201,7 +173,7 @@ void CSqueakGrenade::HuntThink( void )
{
// ALERT( at_console, "think\n" );
if( !IsInWorld() )
if( !IsInWorld() && !m_bWasLaunched )
{
SetTouch( NULL );
UTIL_Remove( this );
@ -221,7 +193,7 @@ void CSqueakGrenade::HuntThink( void ) @@ -221,7 +193,7 @@ void CSqueakGrenade::HuntThink( void )
}
// float
if( pev->waterlevel != 0 )
if( pev->waterlevel != 0 && !m_bWasLaunched )
{
if( pev->movetype == MOVETYPE_BOUNCE )
{
@ -255,7 +227,18 @@ void CSqueakGrenade::HuntThink( void ) @@ -255,7 +227,18 @@ void CSqueakGrenade::HuntThink( void )
{
// find target, bounce a bit towards it.
Look( 512 );
m_hEnemy = BestVisibleEnemy();
m_hEnemy = BMOD_BestVisibleEnemy();
}
if( m_hEnemy!= NULL && m_hEnemy->IsPlayer() )
{
CBasePlayer* pPlayer = (CBasePlayer*)( (CBaseEntity *)m_hEnemy );
if( pPlayer->BMOD_IsTyping() )
{
// find target, bounce a bit towards it.
Look( 512 );
m_hEnemy = BMOD_BestVisibleEnemy();
}
}
// squeek if it's about time blow up
@ -320,6 +303,14 @@ void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther ) @@ -320,6 +303,14 @@ void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther )
{
float flpitch;
// BMOD - Snark Launcher
if( m_bWasLaunched )
{
pev->velocity = pev->velocity.Normalize() * 200;
m_bWasLaunched = FALSE;
}
// BMOD - Snark Launcher
TraceResult tr = UTIL_GetGlobalTrace();
// don't hit the guy that launched this grenade
@ -433,6 +424,9 @@ void CSqueak::Precache( void ) @@ -433,6 +424,9 @@ void CSqueak::Precache( void )
PRECACHE_SOUND( "squeek/sqk_hunt3.wav" );
UTIL_PrecacheOther( "monster_snark" );
// BMOD Edit - snark mod
UTIL_PrecacheOther( "monster_tripsnark" );
m_usSnarkFire = PRECACHE_EVENT( 1, "events/snarkfire.sc" );
}
@ -465,6 +459,10 @@ BOOL CSqueak::Deploy() @@ -465,6 +459,10 @@ BOOL CSqueak::Deploy()
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
// BMOD Edit - snark mod
if( bm_snarks_mod.value )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\nSNARKS\nSECONDAY FIRE: Place a snark mine." );
return DefaultDeploy( "models/v_squeak.mdl", "models/p_squeak.mdl", SQUEAK_UP, "squeak" );
}
@ -538,12 +536,12 @@ void CSqueak::PrimaryAttack() @@ -538,12 +536,12 @@ void CSqueak::PrimaryAttack()
}
}
}
/*
void CSqueak::SecondaryAttack( void )
{
}
*/
void CSqueak::WeaponIdle( void )
{
if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )

57
dlls/teamplay_gamerules.cpp

@ -85,6 +85,9 @@ void CHalfLifeTeamplay::Think( void ) @@ -85,6 +85,9 @@ void CHalfLifeTeamplay::Think( void )
#ifndef NO_VOICEGAMEMGR
g_VoiceGameMgr.Update(gpGlobals->frametime);
#endif
// BMOD Edit - Extra Game Think stuff
BMOD_Think();
if( g_fGameOver ) // someone else quit the game already
{
CHalfLifeMultiplay::Think();
@ -211,19 +214,19 @@ const char *CHalfLifeTeamplay::SetDefaultPlayerTeam( CBasePlayer *pPlayer ) @@ -211,19 +214,19 @@ const char *CHalfLifeTeamplay::SetDefaultPlayerTeam( CBasePlayer *pPlayer )
//=========================================================
void CHalfLifeTeamplay::InitHUD( CBasePlayer *pPlayer )
{
int i;
//int i;
SetDefaultPlayerTeam( pPlayer );
CHalfLifeMultiplay::InitHUD( pPlayer );
// Send down the team names
MESSAGE_BEGIN( MSG_ONE, gmsgTeamNames, NULL, pPlayer->edict() );
/*MESSAGE_BEGIN( MSG_ONE, gmsgTeamNames, NULL, pPlayer->edict() );
WRITE_BYTE( num_teams );
for( i = 0; i < num_teams; i++ )
{
WRITE_STRING( team_names[i] );
}
MESSAGE_END();
MESSAGE_END();*/
RecountTeams();
@ -245,7 +248,7 @@ void CHalfLifeTeamplay::InitHUD( CBasePlayer *pPlayer ) @@ -245,7 +248,7 @@ void CHalfLifeTeamplay::InitHUD( CBasePlayer *pPlayer )
RecountTeams();
// update this player with all the other players team info
// loop through all active players and send their team info to the new client
for( i = 1; i <= gpGlobals->maxClients; i++ )
/*for( i = 1; i <= gpGlobals->maxClients; i++ )
{
CBaseEntity *plr = UTIL_PlayerByIndex( i );
if( plr && IsValidTeam( plr->TeamID() ) )
@ -255,7 +258,7 @@ void CHalfLifeTeamplay::InitHUD( CBasePlayer *pPlayer ) @@ -255,7 +258,7 @@ void CHalfLifeTeamplay::InitHUD( CBasePlayer *pPlayer )
WRITE_STRING( plr->TeamID() );
MESSAGE_END();
}
}
}*/
}
void CHalfLifeTeamplay::ChangePlayerTeam( CBasePlayer *pPlayer, const char *pTeamName, BOOL bKill, BOOL bGib )
@ -293,7 +296,7 @@ void CHalfLifeTeamplay::ChangePlayerTeam( CBasePlayer *pPlayer, const char *pTea @@ -293,7 +296,7 @@ void CHalfLifeTeamplay::ChangePlayerTeam( CBasePlayer *pPlayer, const char *pTea
g_engfuncs.pfnSetClientKeyValue( clientIndex, g_engfuncs.pfnGetInfoKeyBuffer( pPlayer->edict() ), "team", pPlayer->m_szTeamName );
// notify everyone's HUD of the team change
MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo );
/*MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo );
WRITE_BYTE( clientIndex );
WRITE_STRING( pPlayer->m_szTeamName );
MESSAGE_END();
@ -304,7 +307,7 @@ void CHalfLifeTeamplay::ChangePlayerTeam( CBasePlayer *pPlayer, const char *pTea @@ -304,7 +307,7 @@ void CHalfLifeTeamplay::ChangePlayerTeam( CBasePlayer *pPlayer, const char *pTea
WRITE_SHORT( pPlayer->m_iDeaths );
WRITE_SHORT( 0 );
WRITE_SHORT( g_pGameRules->GetTeamIndex( pPlayer->m_szTeamName ) + 1 );
MESSAGE_END();
MESSAGE_END();*/
}
//=========================================================
@ -609,17 +612,39 @@ void CHalfLifeTeamplay::RecountTeams( bool bResendInfo ) @@ -609,17 +612,39 @@ void CHalfLifeTeamplay::RecountTeams( bool bResendInfo )
{
team_scores[tm] += plr->pev->frags;
}
}
}
if( bResendInfo ) //Someone's info changed, let's send the team info again.
if( bResendInfo ) //Someone's info changed, let's send the team info again.
{
MESSAGE_BEGIN( MSG_ALL, gmsgTeamNames );
WRITE_BYTE( num_teams );
for( i = 0; i < num_teams; i++ )
{
if( plr && IsValidTeam( plr->TeamID() ) )
{
MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo, NULL );
WRITE_BYTE( plr->entindex() );
WRITE_STRING( plr->TeamID() );
MESSAGE_END();
}
WRITE_STRING( team_names[i] );
}
}
MESSAGE_END();
for( i = 1; i <= gpGlobals->maxClients; i++ )
{
CBaseEntity *plr = UTIL_PlayerByIndex( i );
CBasePlayer *pPlayer = (CBasePlayer*)plr;
if ( plr && IsValidTeam( plr->TeamID() ) )
{
MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo);
WRITE_BYTE( plr->entindex() );
WRITE_STRING( plr->TeamID() );
MESSAGE_END();
MESSAGE_BEGIN( MSG_ALL, gmsgScoreInfo );
WRITE_BYTE( plr->entindex() );
WRITE_SHORT( pPlayer->pev->frags );
WRITE_SHORT( pPlayer->m_iDeaths );
WRITE_SHORT( 0 );
WRITE_SHORT( g_pGameRules->GetTeamIndex( pPlayer->m_szTeamName ) + 1 );
MESSAGE_END();
}
}
}
}

6
dlls/triggers.cpp

@ -27,6 +27,7 @@ @@ -27,6 +27,7 @@
#include "saverestore.h"
#include "trains.h" // trigger_camera has train functionality
#include "gamerules.h"
#include "BMOD_rune.h"
#define SF_TRIGGER_PUSH_START_OFF 2//spawnflag that makes trigger_push spawn turned OFF
#define SF_TRIGGER_HURT_TARGETONCE 1// Only fire hurt target once
@ -884,6 +885,11 @@ void CBaseTrigger::HurtTouch( CBaseEntity *pOther ) @@ -884,6 +885,11 @@ void CBaseTrigger::HurtTouch( CBaseEntity *pOther )
{
float fldmg;
if( !strcmp( STRING( pOther->pev->classname ), "rune" ) )
{
(CRune*)pOther->Respawn();
}
if( !pOther->pev->takedamage )
return;

88
dlls/tripmine.cpp

@ -22,9 +22,13 @@ @@ -22,9 +22,13 @@
#include "player.h"
#include "effects.h"
#include "gamerules.h"
#include "tripmine.h"
#include "BMOD_messaging.h"
#define TRIPMINE_PRIMARY_VOLUME 450
extern cvar_t bm_trip_mod;
enum tripmine_e
{
TRIPMINE_IDLE1 = 0,
@ -39,39 +43,6 @@ enum tripmine_e @@ -39,39 +43,6 @@ enum tripmine_e
};
#ifndef CLIENT_DLL
class CTripmineGrenade : public CGrenade
{
void Spawn( void );
void Precache( void );
virtual int Save( CSave &save );
virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
void EXPORT WarningThink( void );
void EXPORT PowerupThink( void );
void EXPORT BeamBreakThink( void );
void EXPORT DelayDeathThink( void );
void Killed( entvars_t *pevAttacker, int iGib );
void MakeBeam( void );
void KillBeam( void );
float m_flPowerUp;
Vector m_vecDir;
Vector m_vecEnd;
float m_flBeamLength;
EHANDLE m_hOwner;
CBeam *m_pBeam;
Vector m_posOwner;
Vector m_angleOwner;
edict_t *m_pRealOwner;// tracelines don't hit PEV->OWNER, which means a player couldn't detonate his own trip mine, so we store the owner here.
};
LINK_ENTITY_TO_CLASS( monster_tripmine, CTripmineGrenade )
TYPEDESCRIPTION CTripmineGrenade::m_SaveData[] =
@ -252,6 +223,28 @@ void CTripmineGrenade::MakeBeam( void ) @@ -252,6 +223,28 @@ void CTripmineGrenade::MakeBeam( void )
m_pBeam->SetColor( 0, 214, 198 );
m_pBeam->SetScrollRate( 255 );
m_pBeam->SetBrightness( 64 );
// BMOD Begin - no trip spawn mines and flashbang
if( m_bIsFlashbang )
{
m_pBeam->SetColor( 120, 180, 180 );
m_pBeam->SetBrightness( 25 );
}
if( BMOD_IsSpawnMine() )
{
pev->owner = m_pRealOwner;
pev->health = 0;
Killed( VARS( pev->owner ), GIB_NORMAL );
UTIL_SpeakBadWeapon();
if( m_bIsFlashbang )
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "%s tried to place a spawn flash mine!\n", STRING( VARS( pev->owner )->netname ) ) );
else
UTIL_ClientPrintAll( HUD_PRINTTALK, UTIL_VarArgs( "%s tried to place a spawn mine!\n", STRING( VARS( pev->owner )->netname ) ) );
}
// BMOD Begin - no trip spawn mines no trip spawn mines and flashbang
}
void CTripmineGrenade::BeamBreakThink( void )
@ -339,7 +332,12 @@ void CTripmineGrenade::DelayDeathThink( void ) @@ -339,7 +332,12 @@ void CTripmineGrenade::DelayDeathThink( void )
TraceResult tr;
UTIL_TraceLine( pev->origin + m_vecDir * 8, pev->origin - m_vecDir * 64, dont_ignore_monsters, ENT( pev ), &tr );
Explode( &tr, DMG_BLAST );
// BMod Begin - flashbang
if( m_bIsFlashbang )
FlashBang();
else
Explode( &tr, DMG_BLAST );
// BMod Begin - flashbang
}
#endif
@ -398,6 +396,10 @@ int CTripmine::GetItemInfo( ItemInfo *p ) @@ -398,6 +396,10 @@ int CTripmine::GetItemInfo( ItemInfo *p )
BOOL CTripmine::Deploy()
{
// BMOD Edit - tripmine mod
if( bm_trip_mod.value )
PrintMessage( m_pPlayer, BMOD_CHAN_WEAPON, Vector( 20, 250, 20 ), Vector( 1, 4, 2 ), "\nTRIPMINES\nSECONDAY FIRE: Place a flash mine." );
pev->body = 0;
return DefaultDeploy( "models/v_tripmine.mdl", "models/p_tripmine.mdl", TRIPMINE_DRAW, "trip" );
}
@ -419,6 +421,17 @@ void CTripmine::Holster( int skiplocal /* = 0 */ ) @@ -419,6 +421,17 @@ void CTripmine::Holster( int skiplocal /* = 0 */ )
}
void CTripmine::PrimaryAttack( void )
{
BModAttack( FALSE );
}
void CTripmine::SecondaryAttack( void )
{
if( bm_trip_mod.value )
BModAttack( TRUE );
}
void CTripmine::BModAttack( BOOL flashbang )
{
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
return;
@ -448,6 +461,11 @@ void CTripmine::PrimaryAttack( void ) @@ -448,6 +461,11 @@ void CTripmine::PrimaryAttack( void )
CBaseEntity *pEnt = CBaseEntity::Create( "monster_tripmine", tr.vecEndPos + tr.vecPlaneNormal * 8, angles, m_pPlayer->edict() );
// BMOD Begin - flshbang
CTripmineGrenade *pMine = (CTripmineGrenade *)pEnt;
pMine->m_bIsFlashbang = flashbang;
// BMOD End - flshbang
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
// player "shoot" animation
@ -470,7 +488,7 @@ void CTripmine::PrimaryAttack( void ) @@ -470,7 +488,7 @@ void CTripmine::PrimaryAttack( void )
}*/
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.3;
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.3;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
}

18
dlls/util.h

@ -567,3 +567,21 @@ int UTIL_SharedRandomLong( unsigned int seed, int low, int high ); @@ -567,3 +567,21 @@ int UTIL_SharedRandomLong( unsigned int seed, int low, int high );
float UTIL_SharedRandomFloat( unsigned int seed, float low, float high );
float UTIL_WeaponTimeBase( void );
// BMOD Begin - Custom UTIL functions
CBasePlayer* UTIL_CastPlayer( CBaseEntity *pEnt );
CBasePlayer* UTIL_CastPlayer( entvars_t *pev );
CBasePlayer* UTIL_CastPlayer( edict_t *pEdict );
CBasePlayer* UTIL_CastPlayer( int index );
BOOL UTIL_OBB_LineTest( Vector vecSrc, Vector vecDst, Vector boxP, Vector boxE );
BOOL UTIL_OBB_PointTest( Vector vecSrc, Vector boxP, Vector boxE );
void UTIL_SpeakAll( char *message );
char *UTIL_CountVotes( void );
void UTIL_SpeakBadWeapon( void );
char *UTIL_CountVotes( void );
void UTIL_SaveRestorePlayer( CBasePlayer *pPlayer, BOOL save, BOOL resetall );
void UTIL_Speak_2_l33t( char *szTarget, char *szString );
void UTIL_SayTime( void );
int UTIL_axtoi( char *hexStg );
// BMOD End - Custom UTIL functions

84
dlls/weapons.cpp

@ -30,6 +30,7 @@ @@ -30,6 +30,7 @@
#include "soundent.h"
#include "decals.h"
#include "gamerules.h"
#include "egon.h"
extern CGraph WorldGraph;
extern int gEvilImpulse101;
@ -45,6 +46,11 @@ DLL_GLOBAL short g_sModelIndexWExplosion;// holds the index for the underwater e @@ -45,6 +46,11 @@ DLL_GLOBAL short g_sModelIndexWExplosion;// holds the index for the underwater e
DLL_GLOBAL short g_sModelIndexBubbles;// holds the index for the bubbles model
DLL_GLOBAL short g_sModelIndexBloodDrop;// holds the sprite index for the initial blood
DLL_GLOBAL short g_sModelIndexBloodSpray;// holds the sprite index for splattered blood
DLL_GLOBAL short g_sModelIndexSpit;// holds the sprite index for blood spray (bigger)
DLL_GLOBAL short g_sModelIndexLightning;// holds the sprite index for blood spray (bigger)
DLL_GLOBAL short g_sModelIndexSmokeTrail;// holds the sprite index for blood spray (bigger)
DLL_GLOBAL short g_sModelIndexFire;// holds the index for the smoke cloud
DLL_GLOBAL short g_sModelIndexFlare;
ItemInfo CBasePlayerItem::ItemInfoArray[MAX_WEAPONS];
AmmoInfo CBasePlayerItem::AmmoInfoArray[MAX_AMMO_SLOTS];
@ -299,6 +305,13 @@ void W_Precache( void ) @@ -299,6 +305,13 @@ void W_Precache( void )
UTIL_PrecacheOther( "item_antidote" );
UTIL_PrecacheOther( "item_security" );
UTIL_PrecacheOther( "item_longjump" );
UTIL_PrecacheOther( "item_rune" );
UTIL_PrecacheOther( "item_CrowbarRune" );
UTIL_PrecacheOther( "item_HealthRune" );
UTIL_PrecacheOther( "item_BatteryRune" );
UTIL_PrecacheOther( "item_ShotgunRune" );
UTIL_PrecacheOther( "item_357Rune" );
UTIL_PrecacheOther( "item_GrenadeRune" );
// shotgun
UTIL_PrecacheOtherWeapon( "weapon_shotgun" );
@ -315,6 +328,7 @@ void W_Precache( void ) @@ -315,6 +328,7 @@ void W_Precache( void )
UTIL_PrecacheOtherWeapon( "weapon_9mmAR" );
UTIL_PrecacheOther( "ammo_9mmAR" );
UTIL_PrecacheOther( "ammo_ARgrenades" );
UTIL_PrecacheOther( "ammo_9mmbox" );
#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD )
// python
@ -362,6 +376,11 @@ void W_Precache( void ) @@ -362,6 +376,11 @@ void W_Precache( void )
g_sModelIndexBubbles = PRECACHE_MODEL( "sprites/bubble.spr" );//bubbles
g_sModelIndexBloodSpray = PRECACHE_MODEL( "sprites/bloodspray.spr" ); // initial blood
g_sModelIndexBloodDrop = PRECACHE_MODEL( "sprites/blood.spr" ); // splattered blood
g_sModelIndexSpit = PRECACHE_MODEL( "sprites/tinyspit.spr" );
g_sModelIndexLightning = PRECACHE_MODEL( "sprites/lgtning.spr" );
g_sModelIndexSmokeTrail= PRECACHE_MODEL( "sprites/smoke.spr" );
g_sModelIndexFire = PRECACHE_MODEL( "sprites/fire.spr" );
g_sModelIndexFlare = PRECACHE_MODEL( "sprites/flare6.spr" );
g_sModelIndexLaser = PRECACHE_MODEL( (char *)g_pModelNameLaser );
g_sModelIndexLaserDot = PRECACHE_MODEL( "sprites/laserdot.spr" );
@ -382,6 +401,9 @@ void W_Precache( void ) @@ -382,6 +401,9 @@ void W_Precache( void )
PRECACHE_SOUND( "weapons/bullet_hit2.wav" ); // hit by bullet
PRECACHE_SOUND( "items/weapondrop1.wav" );// weapon falls to the ground
PRECACHE_SOUND( "debris/beamstart8.wav" );
PRECACHE_SOUND( "fvox/alert.wav" );
}
TYPEDESCRIPTION CBasePlayerItem::m_SaveData[] =
@ -438,6 +460,11 @@ void CBasePlayerItem::FallInit( void ) @@ -438,6 +460,11 @@ void CBasePlayerItem::FallInit( void )
SetThink( &CBasePlayerItem::FallThink );
pev->nextthink = gpGlobals->time + 0.1;
// BMOD Begin - Weapon Box Models
m_WeaponModelIndex = pev->modelindex;
m_WeaponModel = pev->model;
// BMOD End - Weapon Box Models
}
//=========================================================
@ -620,6 +647,10 @@ void CBasePlayerWeapon::ItemPostFrame( void ) @@ -620,6 +647,10 @@ void CBasePlayerWeapon::ItemPostFrame( void )
}
m_pPlayer->TabulateAmmo();
// BMOD Edit - Spawn killing
m_pPlayer->BMOD_ResetSpawnKill();
SecondaryAttack();
m_pPlayer->pev->button &= ~IN_ATTACK2;
}
@ -631,6 +662,10 @@ void CBasePlayerWeapon::ItemPostFrame( void ) @@ -631,6 +662,10 @@ void CBasePlayerWeapon::ItemPostFrame( void )
}
m_pPlayer->TabulateAmmo();
// BMOD Edit - Spawn killing
m_pPlayer->BMOD_ResetSpawnKill();
PrimaryAttack();
}
else if( m_pPlayer->pev->button & IN_RELOAD && iMaxClip() != WEAPON_NOCLIP && !m_fInReload )
@ -688,6 +723,9 @@ int CBasePlayerItem::AddToPlayer( CBasePlayer *pPlayer ) @@ -688,6 +723,9 @@ int CBasePlayerItem::AddToPlayer( CBasePlayer *pPlayer )
{
m_pPlayer = pPlayer;
// BMOD Edit - Pikcing up stuff cancels typing.
pPlayer->BMOD_ResetTypeKill();
return TRUE;
}
@ -935,6 +973,9 @@ BOOL CBasePlayerWeapon::DefaultDeploy( char *szViewModel, char *szWeaponModel, i @@ -935,6 +973,9 @@ BOOL CBasePlayerWeapon::DefaultDeploy( char *szViewModel, char *szWeaponModel, i
if( !CanDeploy() )
return FALSE;
// BMOD Edit - Spawn killing
m_pPlayer->BMOD_ResetSpawnKill();
m_pPlayer->TabulateAmmo();
m_pPlayer->pev->viewmodel = MAKE_STRING( szViewModel );
m_pPlayer->pev->weaponmodel = MAKE_STRING( szWeaponModel );
@ -1269,6 +1310,27 @@ void CWeaponBox::Touch( CBaseEntity *pOther ) @@ -1269,6 +1310,27 @@ void CWeaponBox::Touch( CBaseEntity *pOther )
//ALERT( at_console, "trying to give %s\n", STRING( m_rgpPlayerItems[i]->pev->classname ) );
pItem = m_rgpPlayerItems[i];
// BMOD Begin - Flying Crowbar
// Hack for flying_crowbar. Dont pickup if player already
// has crowbar.
if( pItem->m_iId == WEAPON_CROWBAR )
{
// check if the player already has this weapon
for( int i = 0; i < MAX_ITEM_TYPES; i++ )
{
CBasePlayerItem *it = pPlayer->m_rgpPlayerItems[i];
while( it != NULL )
{
if( it->m_iId == WEAPON_CROWBAR )
return;
it = it->m_pNext;
}
}
}
// BMOD End - Flying Crowbar
m_rgpPlayerItems[i] = m_rgpPlayerItems[i]->m_pNext;// unlink this weapon from the box
if( pPlayer->AddPlayerItem( pItem ) )
@ -1319,6 +1381,24 @@ BOOL CWeaponBox::PackWeapon( CBasePlayerItem *pWeapon ) @@ -1319,6 +1381,24 @@ BOOL CWeaponBox::PackWeapon( CBasePlayerItem *pWeapon )
pWeapon->m_pNext = NULL;
}
// BMOD Edit - Weapon Box Models
SET_MODEL( ENT( pev ), STRING( pWeapon->m_WeaponModel ) );
if( !strcmp( STRING( pWeapon->pev->classname ), "weapon_tripmine" ) )
{
// SET_MODEL( ENT( pev ), "models/v_tripmine.mdl" );
pev->frame = 0;
pev->body = 3;
pev->sequence = 7;
pev->framerate = 0;
UTIL_SetSize( pev, Vector( -8, -8, -4 ), Vector( 8, 8, 4 ) );
UTIL_SetOrigin( pev, pev->origin );
}
else if( !strcmp( STRING( pWeapon->pev->classname ), "weapon_crowbar" ) )
{
pev->nextthink = gpGlobals->time + 240;
}
pWeapon->pev->spawnflags |= SF_NORESPAWN;// never respawn
pWeapon->pev->movetype = MOVETYPE_NONE;
pWeapon->pev->solid = SOLID_NOT;
@ -1506,7 +1586,7 @@ TYPEDESCRIPTION CGauss::m_SaveData[] = @@ -1506,7 +1586,7 @@ TYPEDESCRIPTION CGauss::m_SaveData[] =
};
IMPLEMENT_SAVERESTORE( CGauss, CBasePlayerWeapon )
/*
TYPEDESCRIPTION CEgon::m_SaveData[] =
{
//DEFINE_FIELD( CEgon, m_pBeam, FIELD_CLASSPTR ),
@ -1520,7 +1600,7 @@ TYPEDESCRIPTION CEgon::m_SaveData[] = @@ -1520,7 +1600,7 @@ TYPEDESCRIPTION CEgon::m_SaveData[] =
};
IMPLEMENT_SAVERESTORE( CEgon, CBasePlayerWeapon )
*/
TYPEDESCRIPTION CSatchel::m_SaveData[] =
{
DEFINE_FIELD( CSatchel, m_chargeReady, FIELD_INTEGER ),

24
dlls/weapons.h

@ -21,6 +21,8 @@ class CBasePlayer; @@ -21,6 +21,8 @@ class CBasePlayer;
extern int gmsgWeapPickup;
void DeactivateSatchels( CBasePlayer *pOwner );
void DeactivateTrips( CBasePlayer *pOwner );
void DeactivateSnarkTrips( CBasePlayer *pOwner );
// Contact Grenade / Timed grenade / Satchel Charge
class CGrenade : public CBaseMonster
@ -38,6 +40,7 @@ public: @@ -38,6 +40,7 @@ public:
void Explode( Vector vecSrc, Vector vecAim );
void Explode( TraceResult *pTrace, int bitsDamageType );
void EXPORT Smoke( void );
void EXPORT MegaSmoke( void );
void EXPORT BounceTouch( CBaseEntity *pOther );
void EXPORT SlideTouch( CBaseEntity *pOther );
@ -53,6 +56,7 @@ public: @@ -53,6 +56,7 @@ public:
virtual void Killed( entvars_t *pevAttacker, int iGib );
BOOL m_fRegisteredSound;// whether or not this grenade has issued its DANGER sound to the world sound list yet.
int m_iMegaSmokeFrame;
};
// constant items
@ -274,6 +278,11 @@ public: @@ -274,6 +278,11 @@ public:
// int m_iIdPrimary; // Unique Id for primary ammo
// int m_iIdSecondary; // Unique Id for secondary ammo
// BMOD Begin - Weapon Box Models
int m_WeaponModelIndex;
string_t m_WeaponModel;
// BMOD End - Weapon Box Models
};
// inventory items that
@ -368,6 +377,11 @@ extern DLL_GLOBAL short g_sModelIndexWExplosion;// holds the index for the under @@ -368,6 +377,11 @@ extern DLL_GLOBAL short g_sModelIndexWExplosion;// holds the index for the under
extern DLL_GLOBAL short g_sModelIndexBubbles;// holds the index for the bubbles model
extern DLL_GLOBAL short g_sModelIndexBloodDrop;// holds the sprite index for blood drops
extern DLL_GLOBAL short g_sModelIndexBloodSpray;// holds the sprite index for blood spray (bigger)
extern DLL_GLOBAL short g_sModelIndexSpit;// holds the sprite index for blood spray (bigger)
extern DLL_GLOBAL short g_sModelIndexLightning;// holds the sprite index for blood spray (bigger)
extern DLL_GLOBAL short g_sModelIndexSmokeTrail;// holds the sprite index for blood spray (bigger)
extern DLL_GLOBAL short g_sModelIndexFire;
extern DLL_GLOBAL short g_sModelIndexFlare;
extern void ClearMultiDamage(void);
extern void ApplyMultiDamage(entvars_t* pevInflictor, entvars_t* pevAttacker );
@ -493,6 +507,10 @@ public: @@ -493,6 +507,10 @@ public:
int GetItemInfo(ItemInfo *p);
void PrimaryAttack( void );
// BMOD Edit - Flying Crowbar
void SecondaryAttack( void );
int Swing( int fFirst );
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
@ -766,7 +784,7 @@ private: @@ -766,7 +784,7 @@ private:
unsigned short m_usGaussFire;
unsigned short m_usGaussSpin;
};
/*
class CEgon : public CBasePlayerWeapon
{
public:
@ -864,7 +882,7 @@ public: @@ -864,7 +882,7 @@ public:
private:
unsigned short m_usHornetFire;
};
*/
class CHandGrenade : public CBasePlayerWeapon
{
public:
@ -938,6 +956,8 @@ public: @@ -938,6 +956,8 @@ public:
}
void PrimaryAttack( void );
void SecondaryAttack( void );
void BModAttack( BOOL flashbang );
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
void WeaponIdle( void );

59
dlls/world.cpp

@ -227,7 +227,7 @@ static void InitBodyQue( void ) @@ -227,7 +227,7 @@ static void InitBodyQue( void )
//
void CopyToBodyQue( entvars_t *pev )
{
if( pev->effects & EF_NODRAW )
/* if( pev->effects & EF_NODRAW )
return;
entvars_t *pevHead = VARS( g_pBodyQueueHead );
@ -255,6 +255,50 @@ void CopyToBodyQue( entvars_t *pev ) @@ -255,6 +255,50 @@ void CopyToBodyQue( entvars_t *pev )
UTIL_SetOrigin( pevHead, pev->origin );
UTIL_SetSize( pevHead, pev->mins, pev->maxs );
g_pBodyQueueHead = pevHead->owner;
*/
TraceResult tr;
if( pev->effects & EF_NODRAW )
return;
entvars_t *pevHead = VARS( g_pBodyQueueHead );
pevHead->angles = pev->angles;
pevHead->model = pev->model;
pevHead->modelindex = pev->modelindex;
pevHead->frame = pev->frame;
pevHead->colormap = pev->colormap;
pevHead->movetype = MOVETYPE_TOSS;
pevHead->velocity = pev->velocity;
pevHead->flags = 0;
pevHead->deadflag = pev->deadflag;
pevHead->renderfx = kRenderFxDeadPlayer;
pevHead->renderamt = ENTINDEX( ENT( pev ) );
pevHead->effects = pev->effects | EF_NOINTERP;
//pevHead->goalstarttime = pev->goalstarttime;
//pevHead->goalframe = pev->goalframe;
//pevHead->goalendtime = pev->goalendtime ;
pevHead->sequence = pev->sequence;
pevHead->animtime = pev->animtime;
if( pev->flags & FL_DUCKING )
UTIL_SetOrigin( pevHead, pev->origin + Vector( 0, 0, 20 ) );
else
UTIL_SetOrigin( pevHead, pev->origin );
UTIL_SetSize( pevHead, VEC_HULL_MIN, VEC_HULL_MAX );
g_pBodyQueueHead = pevHead->owner;
UTIL_TraceLine( pev->origin + Vector( 0, 0, 5 ), pev->origin - Vector( 0, 0, 500 ), ignore_monsters, ENT( pevHead ), &tr );
pevHead->angles.x = 0;
pevHead->angles.z = 0;
//pevHead->angles.x = UTIL_VecToAngles( tr.vecPlaneNormal ).x;
//pevHead->angles.z = UTIL_VecToAngles( tr.vecPlaneNormal ).z;
}
CGlobalState::CGlobalState( void )
@ -450,12 +494,25 @@ LINK_ENTITY_TO_CLASS( worldspawn, CWorld ) @@ -450,12 +494,25 @@ LINK_ENTITY_TO_CLASS( worldspawn, CWorld )
#define SF_WORLD_FORCETEAM 0x0004 // Force teams
extern DLL_GLOBAL BOOL g_fGameOver;
extern DLL_GLOBAL int g_VoteStatus;
extern DLL_GLOBAL BOOL g_runes_exist;
extern DLL_GLOBAL BOOL g_runes_learn;
float g_flWeaponCheat;
void CWorld::Spawn( void )
{
g_fGameOver = FALSE;
Precache();
// BMOD Begin - Init World
// no runes yet
g_runes_exist = false;
g_runes_learn = false;
//strcpy(g_NextMap, "");
g_VoteStatus = 0;
//g_bReplaceWeapons = TRUE;
//BMOD End - Init World
}
void CWorld::Precache( void )

Loading…
Cancel
Save