diff --git a/include/core.h b/include/core.h index b9cc212..9020a61 100644 --- a/include/core.h +++ b/include/core.h @@ -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 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 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); diff --git a/include/corelib.h b/include/corelib.h index a8425b8..a38a7bd 100644 --- a/include/corelib.h +++ b/include/corelib.h @@ -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); } @@ -708,7 +701,7 @@ public: { float sinePitch = 0.0f, cosinePitch = 0.0f, sineYaw = 0.0f, cosineYaw = 0.0f, sineRoll = 0.0f, cosineRoll = 0.0f; - Math::SineCosine (Math::DegreeToRadian (x), &sinePitch, &cosinePitch); // compute the sine and cosine of the pitch component + Math::SineCosine (Math::DegreeToRadian (x), &sinePitch, &cosinePitch); // compute the sine and cosine of the pitch component Math::SineCosine (Math::DegreeToRadian (y), &sineYaw, &cosineYaw); // compute the sine and cosine of the yaw component Math::SineCosine (Math::DegreeToRadian (z), &sineRoll, &cosineRoll); // compute the sine and cosine of the roll component @@ -2473,7 +2466,7 @@ public: // Returns: // Integer value of string. // - int ToInt (void) + int ToInt (void) const { return atoi (m_bufferPtr); } diff --git a/include/engine/eiface.h b/include/engine/eiface.h index b548ee1..48c924f 100644 --- a/include/engine/eiface.h +++ b/include/engine/eiface.h @@ -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); diff --git a/include/resource.h b/include/resource.h index 4d02f77..c3b7da7 100644 --- a/include/resource.h +++ b/include/resource.h @@ -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__ diff --git a/source/basecode.cpp b/source/basecode.cpp index 1dfcc2a..34fcf6d 100644 --- a/source/basecode.cpp +++ b/source/basecode.cpp @@ -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 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) + for (int i = 0; i < GetMaxClients (); i++) + { + 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; diff --git a/source/chatlib.cpp b/source/chatlib.cpp index a617c34..59aa4a2 100644 --- a/source/chatlib.cpp +++ b/source/chatlib.cpp @@ -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++) diff --git a/source/combat.cpp b/source/combat.cpp index 64b18ed..fd15b9e 100644 --- a/source/combat.cpp +++ b/source/combat.cpp @@ -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? diff --git a/source/interface.cpp b/source/interface.cpp index 92eadb1..00586ac 100644 --- a/source/interface.cpp +++ b/source/interface.cpp @@ -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 (2); char buffer[1024]; LanguageItem temp = {"", ""}; @@ -1567,7 +1567,7 @@ void ClientCommand (edict_t *ent) case 2: if (FindNearestPlayer (reinterpret_cast (&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) { diff --git a/source/manager.cpp b/source/manager.cpp index ea70a7f..052e225 100644 --- a/source/manager.cpp +++ b/source/manager.cpp @@ -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; diff --git a/source/navigate.cpp b/source/navigate.cpp index a64adb0..5fdb951 100644 --- a/source/navigate.cpp +++ b/source/navigate.cpp @@ -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 &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 (&nearest), GetEntity (), pev->maxspeed, true, false, true, true)) // found somebody? + if (g_timeRoundStart + 10.0f < GetWorldTime () && FindNearestPlayer (reinterpret_cast (&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 (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 ((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 ((m_difficulty * 25) / 100); if (m_angularDeviation.GetLength () < 5.0) springStiffness = (5.0 - m_angularDeviation.GetLength ()) * 0.25 * static_cast ((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; diff --git a/source/support.cpp b/source/support.cpp index c5360a7..1275953 100644 --- a/source/support.cpp +++ b/source/support.cpp @@ -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 (rgb.x)); - WRITE_BYTE (static_cast (rgb.y)); - WRITE_BYTE (static_cast (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 (&buffer[0])); - MESSAGE_END (); -} - void ServerPrint (const char *format, ...) { va_list ap; @@ -944,19 +910,11 @@ void ClientPrint (edict_t *ent, int dest, const char *format, ...) if (IsEntityNull (ent) || ent == g_hostEntity) { - if (dest & 0x3ff) - ServerPrint (string); - else - ServerPrint (string); - + ServerPrint (string); return; } strcat (string, "\n"); - - if (dest & 0x3ff) - (*g_engfuncs.pfnClientPrintf) (ent, static_cast (dest &= ~0x3ff), FormatBuffer ("[YAPB] %s", string)); - else - (*g_engfuncs.pfnClientPrintf) (ent, static_cast (dest), string); + (*g_engfuncs.pfnClientPrintf) (ent, static_cast (dest), string); } @@ -1072,7 +1030,27 @@ void CheckWelcomeMessage (void) ServerCommand ("speak \"%s\"", const_cast (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; diff --git a/source/waypoint.cpp b/source/waypoint.cpp index a07b669..3a4df24 100644 --- a/source/waypoint.cpp +++ b/source/waypoint.cpp @@ -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); - (*g_engfuncs.pfnSetOrigin) (g_hostEntity, m_paths[i]->origin); - g_waypointOn = true; - g_editNoclip = true; + 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); - (*g_engfuncs.pfnSetOrigin) (g_hostEntity, m_paths[i]->origin); - g_waypointOn = true; - g_editNoclip = true; + 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); - g_waypointOn = true; - g_editNoclip = true; + 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;