The "really" invisible player is invisible for bots as long he (the player) is not pressing the fire button. In that case the bot code presuposes hat the fire from the weapon should be seen - so the player stays "semi-visible" (the bot s trying to aim his body origin - never the head).
Code:
bool FBoxVisible (bot_t *pBot, edict_t *pTargetEdict, Vector *pvHit, unsigned char *ucBodyPart) // KWo - 23.03.2012 - rewritten...
{
// KWo - 05.09.2009 - changed variables to static ones
static int i;
static int RenderFx; // KWo - 22.03.2008
static int RenderMode; // KWo - 22.03.2008
static int TargetEntIndex; // KWo - 17.01.2011
static int TargetWeapon; // KWo - 17.01.2011
static Vector RenderColor; // KWo - 22.03.2008
static float RenderAmount; // KWo - 22.03.2008
static float LightLevel; // KWo - 23.03.2008
static bool SemiTransparent; // KWo - 22.03.2008
static bool WeaponIsGun; // KWo - 17.01.2011
static TraceResult tr;
static Vector vecLookerOrigin;
static Vector vecTarget;
static Vector vecEnDirection;
static edict_t *pEdict;
*ucBodyPart = 0;
*pvHit = g_vecZero; // KWo - 04.07.2008
pEdict = pBot->pEdict; // KWo - 27.05.2008
if (FNullEnt(pTargetEdict)) // KWo - 17.01.2011
return (FALSE);
TargetEntIndex = ENTINDEX (pTargetEdict) - 1; // 17.01.2011
if ((TargetEntIndex >= 0) && (TargetEntIndex < gpGlobals->maxClients))
{
TargetWeapon = clients[TargetEntIndex].iCurrentWeaponId; // 17.01.2011
WeaponIsGun = (WeaponIsPistol(TargetWeapon) || WeaponIsPrimaryGun(TargetWeapon)); // 17.01.2011
}
else
WeaponIsGun = FALSE;
// Can't see the target entity if blinded or smoked...
if ((pEdict->v.origin - pTargetEdict->v.origin).Length() > pBot->f_view_distance) // KWo - 14.09.2008
return (FALSE);
// don't look through water
if (((pEdict->v.waterlevel != 3) && (pTargetEdict->v.waterlevel == 3))
|| ((pEdict->v.waterlevel == 3) && (pTargetEdict->v.waterlevel == 0)))
return (FALSE);
// KWo - 22.03.2008 - added invisibility check
RenderFx = pTargetEdict->v.renderfx;
RenderMode = pTargetEdict->v.rendermode;
RenderColor = pTargetEdict->v.rendercolor;
RenderAmount = pTargetEdict->v.renderamt;
SemiTransparent = false; // KWo (moved) - 05.09.2009
if (((RenderFx == kRenderFxExplode) || (pTargetEdict->v.effects & EF_NODRAW))
&& (!(WeaponIsGun) || !(pTargetEdict->v.oldbuttons & IN_ATTACK))) // kRenderFxExplode is always invisible even for mode kRenderNormal
{
return (FALSE);
}
else if (((RenderFx == kRenderFxExplode) || (pTargetEdict->v.effects & EF_NODRAW))
&& (pTargetEdict->v.oldbuttons & IN_ATTACK) && (WeaponIsGun)) // KWo - 17.01.2011
{
SemiTransparent = true;
}
else if ((RenderFx != kRenderFxHologram) && (RenderMode != kRenderNormal)) // kRenderFxHologram is always visible no matter what is the mode
{
if (RenderFx == kRenderFxGlowShell)
{
if ((RenderAmount <= 20.0) && (RenderColor.x <= 20)
&& (RenderColor.y <= 20) && (RenderColor.z <= 20))
{
if (!(pTargetEdict->v.oldbuttons & IN_ATTACK) || !(WeaponIsGun))
{
return (FALSE);
}
else
{
SemiTransparent = true;
}
}
else if ((RenderAmount <= 60.0) && (RenderColor.x <= 60)
&& (RenderColor.y <= 60) && (RenderColor.z <= 60))
{
SemiTransparent = true;
}
}
else
{
if (RenderAmount <= 20)
{
if (!(pTargetEdict->v.oldbuttons & IN_ATTACK) || !(WeaponIsGun))
{
return (FALSE);
}
else
{
SemiTransparent = true;
}
}
else if (RenderAmount <= 60)
{
SemiTransparent = true;
}
}
}
// KWo - 26.03.2008 - added darkness check
LightLevel = UTIL_IlluminationOf(pTargetEdict);
// ALERT(at_logged,"[DEBUG] Bot %s checks the illumination of %s. It's = %f.\n",
// STRING(pEdict->v.netname), STRING(pTargetEdict->v.netname), LightLevel);
if ((!pBot->bUsesNVG) && (((LightLevel < 3.0) && (g_f_cv_skycolor > 50.0)) || ((LightLevel < 25.0) && (g_f_cv_skycolor <= 50.0)))
&& (!(pTargetEdict->v.effects & EF_DIMLIGHT)) && (!(pTargetEdict->v.oldbuttons & IN_ATTACK) || !(WeaponIsGun))) // KWo - 17.01.2011
{
return (FALSE);
}
else if (((((LightLevel < 10.0) && (g_f_cv_skycolor > 50.0)) || ((LightLevel < 30.0) && (g_f_cv_skycolor <= 50.0)))
&& (pTargetEdict->v.oldbuttons & IN_ATTACK) && (WeaponIsGun)) && (!(pTargetEdict->v.effects & EF_DIMLIGHT)) && (!pBot->bUsesNVG)) // KWo - 17.01.2011
{
SemiTransparent = true; // in this case we can notice the enemy, but not so good...
}
// if (SemiTransparent)
// ALERT(at_logged, "[DEBUG] FBoxVisible - Bot's %s target SemiTransparent = true, LightLevel = %.2f \n", pBot->name, LightLevel);
vecLookerOrigin = GetGunPosition (pEdict);
vecTarget = pTargetEdict->v.origin;
// Check direct Line to waist
UTIL_TraceLine (vecLookerOrigin, vecTarget, ignore_monsters, ignore_glass, pEdict, &tr);
if ((tr.flFraction >= 1.0) || (tr.pHit == pTargetEdict))
{
*pvHit = tr.vecEndPos + Vector (0.0, 0.0, 3.0); // KWo - 13.07.2008
*ucBodyPart |= WAIST_VISIBLE;
}
vecEnDirection = pTargetEdict->v.angles; // KWo - 05.09.2009 (moved)
MAKE_VECTORS (vecEnDirection);
// Check direct Line to head
vecTarget = vecTarget + pTargetEdict->v.view_ofs + Vector(0.0, 0.0, 2.0); // KWo - 02.04.2010
if (!(pTargetEdict->v.oldbuttons & IN_DUCK)) // KWo - 13.07.2008
{
vecTarget = vecTarget + Vector(0.0, 0.0, 1.0); // KWo - 02.04.2010
}
UTIL_TraceLine (vecLookerOrigin, vecTarget, ignore_monsters, ignore_glass, pEdict, &tr);
// if the player is rendered, his head cannot be good seen...
if (((tr.flFraction >= 1.0) || (tr.pHit == pTargetEdict)) && (!SemiTransparent))
{
*pvHit = tr.vecEndPos;
*ucBodyPart |= HEAD_VISIBLE;
}
if (*ucBodyPart != 0)
return (TRUE);
// Nothing visible - check randomly other Parts of Body
for (i = 0; i < 6; i++)
{
vecTarget = pTargetEdict->v.origin;
switch(i)
{
case 0: // left arm
{
vecTarget.x -= 10.0 * gpGlobals->v_right.x;
vecTarget.y -= 10.0 * gpGlobals->v_right.y;
vecTarget.z += 8.0;
break;
}
case 1: // right arm
{
vecTarget.x += 10.0 * gpGlobals->v_right.x;
vecTarget.y += 10.0 * gpGlobals->v_right.y;
vecTarget.z += 8.0;
break;
}
case 2: // left leg
{
vecTarget.x -= 10.0 * gpGlobals->v_right.x;
vecTarget.y -= 10.0 * gpGlobals->v_right.y;
vecTarget.z -= 12.0;
break;
}
case 3: // right leg
{
vecTarget.x += 10.0 * gpGlobals->v_right.x;
vecTarget.y += 10.0 * gpGlobals->v_right.y;
vecTarget.z -= 12.0;
break;
}
case 4: // left foot
{
vecTarget.x -= 10.0 * gpGlobals->v_right.x;
vecTarget.y -= 10.0 * gpGlobals->v_right.y;
vecTarget.z -= 24.0;
break;
}
case 5: // right foot
{
vecTarget.x += 10.0 * gpGlobals->v_right.x;
vecTarget.y += 10.0 * gpGlobals->v_right.y;
vecTarget.z -= 24.0;
break;
}
}
/*
vecTarget.x += RANDOM_FLOAT (pTargetEdict->v.mins.x, pTargetEdict->v.maxs.x);
vecTarget.y += RANDOM_FLOAT (pTargetEdict->v.mins.y, pTargetEdict->v.maxs.y);
vecTarget.z += RANDOM_FLOAT (pTargetEdict->v.mins.z, pTargetEdict->v.maxs.z);
*/
UTIL_TraceLine (vecLookerOrigin, vecTarget, dont_ignore_monsters, ignore_glass, pEdict, &tr);
if ((tr.flFraction >= 1.0) && (tr.pHit == pTargetEdict))
{
// Return seen position
*pvHit = tr.vecEndPos;
*ucBodyPart |= CUSTOM_VISIBLE;
return (TRUE);
}
}
return (FALSE);
}
__________________
The Fullpack of podbot mm
V3B22 - 24 apr 2012!!! is available
here.
The All-In-One 3.2a package - 02 jun 2013 (
AMX X 1.8.2 [with ATAC 3.0.1b , CSDM2.1.3c beta, CM OE 0.6.5, podbot mm V3B22c and mm 1.20) is available
here.
The newest Beta V3B23a (rel. 28 august 2018!!!) is available
here.