small optimizations and code style fixes
This commit is contained in:
parent
ff036d8215
commit
c28110cce2
12 changed files with 220 additions and 200 deletions
|
|
@ -90,8 +90,6 @@ using namespace Math;
|
|||
#define DLL_RETENTRY return
|
||||
#define DLL_GIVEFNPTRSTODLL extern "C" void __attribute__((visibility("default")))
|
||||
|
||||
static inline uint32 _lrotl (uint32 x, int r) { return (x << r) | (x >> (sizeof (x) * 8 - r));}
|
||||
|
||||
typedef int (*EntityAPI_t) (gamefuncs_t *, int);
|
||||
typedef int (*NewEntityAPI_t) (newgamefuncs_t *, int *);
|
||||
typedef int (*BlendAPI_t) (int, void **, void *, float (*)[3][4], float (*)[128][3][4]);
|
||||
|
|
@ -242,7 +240,8 @@ enum CollisionState
|
|||
COLLISION_JUMP,
|
||||
COLLISION_DUCK,
|
||||
COLLISION_STRAFELEFT,
|
||||
COLLISION_STRAFERIGHT
|
||||
COLLISION_STRAFERIGHT,
|
||||
COLLISION_BACKOFF
|
||||
};
|
||||
|
||||
// counter-strike team id's
|
||||
|
|
@ -409,7 +408,8 @@ enum CollisionProbe
|
|||
{
|
||||
PROBE_JUMP = (1 << 0), // probe jump when colliding
|
||||
PROBE_DUCK = (1 << 1), // probe duck when colliding
|
||||
PROBE_STRAFE = (1 << 2) // probe strafing when colliding
|
||||
PROBE_STRAFE = (1 << 2), // probe strafing when colliding
|
||||
PROBE_BACKOFF = (1 << 3) // probe going back when colliding
|
||||
};
|
||||
|
||||
// vgui menus (since latest steam updates is obsolete, but left for old cs)
|
||||
|
|
@ -857,7 +857,7 @@ private:
|
|||
float m_lastCollTime; // time until next collision check
|
||||
|
||||
unsigned int m_collisionProbeBits; // bits of possible collision moves
|
||||
unsigned int m_collideMoves[4]; // sorted array of movements
|
||||
unsigned int m_collideMoves[5]; // sorted array of movements
|
||||
unsigned int m_collStateIndex; // index into collide moves
|
||||
CollisionState m_collisionState; // collision State
|
||||
|
||||
|
|
@ -1051,8 +1051,8 @@ private:
|
|||
bool OutOfBombTimer (void);
|
||||
void SelectLeaderEachTeam (int team);
|
||||
|
||||
Vector CheckToss (const Vector &start, Vector end);
|
||||
Vector CheckThrow (const Vector &start, Vector end);
|
||||
const Vector &CheckThrow (const Vector &start, const Vector &stop);
|
||||
const Vector &CheckToss (const Vector &start, const Vector &stop);
|
||||
Vector CheckBombAudible (void);
|
||||
|
||||
const Vector &GetAimPosition (void);
|
||||
|
|
@ -1279,10 +1279,9 @@ private:
|
|||
Array <CreateQueue> m_creationTab; // bot creation tab
|
||||
|
||||
Bot *m_bots[32]; // all available bots
|
||||
float m_maintainTime; // time to maintain bot creation quota
|
||||
|
||||
float m_maintainTime; // time to maintain bot creation quota
|
||||
int m_lastWinner; // the team who won previous round
|
||||
int m_roundCount; // rounds passed
|
||||
|
||||
bool m_economicsGood[2]; // is team able to buy anything
|
||||
bool m_deathMsgSent; // for fakeping
|
||||
|
|
@ -1291,7 +1290,7 @@ private:
|
|||
Array <entity_t> m_activeGrenades;
|
||||
|
||||
protected:
|
||||
int CreateBot (String name, int difficulty, int personality, int team, int member);
|
||||
int CreateBot (const String &name, int difficulty, int personality, int team, int member);
|
||||
|
||||
public:
|
||||
BotManager (void);
|
||||
|
|
@ -1320,7 +1319,7 @@ public:
|
|||
|
||||
void AddRandom (void) { AddBot ("", -1, -1, -1, -1); }
|
||||
void AddBot (const String &name, int difficulty, int personality, int team, int member);
|
||||
void AddBot (String name, String difficulty, String personality, String team, String member);
|
||||
void AddBot (const String &name, const String &difficulty, const String &personality, const String &team, const String &member);
|
||||
void FillServer (int selection, int personality = PERSONALITY_NORMAL, int difficulty = -1, int numToAdd = -1);
|
||||
|
||||
void RemoveAll (bool zeroQuota = true);
|
||||
|
|
@ -1635,7 +1634,7 @@ extern bool TryFileOpen (const char *fileName);
|
|||
extern bool IsDedicatedServer (void);
|
||||
extern bool IsVisible (const Vector &origin, edict_t *ent);
|
||||
extern bool IsAlive (edict_t *ent);
|
||||
extern bool IsInViewCone (Vector origin, edict_t *ent);
|
||||
extern bool IsInViewCone (const Vector &origin, edict_t *ent);
|
||||
extern int GetWeaponPenetrationPower (int id);
|
||||
extern bool IsValidBot (edict_t *ent);
|
||||
extern bool IsValidPlayer (edict_t *ent);
|
||||
|
|
@ -1665,7 +1664,6 @@ extern void ServerPrint (const char *format, ...);
|
|||
extern void ChartPrint (const char *format, ...);
|
||||
extern void CenterPrint (const char *format, ...);
|
||||
extern void ClientPrint (edict_t *ent, int dest, const char *format, ...);
|
||||
extern void HudMessage (edict_t *ent, bool toCenter, Vector rgb, char *format, ...);
|
||||
|
||||
extern void AddLogEntry (bool outputToConsole, int logLevel, const char *format, ...);
|
||||
extern void TraceLine (const Vector &start, const Vector &end, bool ignoreMonsters, bool ignoreGlass, edict_t *ignoreEntity, TraceResult *ptr);
|
||||
|
|
|
|||
|
|
@ -212,10 +212,10 @@ namespace Math
|
|||
{
|
||||
fld dword ptr[rad]
|
||||
fsincos
|
||||
mov edx, dword ptr[cos]
|
||||
mov eax, dword ptr[sin]
|
||||
fstp dword ptr[edx]
|
||||
fstp dword ptr[eax]
|
||||
mov ebx, [cos]
|
||||
fstp dword ptr[ebx]
|
||||
mov ebx, [sin]
|
||||
fstp dword ptr[ebx]
|
||||
}
|
||||
#elif defined (__linux__) || defined (GCC) || defined (__APPLE__)
|
||||
register double _cos, _sin;
|
||||
|
|
@ -369,15 +369,6 @@ public:
|
|||
return &x;
|
||||
}
|
||||
|
||||
inline float &operator [] (int index)
|
||||
{
|
||||
return (&x)[index];
|
||||
}
|
||||
|
||||
inline const float &operator [] (int index) const
|
||||
{
|
||||
return (&x)[index];
|
||||
}
|
||||
|
||||
inline const Vector operator + (const Vector &right) const
|
||||
{
|
||||
|
|
@ -410,11 +401,13 @@ public:
|
|||
return Vector (inv * x, inv * y, inv * z);
|
||||
}
|
||||
|
||||
// cross product
|
||||
inline const Vector operator ^ (const Vector &right) const
|
||||
{
|
||||
return Vector (y * right.z - z * right.y, z * right.x - x * right.z, x * right.y - y * right.x);
|
||||
}
|
||||
|
||||
// dot product
|
||||
inline float operator | (const Vector &right) const
|
||||
{
|
||||
return x * right.x + y * right.y + z * right.z;
|
||||
|
|
@ -545,14 +538,14 @@ public:
|
|||
}
|
||||
|
||||
//
|
||||
// Function: SkipZ
|
||||
// Function: Get2D
|
||||
//
|
||||
// Gets vector without Z axis.
|
||||
//
|
||||
// Returns:
|
||||
// 2D vector from 3D vector.
|
||||
//
|
||||
inline Vector SkipZ (void) const
|
||||
inline Vector Get2D (void) const
|
||||
{
|
||||
return Vector (x, y, 0.0f);
|
||||
}
|
||||
|
|
@ -2473,7 +2466,7 @@ public:
|
|||
// Returns:
|
||||
// Integer value of string.
|
||||
//
|
||||
int ToInt (void)
|
||||
int ToInt (void) const
|
||||
{
|
||||
return atoi (m_bufferPtr);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -348,7 +348,7 @@ typedef struct
|
|||
void (*pfnSetupVisibility) (struct edict_s *pViewEntity, struct edict_s *client, unsigned char **pvs, unsigned char **pas);
|
||||
void (*pfnUpdateClientData) (const struct edict_s *ent, int sendweapons, struct clientdata_s *cd);
|
||||
int (*pfnAddToFullPack) (struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet);
|
||||
void (*pfnCreateBaseline) (int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs);
|
||||
void (*pfnCreateBaseline) (int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, float* player_mins, float* player_maxs);
|
||||
void (*pfnRegisterEncoders) (void);
|
||||
int (*pfnGetWeaponData) (struct edict_s *player, struct weapon_data_s *info);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,15 +13,15 @@
|
|||
#define PRODUCT_NAME "Yet Another POD-Bot"
|
||||
#define PRODUCT_VERSION "2.7"
|
||||
#define PRODUCT_AUTHOR "YaPB Dev Team"
|
||||
#define PRODUCT_URL "http://yapb.ru/"
|
||||
#define PRODUCT_URL "http://yapb.jeefo.net"
|
||||
#define PRODUCT_EMAIL "dmitry@jeefo.net"
|
||||
#define PRODUCT_LOGTAG "YAPB"
|
||||
#define PRODUCT_DESCRIPTION PRODUCT_NAME " v" PRODUCT_VERSION " - The Counter-Strike Bot"
|
||||
#define PRODUCT_COPYRIGHT "Copyright © 2015, by " PRODUCT_AUTHOR
|
||||
#define PRODUCT_COPYRIGHT "Copyright © 2003-2015, by " PRODUCT_AUTHOR
|
||||
#define PRODUCT_LEGAL "Half-Life, Counter-Strike, Counter-Strike: Condition Zero, Steam, Valve is a trademark of Valve Corporation"
|
||||
#define PRODUCT_ORIGINAL_NAME "yapb.dll"
|
||||
#define PRODUCT_INTERNAL_NAME "podbot"
|
||||
#define PRODUCT_VERSION_DWORD 2,7,0,0 // major version, minor version, WIP (or Update) version
|
||||
#define PRODUCT_VERSION_DWORD 2,7,0,0
|
||||
#define PRODUCT_SUPPORT_VERSION "1.0 - CZ"
|
||||
#define PRODUCT_COMMENTS "http://github.com/jeefo/yapb/"
|
||||
#define PRODUCT_DATE __DATE__
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ void Bot::CheckGrenadeThrow (void)
|
|||
|
||||
if (allowThrowing && m_seeEnemyTime + 2.0 < GetWorldTime ())
|
||||
{
|
||||
const Vector &enemyPredict = ((m_lastEnemy->v.velocity * 0.5).SkipZ () + m_lastEnemy->v.origin);
|
||||
const Vector &enemyPredict = ((m_lastEnemy->v.velocity * 0.5).Get2D () + m_lastEnemy->v.origin);
|
||||
int searchTab[4], count = 4;
|
||||
|
||||
float searchRadius = m_lastEnemy->v.velocity.GetLength2D ();
|
||||
|
|
@ -345,7 +345,7 @@ void Bot::CheckGrenadeThrow (void)
|
|||
bool allowThrowing = true;
|
||||
Array <int> inRadius;
|
||||
|
||||
g_waypoint->FindInRadius (inRadius, 256, m_lastEnemy->v.origin + (m_lastEnemy->v.velocity * 0.5).SkipZ ());
|
||||
g_waypoint->FindInRadius (inRadius, 256, m_lastEnemy->v.origin + (m_lastEnemy->v.velocity * 0.5).Get2D ());
|
||||
|
||||
IterateArray (inRadius, i)
|
||||
{
|
||||
|
|
@ -683,7 +683,6 @@ void Bot::FindItem (void)
|
|||
edict_t *ent = NULL, *pickupItem = NULL;
|
||||
Bot *bot = NULL;
|
||||
|
||||
bool allowPickup = false;
|
||||
float distance, minDistance = 341.0;
|
||||
|
||||
const float searchRadius = 340.0f;
|
||||
|
|
@ -727,6 +726,8 @@ void Bot::FindItem (void)
|
|||
m_pickupItem = NULL;
|
||||
m_pickupType = PICKUP_NONE;
|
||||
|
||||
bool allowPickup = false;
|
||||
|
||||
while (!IsEntityNull (ent = FIND_ENTITY_IN_SPHERE (ent, pev->origin, searchRadius)))
|
||||
{
|
||||
allowPickup = false; // assume can't use it until known otherwise
|
||||
|
|
@ -1081,14 +1082,13 @@ void Bot::SwitchChatterIcon (bool show)
|
|||
if (g_gameVersion == CSV_OLD || yb_communication_type.GetInt () != 2)
|
||||
return;
|
||||
|
||||
|
||||
for (int i = 0; i < GetMaxClients (); i++)
|
||||
{
|
||||
edict_t *ent = EntityOfIndex (i);
|
||||
|
||||
if (!(ent->v.flags & FL_CLIENT) || (ent->v.flags & FL_FAKECLIENT) || GetTeam (ent) != m_team)
|
||||
if (!(g_clients[i].flags & CF_USED) || (g_clients[i].ent->v.flags & FL_FAKECLIENT) || g_clients[i].team != m_team)
|
||||
continue;
|
||||
|
||||
MESSAGE_BEGIN (MSG_ONE, g_netMsg->GetId (NETMSG_BOTVOICE), NULL, ent); // begin message
|
||||
MESSAGE_BEGIN (MSG_ONE, g_netMsg->GetId (NETMSG_BOTVOICE), NULL, g_clients[i].ent); // begin message
|
||||
WRITE_BYTE (show); // switch on/off
|
||||
WRITE_BYTE (GetIndex ());
|
||||
MESSAGE_END ();
|
||||
|
|
@ -2067,8 +2067,6 @@ void Bot::SetConditions (void)
|
|||
g_taskFilters[TASK_PICKUPITEM].desire = 0.0;
|
||||
}
|
||||
|
||||
float desireLevel = 0.0;
|
||||
|
||||
// calculate desire to attack
|
||||
if ((m_states & STATE_SEEING_ENEMY) && ReactOnEnemy ())
|
||||
g_taskFilters[TASK_ATTACK].desire = TASKPRI_ATTACK;
|
||||
|
|
@ -2109,7 +2107,8 @@ void Bot::SetConditions (void)
|
|||
// FIXME: it probably should be also team/map dependant
|
||||
if (IsEntityNull (m_enemy) && g_timeRoundMid < GetWorldTime () && !m_isUsingGrenade && m_currentWaypointIndex != g_waypoint->FindNearest (m_lastEnemyOrigin) && m_personality != PERSONALITY_CAREFUL)
|
||||
{
|
||||
desireLevel = 4096.0 - ((1.0 - tempAgression) * distance);
|
||||
float desireLevel = 4096.0 - ((1.0 - tempAgression) * distance);
|
||||
|
||||
desireLevel = (100 * desireLevel) / 4096.0;
|
||||
desireLevel -= retreatLevel;
|
||||
|
||||
|
|
@ -2727,10 +2726,11 @@ void Bot::CheckRadioCommands (void)
|
|||
|
||||
g_timeNextBombUpdate = GetWorldTime () + 0.5;
|
||||
}
|
||||
// Does this Bot want to defuse?
|
||||
|
||||
// does this bot want to defuse?
|
||||
if (GetTaskId () == TASK_NORMAL)
|
||||
{
|
||||
// Is he approaching this goal?
|
||||
// is he approaching this goal?
|
||||
if (GetTask ()->data == bombPoint)
|
||||
{
|
||||
GetTask ()->data = -1;
|
||||
|
|
@ -3605,7 +3605,7 @@ void Bot::RunTask (void)
|
|||
|
||||
if (!IsEntityNull (m_enemy))
|
||||
{
|
||||
m_lastCollTime = GetWorldTime () + 0.5f;
|
||||
ResetCollideState ();
|
||||
|
||||
if (IsOnLadder ())
|
||||
{
|
||||
|
|
@ -3617,8 +3617,6 @@ void Bot::RunTask (void)
|
|||
else
|
||||
{
|
||||
TaskComplete ();
|
||||
FindWaypoint ();
|
||||
|
||||
m_destOrigin = m_lastEnemyOrigin;
|
||||
}
|
||||
m_navTimeset = GetWorldTime ();
|
||||
|
|
@ -4220,13 +4218,12 @@ void Bot::RunTask (void)
|
|||
|
||||
if (!(m_states & STATE_SEEING_ENEMY))
|
||||
{
|
||||
m_moveSpeed = 0.0;
|
||||
m_strafeSpeed = 0.0;
|
||||
|
||||
m_strafeSpeed = 0.0f;
|
||||
m_moveSpeed = 0.0f;
|
||||
m_moveToGoal = false;
|
||||
}
|
||||
else if (!(m_states & STATE_SUSPECT_ENEMY) && !IsEntityNull (m_enemy))
|
||||
destination = m_enemy->v.origin + (m_enemy->v.velocity.SkipZ () * 0.5);
|
||||
destination = m_enemy->v.origin + (m_enemy->v.velocity.Get2D () * 0.5);
|
||||
|
||||
m_isUsingGrenade = true;
|
||||
m_checkTerrain = false;
|
||||
|
|
@ -4297,13 +4294,11 @@ void Bot::RunTask (void)
|
|||
|
||||
if (!(m_states & STATE_SEEING_ENEMY))
|
||||
{
|
||||
m_moveSpeed = 0.0;
|
||||
m_strafeSpeed = 0.0;
|
||||
|
||||
m_moveToGoal = false;
|
||||
m_strafeSpeed = 0.0f;
|
||||
m_moveSpeed = 0.0f;
|
||||
}
|
||||
else if (!(m_states & STATE_SUSPECT_ENEMY) && !IsEntityNull (m_enemy))
|
||||
destination = m_enemy->v.origin + (m_enemy->v.velocity.SkipZ () * 0.5);
|
||||
destination = m_enemy->v.origin + (m_enemy->v.velocity.Get2D () * 0.5);
|
||||
|
||||
m_isUsingGrenade = true;
|
||||
m_checkTerrain = false;
|
||||
|
|
@ -4361,10 +4356,8 @@ void Bot::RunTask (void)
|
|||
|
||||
if (!(m_states & STATE_SEEING_ENEMY))
|
||||
{
|
||||
m_moveSpeed = 0.0;
|
||||
m_strafeSpeed = 0.0;
|
||||
|
||||
m_moveToGoal = false;
|
||||
m_strafeSpeed = 0.0f;
|
||||
m_moveSpeed = 0.0f;
|
||||
}
|
||||
|
||||
m_checkTerrain = false;
|
||||
|
|
@ -5029,14 +5022,13 @@ void Bot::BotAI (void)
|
|||
pev->button |= IN_MOVELEFT;
|
||||
}
|
||||
|
||||
static float timeDebugUpdate = 0.0;
|
||||
|
||||
if (!IsEntityNull (g_hostEntity) && yb_debug.GetInt () >= 1)
|
||||
{
|
||||
int specIndex = g_hostEntity->v.iuser2;
|
||||
|
||||
if (specIndex == IndexOfEntity (GetEntity ()))
|
||||
{
|
||||
static float timeDebugUpdate = 0.0;
|
||||
static int index, goal, taskID;
|
||||
|
||||
if (!m_tasks.IsEmpty ())
|
||||
|
|
@ -5169,14 +5161,14 @@ void Bot::BotAI (void)
|
|||
|
||||
// set the aim flags
|
||||
sprintf (aimFlags, "%s%s%s%s%s%s%s%s",
|
||||
m_aimFlags & AIM_NAVPOINT ? " NavPoint" : "",
|
||||
m_aimFlags & AIM_CAMP ? " CampPoint" : "",
|
||||
m_aimFlags & AIM_PREDICT_PATH ? " PredictPath" : "",
|
||||
m_aimFlags & AIM_LAST_ENEMY ? " LastEnemy" : "",
|
||||
m_aimFlags & AIM_ENTITY ? " Entity" : "",
|
||||
m_aimFlags & AIM_ENEMY ? " Enemy" : "",
|
||||
m_aimFlags & AIM_GRENADE ? " Grenade" : "",
|
||||
m_aimFlags & AIM_OVERRIDE ? " Override" : "");
|
||||
(m_aimFlags & AIM_NAVPOINT) ? " NavPoint" : "",
|
||||
(m_aimFlags & AIM_CAMP) ? " CampPoint" : "",
|
||||
(m_aimFlags & AIM_PREDICT_PATH) ? " PredictPath" : "",
|
||||
(m_aimFlags & AIM_LAST_ENEMY) ? " LastEnemy" : "",
|
||||
(m_aimFlags & AIM_ENTITY) ? " Entity" : "",
|
||||
(m_aimFlags & AIM_ENEMY) ? " Enemy" : "",
|
||||
(m_aimFlags & AIM_GRENADE) ? " Grenade" : "",
|
||||
(m_aimFlags & AIM_OVERRIDE) ? " Override" : "");
|
||||
|
||||
// set the bot type
|
||||
sprintf (botType, "%s%s%s", m_personality == PERSONALITY_RUSHER ? " Rusher" : "",
|
||||
|
|
@ -5652,7 +5644,7 @@ void Bot::DebugMsg (const char *format, ...)
|
|||
AddLogEntry (false, LL_DEFAULT, "%s: %s", STRING (pev->netname), buffer);
|
||||
}
|
||||
|
||||
Vector Bot::CheckToss (const Vector &start, Vector end)
|
||||
const Vector &Bot::CheckToss (const Vector &start, const Vector &stop)
|
||||
{
|
||||
// this function returns the velocity at which an object should looped from start to land near end.
|
||||
// returns null vector if toss is not feasible.
|
||||
|
|
@ -5660,7 +5652,7 @@ Vector Bot::CheckToss (const Vector &start, Vector end)
|
|||
TraceResult tr;
|
||||
float gravity = sv_gravity.GetFloat () * 0.55;
|
||||
|
||||
end = end - pev->velocity;
|
||||
Vector end = stop - pev->velocity;
|
||||
end.z -= 15.0;
|
||||
|
||||
if (fabsf (end.z - start.z) > 500.0)
|
||||
|
|
@ -5707,12 +5699,12 @@ Vector Bot::CheckToss (const Vector &start, Vector end)
|
|||
return nadeVelocity * 0.777;
|
||||
}
|
||||
|
||||
Vector Bot::CheckThrow (const Vector &start, Vector end)
|
||||
const Vector &Bot::CheckThrow (const Vector &start, const Vector &stop)
|
||||
{
|
||||
// this function returns the velocity vector at which an object should be thrown from start to hit end.
|
||||
// returns null vector if throw is not feasible.
|
||||
|
||||
Vector nadeVelocity = (end - start);
|
||||
Vector nadeVelocity = (stop - start);
|
||||
TraceResult tr;
|
||||
|
||||
float gravity = sv_gravity.GetFloat () * 0.55;
|
||||
|
|
@ -5726,7 +5718,7 @@ Vector Bot::CheckThrow (const Vector &start, Vector end)
|
|||
nadeVelocity = nadeVelocity * (1.0 / time);
|
||||
nadeVelocity.z += gravity * time * 0.5;
|
||||
|
||||
Vector apex = start + (end - start) * 0.5;
|
||||
Vector apex = start + (stop - start) * 0.5;
|
||||
apex.z += 0.5 * gravity * (time * 0.5) * (time * 0.5);
|
||||
|
||||
TraceHull (start, apex, false, head_hull, GetEntity (), &tr);
|
||||
|
|
@ -5734,11 +5726,11 @@ Vector Bot::CheckThrow (const Vector &start, Vector end)
|
|||
if (tr.flFraction != 1.0)
|
||||
return nullvec;
|
||||
|
||||
TraceHull (end, apex, true, head_hull, GetEntity (), &tr);
|
||||
TraceHull (stop, apex, true, head_hull, GetEntity (), &tr);
|
||||
|
||||
if (tr.flFraction != 1.0 || tr.fAllSolid)
|
||||
{
|
||||
float dot = -(tr.vecPlaneNormal | (apex - end).Normalize ());
|
||||
float dot = -(tr.vecPlaneNormal | (apex - stop).Normalize ());
|
||||
|
||||
if (dot > 0.7 || tr.flFraction < 0.8)
|
||||
return nullvec;
|
||||
|
|
|
|||
|
|
@ -15,8 +15,8 @@ void StripTags (char *buffer)
|
|||
{
|
||||
// this function strips 'clan' tags specified below in given string buffer
|
||||
|
||||
char *tagOpen[] = {"-=", "-[", "-]", "-}", "-{", "<[", "<]", "[-", "]-", "{-", "}-", "[[", "[", "{", "]", "}", "<", ">", "-", "|", "=", "+"};
|
||||
char *tagClose[] = {"=-", "]-", "[-", "{-", "}-", "]>", "[>", "-]", "-[", "-}", "-{", "]]", "]", "}", "[", "{", ">", "<", "-", "|", "=", "+"};
|
||||
char *tagOpen[] = {"-=", "-[", "-]", "-}", "-{", "<[", "<]", "[-", "]-", "{-", "}-", "[[", "[", "{", "]", "}", "<", ">", "-", "|", "=", "+", "(", ")"};
|
||||
char *tagClose[] = {"=-", "]-", "[-", "{-", "}-", "]>", "[>", "-]", "-[", "-}", "-{", "]]", "]", "}", "[", "{", ">", "<", "-", "|", "=", "+", ")", "("};
|
||||
|
||||
int index, fieldStart, fieldStop, i;
|
||||
int length = strlen (buffer); // get length of string
|
||||
|
|
@ -59,7 +59,6 @@ void StripTags (char *buffer)
|
|||
// have we found a tag start?
|
||||
if (fieldStart >= 0 && fieldStart < 32)
|
||||
{
|
||||
fieldStop = fieldStart + strlen (tagOpen[index]); // set the tag stop
|
||||
tagLength = strlen (tagOpen[index]);
|
||||
|
||||
for (i = fieldStart; i < length - tagLength; i++)
|
||||
|
|
@ -72,7 +71,6 @@ void StripTags (char *buffer)
|
|||
// have we found a tag stop ?
|
||||
if (fieldStart >= 0 && fieldStart < 32)
|
||||
{
|
||||
fieldStop = fieldStart + strlen (tagClose[index]); // set the tag
|
||||
tagLength = strlen (tagClose[index]);
|
||||
|
||||
for (i = fieldStart; i < length - tagLength; i++)
|
||||
|
|
|
|||
|
|
@ -329,7 +329,7 @@ const Vector &Bot::GetAimPosition (void)
|
|||
}
|
||||
m_lastEnemyOrigin = targetOrigin;
|
||||
}
|
||||
const Vector &velocity = UsesSniper () ? nullvec : ((1.0f * m_frameInterval * m_enemy->v.velocity - 1.0 * m_frameInterval * pev->velocity) * m_frameInterval).SkipZ ();
|
||||
const Vector &velocity = UsesSniper () ? nullvec : ((1.0f * m_frameInterval * m_enemy->v.velocity - 1.0 * m_frameInterval * pev->velocity) * m_frameInterval).Get2D ();
|
||||
|
||||
if (m_difficulty < 3 && randomize != nullvec)
|
||||
{
|
||||
|
|
@ -560,10 +560,11 @@ bool Bot::DoFirePause (float distance, FireDelay *fireDelay)
|
|||
else
|
||||
offset = 5.0;
|
||||
|
||||
float angle = sqrtf ((fabsf (pev->punchangle.y) * Math::MATH_PI / 180.0) * (fabsf (pev->punchangle.y) * Math::MATH_PI / 180.0) + (fabsf (pev->punchangle.x) * Math::MATH_PI / 180.0) * (fabsf (pev->punchangle.x) * Math::MATH_PI / 180.0));
|
||||
const float xPunch = DegreeToRadian (pev->punchangle.x);
|
||||
const float yPunch = DegreeToRadian (pev->punchangle.y);
|
||||
|
||||
// check if we need to compensate recoil
|
||||
if (tanf (angle) * distance > offset + 30.0f + ((100 - (m_difficulty * 25)) / 100.f))
|
||||
if (tanf (sqrtf (fabsf (xPunch * xPunch) + fabsf (yPunch * yPunch))) * distance > offset + 30.0f + ((100 - (m_difficulty * 25)) / 100.f))
|
||||
{
|
||||
if (m_firePause < GetWorldTime () - 0.4f)
|
||||
m_firePause = GetWorldTime () + Random.Float (0.4f, 0.4f + 0.3f * ((100 - (m_difficulty * 25)) / 100.f));
|
||||
|
|
@ -603,7 +604,7 @@ void Bot::FireWeapon (void)
|
|||
{
|
||||
if (IsFriendInLineOfFire (distance))
|
||||
{
|
||||
m_fightStyle = 1;
|
||||
m_fightStyle = 0;
|
||||
m_lastFightStyleCheck = GetWorldTime ();
|
||||
|
||||
return;
|
||||
|
|
@ -860,7 +861,7 @@ void Bot::FocusEnemy (void)
|
|||
if (m_enemySurpriseTime > GetWorldTime ())
|
||||
return;
|
||||
|
||||
enemyOrigin = (enemyOrigin - EyePosition ()).SkipZ ();
|
||||
enemyOrigin = (enemyOrigin - EyePosition ()).Get2D ();
|
||||
|
||||
float distance = enemyOrigin.GetLength (); // how far away is the enemy scum?
|
||||
|
||||
|
|
@ -910,7 +911,7 @@ void Bot::CombatFight (void)
|
|||
if (m_currentWeapon == WEAPON_KNIFE)
|
||||
m_destOrigin = m_enemy->v.origin;
|
||||
|
||||
enemyOrigin = (enemyOrigin - EyePosition ()).SkipZ (); // ignore z component (up & down)
|
||||
enemyOrigin = (enemyOrigin - EyePosition ()).Get2D (); // ignore z component (up & down)
|
||||
|
||||
float distance = enemyOrigin.GetLength (); // how far away is the enemy scum?
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
//
|
||||
//
|
||||
// Yet Another POD-Bot, based on PODBot by Markus Klinge ("CountFloyd").
|
||||
// Copyright (c) YaPB Development Team.
|
||||
//
|
||||
|
|
@ -211,7 +211,7 @@ int BotCommandHandler (edict_t *ent, const char *arg0, const char *arg1, const c
|
|||
g_hostEntity->v.movetype = MOVETYPE_NOCLIP;
|
||||
ServerPrint ("Noclip Cheat Enabled");
|
||||
}
|
||||
g_editNoclip ^= true; // switch on/off (XOR it!)
|
||||
g_editNoclip = !g_editNoclip; // switch on/off (XOR it!)
|
||||
}
|
||||
ServerCommand ("yapb wp mdl on");
|
||||
}
|
||||
|
|
@ -821,7 +821,7 @@ void InitConfig (void)
|
|||
if (IsDedicatedServer ())
|
||||
return; // dedicated server will use only english translation
|
||||
|
||||
enum Lang_t { Lang_Original, Lang_Translate, Lang_Default } langState = Lang_Default;
|
||||
enum Lang { Lang_Original, Lang_Translate } langState = static_cast <Lang> (2);
|
||||
|
||||
char buffer[1024];
|
||||
LanguageItem temp = {"", ""};
|
||||
|
|
@ -1567,7 +1567,7 @@ void ClientCommand (edict_t *ent)
|
|||
case 2:
|
||||
if (FindNearestPlayer (reinterpret_cast <void **> (&bot), client->ent, 4096.0, true, true, true))
|
||||
{
|
||||
if (!bot->m_hasC4 && !bot->HasHostage () && (bot->GetTaskId () != TASK_PLANTBOMB) && (bot->GetTaskId () != TASK_DEFUSEBOMB))
|
||||
if (!bot->m_hasC4 && !bot->HasHostage () )
|
||||
{
|
||||
if (selection == 1)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ BotManager::BotManager (void)
|
|||
// this is a bot manager class constructor
|
||||
|
||||
m_lastWinner = -1;
|
||||
m_deathMsgSent = false;
|
||||
|
||||
m_economicsGood[TEAM_TF] = true;
|
||||
m_economicsGood[TEAM_CF] = true;
|
||||
|
|
@ -65,7 +66,7 @@ void BotManager::CallGameEntity (entvars_t *vars)
|
|||
(*playerFunction) (vars);
|
||||
}
|
||||
|
||||
int BotManager::CreateBot (String name, int difficulty, int personality, int team, int member)
|
||||
int BotManager::CreateBot (const String &name, int difficulty, int personality, int team, int member)
|
||||
{
|
||||
// this function completely prepares bot entity (edict) for creation, creates team, difficulty, sets name etc, and
|
||||
// then sends result to bot constructor
|
||||
|
|
@ -281,7 +282,7 @@ void BotManager::AddBot (const String &name, int difficulty, int personality, in
|
|||
yb_quota.SetInt (GetBotsNum () + 1);
|
||||
}
|
||||
|
||||
void BotManager::AddBot (String name, String difficulty, String personality, String team, String member)
|
||||
void BotManager::AddBot (const String &name, const String &difficulty, const String &personality, const String &team, const String &member)
|
||||
{
|
||||
// this function is same as the function above, but accept as parameters string instead of integers
|
||||
|
||||
|
|
@ -738,7 +739,7 @@ Bot::Bot (edict_t *bot, int difficulty, int personality, int team, int member, c
|
|||
char rejectReason[128];
|
||||
int clientIndex = IndexOfEntity (bot);
|
||||
|
||||
memset (this, 0, sizeof (Bot));
|
||||
memset (this, 0, sizeof (*this));
|
||||
|
||||
pev = &bot->v;
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,9 @@
|
|||
|
||||
ConVar yb_aim_method ("yb_aim_method", "3", VT_NOSERVER);
|
||||
|
||||
// any user ever altered this stuff? left this for debug-only builds
|
||||
#if !defined (NDEBUG)
|
||||
|
||||
ConVar yb_aim_damper_coefficient_x ("yb_aim_damper_coefficient_x", "0.22", VT_NOSERVER);
|
||||
ConVar yb_aim_damper_coefficient_y ("yb_aim_damper_coefficient_y", "0.22", VT_NOSERVER);
|
||||
|
||||
|
|
@ -28,6 +31,8 @@ ConVar yb_aim_spring_stiffness_y ("yb_aim_spring_stiffness_y", "14.0", VT_NOSERV
|
|||
|
||||
ConVar yb_aim_target_anticipation_ratio ("yb_aim_target_anticipation_ratio", "5.0", VT_NOSERVER);
|
||||
|
||||
#endif
|
||||
|
||||
int Bot::FindGoal (void)
|
||||
{
|
||||
// chooses a destination (goal) waypoint for a bot
|
||||
|
|
@ -269,6 +274,7 @@ void Bot::FilterGoals (const Array <int> &goals, int *result)
|
|||
if (index > 0)
|
||||
index--;
|
||||
|
||||
searchCount++;
|
||||
continue;
|
||||
}
|
||||
result[index] = rand;
|
||||
|
|
@ -311,7 +317,7 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
TraceResult tr;
|
||||
edict_t *nearest = NULL;
|
||||
|
||||
if (g_timeRoundStart + 10.0f < GetWorldTime () && FindNearestPlayer (reinterpret_cast <void **> (&nearest), GetEntity (), pev->maxspeed, true, false, true, true)) // found somebody?
|
||||
if (g_timeRoundStart + 10.0f < GetWorldTime () && FindNearestPlayer (reinterpret_cast <void **> (&nearest), GetEntity (), pev->maxspeed, true, false, true, true) && nearest != NULL && !(nearest->v.flags & FL_FAKECLIENT)) // found somebody?
|
||||
{
|
||||
MakeVectors (m_moveAngles); // use our movement angles
|
||||
|
||||
|
|
@ -327,16 +333,16 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
if ((nearest->v.origin - moved).GetLength2D () <= 48.0 || (nearestDistance <= 56.0 && nextFrameDistance < nearestDistance))
|
||||
{
|
||||
// to start strafing, we have to first figure out if the target is on the left side or right side
|
||||
Vector dirToPoint = (pev->origin - nearest->v.origin).SkipZ ();
|
||||
Vector dirToPoint = (pev->origin - nearest->v.origin).Get2D ();
|
||||
|
||||
if ((dirToPoint | g_pGlobals->v_right.SkipZ ()) > 0.0)
|
||||
if ((dirToPoint | g_pGlobals->v_right.Get2D ()) > 0.0)
|
||||
SetStrafeSpeed (directionNormal, pev->maxspeed);
|
||||
else
|
||||
SetStrafeSpeed (directionNormal, -pev->maxspeed);
|
||||
|
||||
ResetCollideState ();
|
||||
|
||||
if (nearestDistance < 56.0 && (dirToPoint | g_pGlobals->v_forward.SkipZ ()) < 0.0)
|
||||
if (nearestDistance < 56.0 && (dirToPoint | g_pGlobals->v_forward.Get2D ()) < 0.0)
|
||||
m_moveSpeed = -pev->maxspeed;
|
||||
}
|
||||
}
|
||||
|
|
@ -345,6 +351,8 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
// FIXME: doesn't care for ladder movement (handled separately) should be included in some way
|
||||
if ((m_moveSpeed >= 10 || m_strafeSpeed >= 10) && m_lastCollTime < GetWorldTime ())
|
||||
{
|
||||
bool cantMoveForward = false;
|
||||
|
||||
if (movedDistance < 2.0 && m_prevSpeed >= 1.0) // didn't we move enough previously?
|
||||
{
|
||||
// Then consider being stuck
|
||||
|
|
@ -357,7 +365,7 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
else // not stuck yet
|
||||
{
|
||||
// test if there's something ahead blocking the way
|
||||
if (CantMoveForward (directionNormal, &tr) && !IsOnLadder ())
|
||||
if ((cantMoveForward = CantMoveForward (directionNormal, &tr)) && !IsOnLadder ())
|
||||
{
|
||||
if (m_firstCollideTime == 0.0)
|
||||
m_firstCollideTime = GetWorldTime () + 0.2;
|
||||
|
|
@ -376,7 +384,7 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
else
|
||||
{
|
||||
// remember to keep pressing duck if it was necessary ago
|
||||
if (m_collideMoves[m_collStateIndex] == COLLISION_DUCK && IsOnFloor () || IsInWater ())
|
||||
if (m_collideMoves[m_collStateIndex] == COLLISION_DUCK && (IsOnFloor () || IsInWater ()))
|
||||
pev->button |= IN_DUCK;
|
||||
}
|
||||
return;
|
||||
|
|
@ -392,13 +400,15 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
bits = PROBE_STRAFE;
|
||||
else if (IsInWater ())
|
||||
bits = (PROBE_JUMP | PROBE_STRAFE);
|
||||
else if (cantMoveForward)
|
||||
bits = (PROBE_BACKOFF | PROBE_DUCK | PROBE_STRAFE);
|
||||
else
|
||||
bits = ((Random.Long (0, 10) > 7 ? PROBE_JUMP : 0) | PROBE_STRAFE | PROBE_DUCK);
|
||||
bits = ((Random.Long (0, 10) > 5 ? PROBE_JUMP : 0) | PROBE_STRAFE | PROBE_DUCK);
|
||||
|
||||
// collision check allowed if not flying through the air
|
||||
if (IsOnFloor () || IsOnLadder () || IsInWater ())
|
||||
{
|
||||
char state[8];
|
||||
char state[10];
|
||||
int i = 0;
|
||||
|
||||
// first 4 entries hold the possible collision states
|
||||
|
|
@ -406,6 +416,7 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
state[i++] = COLLISION_DUCK;
|
||||
state[i++] = COLLISION_STRAFELEFT;
|
||||
state[i++] = COLLISION_STRAFERIGHT;
|
||||
state[i++] = COLLISION_BACKOFF;
|
||||
|
||||
// now weight all possible states
|
||||
if (bits & PROBE_JUMP)
|
||||
|
|
@ -536,6 +547,26 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
state[i] = 0;
|
||||
}
|
||||
|
||||
if (bits & PROBE_BACKOFF)
|
||||
{
|
||||
state[i] = 0;
|
||||
|
||||
MakeVectors (m_moveAngles);
|
||||
|
||||
src = pev->origin;
|
||||
dst = src - g_pGlobals->v_forward * 32;
|
||||
|
||||
TraceLine (src, dst, true, true, GetEntity (), &tr);
|
||||
|
||||
if (tr.flFraction != 1.0 || IsDeadlyDrop (dst))
|
||||
state[i] -= 70;
|
||||
else
|
||||
state[i] += 40;
|
||||
}
|
||||
else
|
||||
state[i] = 0;
|
||||
i++;
|
||||
|
||||
// weighted all possible moves, now sort them to start with most probable
|
||||
int temp = 0;
|
||||
bool isSorting = false;
|
||||
|
|
@ -543,26 +574,26 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
do
|
||||
{
|
||||
isSorting = false;
|
||||
for (i = 0; i < 3; i++)
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if (state[i + 4] < state[i + 5])
|
||||
if (state[i + 5] < state[i + 6])
|
||||
{
|
||||
temp = state[i];
|
||||
|
||||
state[i] = state[i + 1];
|
||||
state[i + 1] = temp;
|
||||
|
||||
temp = state[i + 4];
|
||||
temp = state[i + 5];
|
||||
|
||||
state[i + 4] = state[i + 5];
|
||||
state[i + 5] = temp;
|
||||
state[i + 5] = state[i + 6];
|
||||
state[i + 6] = temp;
|
||||
|
||||
isSorting = true;
|
||||
}
|
||||
}
|
||||
} while (isSorting);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < 5; i++)
|
||||
m_collideMoves[i] = state[i];
|
||||
|
||||
m_collideTime = GetWorldTime ();
|
||||
|
|
@ -580,14 +611,14 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
m_collStateIndex++;
|
||||
m_probeTime = GetWorldTime () + 0.5;
|
||||
|
||||
if (m_collStateIndex > 4)
|
||||
if (m_collStateIndex > 5)
|
||||
{
|
||||
m_navTimeset = GetWorldTime () - 5.0;
|
||||
ResetCollideState ();
|
||||
}
|
||||
}
|
||||
|
||||
if (m_collStateIndex <= 4)
|
||||
if (m_collStateIndex <= 5)
|
||||
{
|
||||
switch (m_collideMoves[m_collStateIndex])
|
||||
{
|
||||
|
|
@ -610,6 +641,11 @@ void Bot::CheckTerrain (float movedDistance, const Vector &dir, const Vector &di
|
|||
pev->button |= IN_MOVERIGHT;
|
||||
SetStrafeSpeed (directionNormal, pev->maxspeed);
|
||||
break;
|
||||
|
||||
case COLLISION_BACKOFF:
|
||||
pev->button |= IN_BACK;
|
||||
m_moveSpeed = -pev->maxspeed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -879,8 +915,6 @@ bool Bot::DoWaypointNav (void)
|
|||
// need to find a button outside the lift
|
||||
if (m_liftState == LIFT_LOOKING_BUTTON_OUTSIDE)
|
||||
{
|
||||
// lift is already used ?
|
||||
bool liftUsed = false;
|
||||
|
||||
// button has been pressed, lift should come
|
||||
if (m_buttonPushTime + 8.0 >= GetWorldTime ())
|
||||
|
|
@ -900,6 +934,9 @@ bool Bot::DoWaypointNav (void)
|
|||
{
|
||||
edict_t *button = FindNearestButton (STRING (m_liftEntity->v.targetname));
|
||||
|
||||
// lift is already used ?
|
||||
bool liftUsed = false;
|
||||
|
||||
// if we got a valid button entity
|
||||
if (!IsEntityNull (button))
|
||||
{
|
||||
|
|
@ -1244,7 +1281,7 @@ public:
|
|||
return m_size == 0;
|
||||
}
|
||||
|
||||
inline PriorityQueue (int initialSize)
|
||||
inline PriorityQueue (int initialSize = MAX_WAYPOINTS * 0.5)
|
||||
{
|
||||
m_size = 0;
|
||||
m_heapSize = initialSize;
|
||||
|
|
@ -1263,7 +1300,7 @@ public:
|
|||
if (m_size >= m_heapSize)
|
||||
{
|
||||
m_heapSize += 100;
|
||||
m_heap = (Node *)realloc (m_heap, sizeof (Node) * m_heapSize);
|
||||
m_heap = static_cast <Node *> (realloc (m_heap, sizeof (Node) * m_heapSize));
|
||||
}
|
||||
|
||||
m_heap[m_size].pri = pri;
|
||||
|
|
@ -1506,9 +1543,9 @@ float hfunctionSquareDist (int index, int, int goalIndex)
|
|||
float zDist = fabsf (start->origin.z - goal->origin.z);
|
||||
|
||||
if (xDist > yDist)
|
||||
return 1.4 * yDist + (xDist - yDist) + zDist;
|
||||
return 1.4f * yDist + (xDist - yDist) + zDist;
|
||||
|
||||
return 1.4 * xDist + (yDist - xDist) + zDist;
|
||||
return 1.4f * xDist + (yDist - xDist) + zDist;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -1564,7 +1601,7 @@ void Bot::FindPath (int srcIndex, int destIndex, unsigned char pathType)
|
|||
AStarState state;
|
||||
} astar[MAX_WAYPOINTS];
|
||||
|
||||
PriorityQueue openList (MAX_WAYPOINTS * 0.5);
|
||||
PriorityQueue openList;
|
||||
|
||||
for (int i = 0; i < MAX_WAYPOINTS; i++)
|
||||
{
|
||||
|
|
@ -2468,12 +2505,9 @@ bool Bot::HeadTowardWaypoint (void)
|
|||
|
||||
bool Bot::CantMoveForward (const Vector &normal, TraceResult *tr)
|
||||
{
|
||||
// Checks if bot is blocked in his movement direction (excluding doors)
|
||||
// checks if bot is blocked in his movement direction (excluding doors)
|
||||
|
||||
// use some TraceLines to determine if anything is blocking the current path of the bot.
|
||||
Vector center = Vector (0, pev->angles.y, 0);
|
||||
|
||||
MakeVectors (center);
|
||||
|
||||
// first do a trace from the bot's eyes forward...
|
||||
Vector src = EyePosition ();
|
||||
|
|
@ -2490,10 +2524,11 @@ bool Bot::CantMoveForward (const Vector &normal, TraceResult *tr)
|
|||
|
||||
return true; // bot's head will hit something
|
||||
}
|
||||
MakeVectors (Vector (0, pev->angles.y, 0));
|
||||
|
||||
// bot's head is clear, check at shoulder level...
|
||||
// trace from the bot's shoulder left diagonal forward to the right shoulder...
|
||||
src = EyePosition () + Vector (0, 0, -16) - g_pGlobals->v_right * 16;
|
||||
src = EyePosition () + Vector (0, 0, -16) - g_pGlobals->v_right * -16;
|
||||
forward = EyePosition () + Vector (0, 0, -16) + g_pGlobals->v_right * 16 + normal * 24;
|
||||
|
||||
TraceLine (src, forward, true, GetEntity (), tr);
|
||||
|
|
@ -2505,7 +2540,7 @@ bool Bot::CantMoveForward (const Vector &normal, TraceResult *tr)
|
|||
// bot's head is clear, check at shoulder level...
|
||||
// trace from the bot's shoulder right diagonal forward to the left shoulder...
|
||||
src = EyePosition () + Vector (0, 0, -16) + g_pGlobals->v_right * 16;
|
||||
forward = EyePosition () + Vector (0, 0, -16) - g_pGlobals->v_right * 16 + normal * 24;
|
||||
forward = EyePosition () + Vector (0, 0, -16) - g_pGlobals->v_right * -16 + normal * 24;
|
||||
|
||||
TraceLine (src, forward, true, GetEntity (), tr);
|
||||
|
||||
|
|
@ -2537,7 +2572,7 @@ bool Bot::CantMoveForward (const Vector &normal, TraceResult *tr)
|
|||
else
|
||||
{
|
||||
// trace from the left waist to the right forward waist pos
|
||||
src = pev->origin + Vector (0, 0, -17) - g_pGlobals->v_right * 16;
|
||||
src = pev->origin + Vector (0, 0, -17) - g_pGlobals->v_right * -16;
|
||||
forward = pev->origin + Vector (0, 0, -17) + g_pGlobals->v_right * 16 + normal * 24;
|
||||
|
||||
// trace from the bot's waist straight forward...
|
||||
|
|
@ -2549,7 +2584,7 @@ bool Bot::CantMoveForward (const Vector &normal, TraceResult *tr)
|
|||
|
||||
// trace from the left waist to the right forward waist pos
|
||||
src = pev->origin + Vector (0, 0, -17) + g_pGlobals->v_right * 16;
|
||||
forward = pev->origin + Vector (0, 0, -17) - g_pGlobals->v_right * 16 + normal * 24;
|
||||
forward = pev->origin + Vector (0, 0, -17) - g_pGlobals->v_right * -16 + normal * 24;
|
||||
|
||||
TraceLine (src, forward, true, GetEntity (), tr);
|
||||
|
||||
|
|
@ -2906,7 +2941,6 @@ bool Bot::IsDeadlyDrop (const Vector &to)
|
|||
if (tr.flFraction > 0.036) // We're not on ground anymore?
|
||||
tr.flFraction = 0.036;
|
||||
|
||||
float height;
|
||||
float lastHeight = tr.flFraction * 1000.0; // height from ground
|
||||
|
||||
float distance = (to - check).GetLength (); // distance from goal
|
||||
|
|
@ -2923,7 +2957,7 @@ bool Bot::IsDeadlyDrop (const Vector &to)
|
|||
if (tr.fStartSolid) // Wall blocking?
|
||||
return false;
|
||||
|
||||
height = tr.flFraction * 1000.0; // height from ground
|
||||
float height = tr.flFraction * 1000.0; // height from ground
|
||||
|
||||
if (lastHeight < height - 100) // Drops more than 100 Units?
|
||||
return true;
|
||||
|
|
@ -3113,15 +3147,31 @@ void Bot::FacePosition (void)
|
|||
}
|
||||
else if (aimMethod == 3)
|
||||
{
|
||||
#if defined (NDEBUG)
|
||||
Vector springStiffness (15.0f, 15.0f, 0.0f);
|
||||
Vector damperCoefficient (0.22f, 0.22f, 0.0f);
|
||||
|
||||
Vector influence (0.26f, 0.18f, 0.0f);
|
||||
Vector randomization (2.0f, 0.18f, 0.0f);
|
||||
|
||||
const float noTargetRatio = 0.6f;
|
||||
const float offsetDelay = 0.5f;
|
||||
const float targetRatio = 5.0f;
|
||||
#else
|
||||
Vector springStiffness (yb_aim_spring_stiffness_x.GetFloat (), yb_aim_spring_stiffness_y.GetFloat (), 0);
|
||||
Vector damperCoefficient (yb_aim_damper_coefficient_x.GetFloat (), yb_aim_damper_coefficient_y.GetFloat (), 0);
|
||||
Vector influence (yb_aim_influence_x_on_y.GetFloat (), yb_aim_influence_y_on_x.GetFloat (), 0);
|
||||
Vector randomization (yb_aim_deviation_x.GetFloat (), yb_aim_deviation_y.GetFloat (), 0);
|
||||
|
||||
const float noTargetRatio = yb_aim_notarget_slowdown_ratio.GetFloat ();
|
||||
const float offsetDelay = yb_aim_offset_delay.GetFloat ();
|
||||
const float targetRatio = yb_aim_target_anticipation_ratio.GetFloat ();
|
||||
#endif
|
||||
|
||||
Vector stiffness = nullvec;
|
||||
Vector randomize = nullvec;
|
||||
|
||||
m_idealAngles = direction.SkipZ ();
|
||||
m_idealAngles = direction.Get2D ();
|
||||
m_targetOriginAngularSpeed.ClampAngles ();
|
||||
m_idealAngles.ClampAngles ();
|
||||
|
||||
|
|
@ -3138,7 +3188,7 @@ void Bot::FacePosition (void)
|
|||
|
||||
if (IsValidPlayer (m_enemy))
|
||||
{
|
||||
m_targetOriginAngularSpeed = ((m_enemyOrigin - pev->origin + 1.5 * m_frameInterval * (1.0 * m_enemy->v.velocity) - 0.0 * g_pGlobals->frametime * pev->velocity).ToAngles () - (m_enemyOrigin - pev->origin).ToAngles ()) * 0.45 * yb_aim_target_anticipation_ratio.GetFloat () * static_cast <float> ((m_difficulty * 25) / 100);
|
||||
m_targetOriginAngularSpeed = ((m_enemyOrigin - pev->origin + 1.5 * m_frameInterval * (1.0 * m_enemy->v.velocity) - 0.0 * g_pGlobals->frametime * pev->velocity).ToAngles () - (m_enemyOrigin - pev->origin).ToAngles ()) * 0.45f * targetRatio * static_cast <float> ((m_difficulty * 25) / 100);
|
||||
|
||||
if (m_angularDeviation.GetLength () < 5.0)
|
||||
springStiffness = (5.0 - m_angularDeviation.GetLength ()) * 0.25 * static_cast <float> ((m_difficulty * 25) / 100) * springStiffness + springStiffness;
|
||||
|
|
@ -3174,12 +3224,12 @@ void Bot::FacePosition (void)
|
|||
m_randomizedIdealAngles = m_idealAngles + Vector (Random.Float (-randomize.x * 0.5, randomize.x * 1.5), Random.Float (-randomize.y, randomize.y), 0);
|
||||
|
||||
// set next time to do this
|
||||
m_randomizeAnglesTime = GetWorldTime () + Random.Float (0.4, yb_aim_offset_delay.GetFloat ());
|
||||
m_randomizeAnglesTime = GetWorldTime () + Random.Float (0.4f, offsetDelay);
|
||||
}
|
||||
float stiffnessMultiplier = yb_aim_notarget_slowdown_ratio.GetFloat ();
|
||||
float stiffnessMultiplier = noTargetRatio;
|
||||
|
||||
// take in account whether the bot was targeting someone in the last N seconds
|
||||
if (GetWorldTime () - (m_playerTargetTime + yb_aim_offset_delay.GetFloat ()) < yb_aim_notarget_slowdown_ratio.GetFloat () * 10.0)
|
||||
if (GetWorldTime () - (m_playerTargetTime + offsetDelay) < noTargetRatio * 10.0)
|
||||
{
|
||||
stiffnessMultiplier = 1.0 - (GetWorldTime () - m_timeLastFired) * 0.1;
|
||||
|
||||
|
|
@ -3238,7 +3288,7 @@ void Bot::SetStrafeSpeed (const Vector &moveDir, float strafeSpeed)
|
|||
MakeVectors (pev->angles);
|
||||
|
||||
const Vector &los = (moveDir - pev->origin).Normalize2D ();
|
||||
float dot = los | g_pGlobals->v_forward.SkipZ ();
|
||||
float dot = los | g_pGlobals->v_forward.Get2D ();
|
||||
|
||||
if (dot > 0 && !CheckWallOnRight ())
|
||||
m_strafeSpeed = strafeSpeed;
|
||||
|
|
|
|||
|
|
@ -112,11 +112,11 @@ float GetShootingConeDeviation (edict_t *ent, Vector *position)
|
|||
return g_pGlobals->v_forward | dir;
|
||||
}
|
||||
|
||||
bool IsInViewCone (Vector origin, edict_t *ent)
|
||||
bool IsInViewCone (const Vector &origin, edict_t *ent)
|
||||
{
|
||||
MakeVectors (ent->v.v_angle);
|
||||
|
||||
if (((origin - (ent->v.origin + ent->v.view_ofs)).Normalize () | g_pGlobals->v_forward) >= cosf (((ent->v.fov > 0 ? ent->v.fov : 90.0) * 0.5) * Math::MATH_PI / 180.0))
|
||||
if (((origin - (ent->v.origin + ent->v.view_ofs)).Normalize () | g_pGlobals->v_forward) >= cosf (((ent->v.fov > 0 ? ent->v.fov : 90.0f) * 0.5f) * MATH_D2R))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
|
@ -842,40 +842,6 @@ bool TryFileOpen (const char *fileName)
|
|||
return false;
|
||||
}
|
||||
|
||||
void HudMessage (edict_t *ent, bool toCenter, Vector rgb, char *format, ...)
|
||||
{
|
||||
if (!IsValidPlayer (ent) || IsValidBot (ent))
|
||||
return;
|
||||
|
||||
va_list ap;
|
||||
char buffer[1024];
|
||||
|
||||
va_start (ap, format);
|
||||
vsprintf (buffer, format, ap);
|
||||
va_end (ap);
|
||||
|
||||
MESSAGE_BEGIN (MSG_ONE, SVC_TEMPENTITY, NULL, ent);
|
||||
WRITE_BYTE (TE_TEXTMESSAGE);
|
||||
WRITE_BYTE (1);
|
||||
WRITE_SHORT (FixedSigned16 (-1, 1 << 13));
|
||||
WRITE_SHORT (FixedSigned16 (toCenter ? -1 : 0, 1 << 13));
|
||||
WRITE_BYTE (2);
|
||||
WRITE_BYTE (static_cast <int> (rgb.x));
|
||||
WRITE_BYTE (static_cast <int> (rgb.y));
|
||||
WRITE_BYTE (static_cast <int> (rgb.z));
|
||||
WRITE_BYTE (0);
|
||||
WRITE_BYTE (Random.Long (230, 255));
|
||||
WRITE_BYTE (Random.Long (230, 255));
|
||||
WRITE_BYTE (Random.Long (230, 255));
|
||||
WRITE_BYTE (200);
|
||||
WRITE_SHORT (FixedUnsigned16 (0.0078125, 1 << 8));
|
||||
WRITE_SHORT (FixedUnsigned16 (2, 1 << 8));
|
||||
WRITE_SHORT (FixedUnsigned16 (6, 1 << 8));
|
||||
WRITE_SHORT (FixedUnsigned16 (0.1, 1 << 8));
|
||||
WRITE_STRING (const_cast <const char *> (&buffer[0]));
|
||||
MESSAGE_END ();
|
||||
}
|
||||
|
||||
void ServerPrint (const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
|
@ -944,18 +910,10 @@ void ClientPrint (edict_t *ent, int dest, const char *format, ...)
|
|||
|
||||
if (IsEntityNull (ent) || ent == g_hostEntity)
|
||||
{
|
||||
if (dest & 0x3ff)
|
||||
ServerPrint (string);
|
||||
else
|
||||
ServerPrint (string);
|
||||
|
||||
return;
|
||||
}
|
||||
strcat (string, "\n");
|
||||
|
||||
if (dest & 0x3ff)
|
||||
(*g_engfuncs.pfnClientPrintf) (ent, static_cast <PRINT_TYPE> (dest &= ~0x3ff), FormatBuffer ("[YAPB] %s", string));
|
||||
else
|
||||
(*g_engfuncs.pfnClientPrintf) (ent, static_cast <PRINT_TYPE> (dest), string);
|
||||
|
||||
}
|
||||
|
|
@ -1072,7 +1030,27 @@ void CheckWelcomeMessage (void)
|
|||
ServerCommand ("speak \"%s\"", const_cast <char *> (sentences.GetRandomElement ().GetBuffer ()));
|
||||
|
||||
ChartPrint ("----- YaPB v%s (Build: %u), {%s}, (c) 2015, by %s -----", PRODUCT_VERSION, GenerateBuildNumber (), PRODUCT_DATE, PRODUCT_AUTHOR);
|
||||
HudMessage (g_hostEntity, true, Vector (Random.Long (33, 255), Random.Long (33, 255), Random.Long (33, 255)), "\nServer is running YaPB v%s (Build: %u)\nDeveloped by %s\n\n%s", PRODUCT_VERSION, GenerateBuildNumber (), PRODUCT_AUTHOR, g_waypoint->GetInfo ());
|
||||
|
||||
MESSAGE_BEGIN (MSG_ONE, SVC_TEMPENTITY, NULL, g_hostEntity);
|
||||
WRITE_BYTE (TE_TEXTMESSAGE);
|
||||
WRITE_BYTE (1);
|
||||
WRITE_SHORT (FixedSigned16 (-1, 1 << 13));
|
||||
WRITE_SHORT (FixedSigned16 (-1, 1 << 13));
|
||||
WRITE_BYTE (2);
|
||||
WRITE_BYTE (Random.Long (33, 255));
|
||||
WRITE_BYTE (Random.Long (33, 255));
|
||||
WRITE_BYTE (Random.Long (33, 255));
|
||||
WRITE_BYTE (0);
|
||||
WRITE_BYTE (Random.Long (230, 255));
|
||||
WRITE_BYTE (Random.Long (230, 255));
|
||||
WRITE_BYTE (Random.Long (230, 255));
|
||||
WRITE_BYTE (200);
|
||||
WRITE_SHORT (FixedUnsigned16 (0.0078125, 1 << 8));
|
||||
WRITE_SHORT (FixedUnsigned16 (2, 1 << 8));
|
||||
WRITE_SHORT (FixedUnsigned16 (6, 1 << 8));
|
||||
WRITE_SHORT (FixedUnsigned16 (0.1, 1 << 8));
|
||||
WRITE_STRING (FormatBuffer ("\nServer is running YaPB v%s (Build: %u)\nDeveloped by %s\n\n%s", PRODUCT_VERSION, GenerateBuildNumber (), PRODUCT_AUTHOR, g_waypoint->GetInfo ()));
|
||||
MESSAGE_END ();
|
||||
|
||||
receiveTime = 0.0;
|
||||
isReceived = true;
|
||||
|
|
|
|||
|
|
@ -18,6 +18,10 @@ void Waypoint::Init (void)
|
|||
{
|
||||
// this function initialize the waypoint structures..
|
||||
|
||||
m_learnVelocity = nullvec;
|
||||
m_learnPosition = nullvec;
|
||||
m_lastWaypoint = nullvec;
|
||||
|
||||
// have any waypoint path nodes been allocated yet?
|
||||
if (m_waypointPaths)
|
||||
{
|
||||
|
|
@ -1281,7 +1285,6 @@ bool Waypoint::IsNodeReachable (const Vector &src, const Vector &destination)
|
|||
{
|
||||
TraceResult tr;
|
||||
|
||||
float height, lastHeight;
|
||||
float distance = (destination - src).GetLength ();
|
||||
|
||||
// is the destination not close enough?
|
||||
|
|
@ -1335,7 +1338,7 @@ bool Waypoint::IsNodeReachable (const Vector &src, const Vector &destination)
|
|||
|
||||
TraceLine (check, down, ignore_monsters, g_hostEntity, &tr);
|
||||
|
||||
lastHeight = tr.flFraction * 1000.0; // height from ground
|
||||
float lastHeight = tr.flFraction * 1000.0; // height from ground
|
||||
distance = (destination - check).GetLength (); // distance from goal
|
||||
|
||||
while (distance > 10.0)
|
||||
|
|
@ -1348,7 +1351,7 @@ bool Waypoint::IsNodeReachable (const Vector &src, const Vector &destination)
|
|||
|
||||
TraceLine (check, down, ignore_monsters, g_hostEntity, &tr);
|
||||
|
||||
height = tr.flFraction * 1000.0; // height from ground
|
||||
float height = tr.flFraction * 1000.0; // height from ground
|
||||
|
||||
// is the current height greater than the step height?
|
||||
if (height < lastHeight - 18.0)
|
||||
|
|
@ -1802,12 +1805,11 @@ bool Waypoint::NodesValid (void)
|
|||
int ctPoints = 0;
|
||||
int goalPoints = 0;
|
||||
int rescuePoints = 0;
|
||||
int connections;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < g_numWaypoints; i++)
|
||||
{
|
||||
connections = 0;
|
||||
int connections = 0;
|
||||
|
||||
for (j = 0; j < MAX_PATH_INDEX; j++)
|
||||
{
|
||||
|
|
@ -1872,16 +1874,20 @@ bool Waypoint::NodesValid (void)
|
|||
else if (m_paths[i]->index[k] == i)
|
||||
{
|
||||
AddLogEntry (true, LL_WARNING, "Waypoint %d - Pathindex %d points to itself!", i, k);
|
||||
|
||||
if (g_waypointOn && !IsDedicatedServer ())
|
||||
{
|
||||
(*g_engfuncs.pfnSetOrigin) (g_hostEntity, m_paths[i]->origin);
|
||||
|
||||
g_waypointOn = true;
|
||||
g_editNoclip = true;
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g_mapType & MAP_CS)
|
||||
{
|
||||
if (rescuePoints == 0)
|
||||
|
|
@ -1951,11 +1957,14 @@ bool Waypoint::NodesValid (void)
|
|||
if (!visited[i])
|
||||
{
|
||||
AddLogEntry (true, LL_WARNING, "Path broken from Waypoint #0 to Waypoint #%d!", i);
|
||||
|
||||
if (g_waypointOn && !IsDedicatedServer ())
|
||||
{
|
||||
(*g_engfuncs.pfnSetOrigin) (g_hostEntity, m_paths[i]->origin);
|
||||
|
||||
g_waypointOn = true;
|
||||
g_editNoclip = true;
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -2008,11 +2017,14 @@ bool Waypoint::NodesValid (void)
|
|||
if (!visited[i])
|
||||
{
|
||||
AddLogEntry (true, LL_WARNING, "Path broken from Waypoint #%d to Waypoint #0!", i);
|
||||
SET_ORIGIN (g_hostEntity, m_paths[i]->origin);
|
||||
|
||||
if (g_waypointOn && !IsDedicatedServer ())
|
||||
{
|
||||
(*g_engfuncs.pfnSetOrigin) (g_hostEntity, m_paths[i]->origin);
|
||||
|
||||
g_waypointOn = true;
|
||||
g_editNoclip = true;
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -2452,14 +2464,11 @@ Waypoint::Waypoint (void)
|
|||
m_learnJumpWaypoint = false;
|
||||
m_timeJumpStarted = 0.0;
|
||||
|
||||
m_learnVelocity = nullvec;
|
||||
m_learnPosition = nullvec;
|
||||
m_lastJumpWaypoint = -1;
|
||||
m_cacheWaypointIndex = -1;
|
||||
m_findWPIndex = -1;
|
||||
m_visibilityIndex = 0;
|
||||
|
||||
m_lastWaypoint = nullvec;
|
||||
m_isOnLadder = false;
|
||||
|
||||
m_pathDisplayTime = 0.0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue