Full awareness of normal game entities.
This commit is contained in:
@@ -69,7 +69,6 @@ int g_DamageVictim;
|
|||||||
edict_t *g_DamageAttacker[33];
|
edict_t *g_DamageAttacker[33];
|
||||||
int g_DamageBits[33];
|
int g_DamageBits[33];
|
||||||
bool g_PlayerKilled[33];
|
bool g_PlayerKilled[33];
|
||||||
float g_flWaitTillMessage[33];
|
|
||||||
|
|
||||||
// DeathMsg
|
// DeathMsg
|
||||||
int g_DeathMsg;
|
int g_DeathMsg;
|
||||||
@@ -394,17 +393,36 @@ void check_player_dead( edict_t *pPlayer )
|
|||||||
// Killed by a monster?
|
// Killed by a monster?
|
||||||
if ( pAttacker->v.flags & FL_MONSTER )
|
if ( pAttacker->v.flags & FL_MONSTER )
|
||||||
{
|
{
|
||||||
// Check the first character for 'aeiou'.
|
// Try to get the name of the monster
|
||||||
|
char szName[129], szCheck[2];
|
||||||
|
|
||||||
CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pAttacker));
|
CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(pAttacker));
|
||||||
char szCheck[2];
|
if ( pMonster != NULL )
|
||||||
strncpy( szCheck, STRING( pMonster->m_szMonsterName ), 1 );
|
{
|
||||||
|
// One of our monsters
|
||||||
|
strcpy(szName, STRING( pMonster->m_szMonsterName ));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// SOMETHING that is a monster
|
||||||
|
if ( !FStringNull( pAttacker->v.netname ) )
|
||||||
|
strcpy(szName, STRING( pAttacker->v.netname ));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No netname, use classname
|
||||||
|
strcpy(szName, STRING( pAttacker->v.classname ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now, copy the first character to check for 'aeiou'.
|
||||||
|
strncpy( szCheck, szName, 1 );
|
||||||
|
|
||||||
// Make the first character lowercase
|
// Make this character lowercase and inspect it. Select which message.
|
||||||
szCheck[0] = tolower( szCheck[ 0 ] );
|
szCheck[0] = tolower( szCheck[ 0 ] );
|
||||||
if ( strncmp( szCheck, "a", 1 ) == 0 || strncmp( szCheck, "e", 1 ) == 0 || strncmp( szCheck, "i", 1 ) == 0 || strncmp( szCheck, "o", 1 ) == 0 || strncmp( szCheck, "u", 1 ) == 0 )
|
if ( strncmp( szCheck, "a", 1 ) == 0 || strncmp( szCheck, "e", 1 ) == 0 || strncmp( szCheck, "i", 1 ) == 0 || strncmp( szCheck, "o", 1 ) == 0 || strncmp( szCheck, "u", 1 ) == 0 )
|
||||||
sprintf( szMessage, "* %s was killed by an %s.\n", szPlayerName, STRING( pMonster->m_szMonsterName ) );
|
sprintf( szMessage, "* %s was killed by an %s.\n", szPlayerName, szName );
|
||||||
else
|
else
|
||||||
sprintf( szMessage, "* %s was killed by a %s.\n", szPlayerName, STRING( pMonster->m_szMonsterName ) );
|
sprintf( szMessage, "* %s was killed by a %s.\n", szPlayerName, szName );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -463,8 +481,6 @@ void check_player_dead( edict_t *pPlayer )
|
|||||||
sprintf( szMessage, "* %s died of hypothermia.\n", szPlayerName );
|
sprintf( szMessage, "* %s died of hypothermia.\n", szPlayerName );
|
||||||
else if ( g_DamageBits[ iPlayerIndex ] & DMG_MORTAR )
|
else if ( g_DamageBits[ iPlayerIndex ] & DMG_MORTAR )
|
||||||
sprintf( szMessage, "* %s blew its missile pet.\n", szPlayerName );
|
sprintf( szMessage, "* %s blew its missile pet.\n", szPlayerName );
|
||||||
else if ( g_DamageBits[ iPlayerIndex ] == (1 << 30) ) // (1 << 30) = 1073741824. For custom death messages
|
|
||||||
sprintf( szMessage, "* %s %s.\n", szPlayerName, STRING( pAttacker->v.noise ) );
|
|
||||||
else // other mods could have more DMG_ variants that aren't registered here.
|
else // other mods could have more DMG_ variants that aren't registered here.
|
||||||
sprintf( szMessage, "* %s deadly died.\n", szPlayerName );
|
sprintf( szMessage, "* %s deadly died.\n", szPlayerName );
|
||||||
}
|
}
|
||||||
@@ -514,38 +530,80 @@ void check_monster_info( edict_t *pPlayer )
|
|||||||
// Hit an entity?
|
// Hit an entity?
|
||||||
if (tr.pHit != NULL)
|
if (tr.pHit != NULL)
|
||||||
{
|
{
|
||||||
// Must be a monster
|
// It should be alive
|
||||||
if (tr.pHit->v.flags & FL_MONSTER)
|
if ( UTIL_IsAlive( tr.pHit ) )
|
||||||
{
|
{
|
||||||
// Get monster info
|
// Must be a monster
|
||||||
CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(tr.pHit));
|
if (tr.pHit->v.flags & FL_MONSTER)
|
||||||
|
{
|
||||||
char szInfo[512];
|
char szName[129];
|
||||||
sprintf(szInfo, "Enemy: %s\nHealth: %.0f\nFrags: %.0f\n", STRING( pMonster->m_szMonsterName ), pMonster->pev->health, pMonster->pev->frags );
|
float monsterHealth, monsterFrags;
|
||||||
|
int classify;
|
||||||
// Create a TE_TEXTMESSAGE and show the monster information
|
BOOL isAlly = FALSE;
|
||||||
MESSAGE_BEGIN( MSG_ONE, SVC_TEMPENTITY, NULL, pPlayer );
|
|
||||||
WRITE_BYTE( TE_TEXTMESSAGE );
|
// Get monster info
|
||||||
WRITE_BYTE( 3 ); // Channel
|
CMBaseMonster *pMonster = GetClassPtr((CMBaseMonster *)VARS(tr.pHit));
|
||||||
WRITE_SHORT( 327 ); // X
|
if ( pMonster != NULL )
|
||||||
WRITE_SHORT( 4771 ); // Y
|
{
|
||||||
WRITE_BYTE( 0 ); // Effect
|
strcpy(szName, STRING( pMonster->m_szMonsterName ));
|
||||||
WRITE_BYTE( 171 ); // R1
|
classify = pMonster->Classify();
|
||||||
WRITE_BYTE( 23 ); // G1
|
}
|
||||||
WRITE_BYTE( 7 ); // B1
|
else
|
||||||
WRITE_BYTE( 0 ); // A1
|
{
|
||||||
WRITE_BYTE( 207 ); // R2
|
// A monster that we do not recognize, use its netname
|
||||||
WRITE_BYTE( 23 ); // G2
|
if ( !FStringNull( tr.pHit->v.netname ) )
|
||||||
WRITE_BYTE( 7 ); // B2
|
strcpy(szName, STRING( tr.pHit->v.netname ));
|
||||||
WRITE_BYTE( 255 ); // A2
|
else
|
||||||
WRITE_SHORT( 0 ); // Fade-in Time
|
{
|
||||||
WRITE_SHORT( 15 ); // Fade-out Time
|
// If all else fails, use classname as monster name
|
||||||
WRITE_SHORT( 448 ); // Hold time
|
strcpy(szName, STRING( tr.pHit->v.classname ));
|
||||||
WRITE_STRING( szInfo ); // Message
|
}
|
||||||
MESSAGE_END();
|
classify = tr.pHit->v.iuser4;
|
||||||
|
}
|
||||||
// Delay till next scan
|
monsterHealth = tr.pHit->v.health;
|
||||||
g_NextMessage[ ENTINDEX( pPlayer ) ] = gpGlobals->time + 0.8;
|
monsterFrags = tr.pHit->v.frags;
|
||||||
|
|
||||||
|
// Unless it is strictly ally to us, treat as enemy monster
|
||||||
|
if ( classify == CLASS_HUMAN_PASSIVE || classify == CLASS_PLAYER_ALLY )
|
||||||
|
isAlly = TRUE;
|
||||||
|
|
||||||
|
// Prepare the message
|
||||||
|
char szInfo[257];
|
||||||
|
sprintf(szInfo, "%s: %s\nHealth: %.0f\nFrags: %.0f\n", ( isAlly ? "Friend" : "Enemy" ), szName, monsterHealth, monsterFrags );
|
||||||
|
|
||||||
|
// Create a TE_TEXTMESSAGE and show the monster information
|
||||||
|
MESSAGE_BEGIN( MSG_ONE, SVC_TEMPENTITY, NULL, pPlayer );
|
||||||
|
WRITE_BYTE( TE_TEXTMESSAGE );
|
||||||
|
WRITE_BYTE( 3 ); // Channel
|
||||||
|
WRITE_SHORT( 327 ); // X
|
||||||
|
WRITE_SHORT( 4771 ); // Y
|
||||||
|
WRITE_BYTE( 0 ); // Effect
|
||||||
|
if ( isAlly )
|
||||||
|
{
|
||||||
|
WRITE_BYTE( 9 ); // R1
|
||||||
|
WRITE_BYTE( 172 ); // G1
|
||||||
|
WRITE_BYTE( 96 ); // B1
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WRITE_BYTE( 171 ); // R1
|
||||||
|
WRITE_BYTE( 23 ); // G1
|
||||||
|
WRITE_BYTE( 7 ); // B1
|
||||||
|
}
|
||||||
|
WRITE_BYTE( 0 ); // A1
|
||||||
|
WRITE_BYTE( 207 ); // R2
|
||||||
|
WRITE_BYTE( 23 ); // G2
|
||||||
|
WRITE_BYTE( 7 ); // B2
|
||||||
|
WRITE_BYTE( 255 ); // A2
|
||||||
|
WRITE_SHORT( 0 ); // Fade-in Time
|
||||||
|
WRITE_SHORT( 15 ); // Fade-out Time
|
||||||
|
WRITE_SHORT( 448 ); // Hold time
|
||||||
|
WRITE_STRING( szInfo ); // Message
|
||||||
|
MESSAGE_END();
|
||||||
|
|
||||||
|
// Delay till next scan
|
||||||
|
g_NextMessage[ ENTINDEX( pPlayer ) ] = gpGlobals->time + 0.30;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1364,6 +1422,14 @@ void mmServerActivate( edict_t *pEdictList, int edictCount, int clientMax )
|
|||||||
monsters[index].killed = FALSE; // not killed yet
|
monsters[index].killed = FALSE; // not killed yet
|
||||||
monsters[index].pMonster = NULL;
|
monsters[index].pMonster = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (index = 0; index < 33; index++)
|
||||||
|
{
|
||||||
|
g_DamageAttacker[index] = NULL;
|
||||||
|
g_DamageBits[index] = 0;
|
||||||
|
g_PlayerKilled[index] = false;
|
||||||
|
g_NextMessage[index] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
monster_ents_used = 0;
|
monster_ents_used = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -1520,15 +1520,13 @@ Vector VecBModelOrigin( entvars_t* pevBModel )
|
|||||||
|
|
||||||
bool UTIL_IsAlive(entvars_t *pev)
|
bool UTIL_IsAlive(entvars_t *pev)
|
||||||
{
|
{
|
||||||
return ((pev->deadflag == DEAD_NO) && (pev->health > 0) &&
|
return ((pev->deadflag == DEAD_NO) && (pev->health > 0));
|
||||||
((pev->flags & FL_NOTARGET) == 0) && (pev->takedamage != 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool UTIL_IsAlive(edict_t *pEdict)
|
bool UTIL_IsAlive(edict_t *pEdict)
|
||||||
{
|
{
|
||||||
return ((pEdict->v.deadflag == DEAD_NO) && (pEdict->v.health > 0) &&
|
return ((pEdict->v.deadflag == DEAD_NO) && (pEdict->v.health > 0));
|
||||||
((pEdict->v.flags & FL_NOTARGET) == 0) && (pEdict->v.takedamage != 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1677,8 +1675,8 @@ int UTIL_TakeDamage( edict_t *pEdict, entvars_t *pevInflictor, entvars_t *pevAtt
|
|||||||
flBonus = ARMOR_BONUS;
|
flBonus = ARMOR_BONUS;
|
||||||
flRatio = ARMOR_RATIO;
|
flRatio = ARMOR_RATIO;
|
||||||
|
|
||||||
if (!pEdict->v.takedamage)
|
if (!pEdict->v.takedamage || (pEdict->v.flags & FL_GODMODE))
|
||||||
return 0;
|
return 0; // refuse the damage
|
||||||
|
|
||||||
if ( ( bitsDamageType & DMG_BLAST ) )
|
if ( ( bitsDamageType & DMG_BLAST ) )
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user