aim: added optional hitbox-based aiming for bots (ref #579)
This commit is contained in:
parent
87cbd144c2
commit
8dece62df6
6 changed files with 264 additions and 3 deletions
43
inc/engine.h
43
inc/engine.h
|
|
@ -48,7 +48,8 @@ CR_DECLARE_SCOPED_ENUM (GameFlags,
|
|||
HasBotVoice = cr::bit (11), // on that game version we can use chatter
|
||||
AnniversaryHL25 = cr::bit (12), // half-life 25th anniversary engine
|
||||
Xash3DLegacy = cr::bit (13), // old xash3d-branch
|
||||
ZombieMod = cr::bit (14) // zombie mod is active
|
||||
ZombieMod = cr::bit (14), // zombie mod is active
|
||||
HasStudioModels = cr::bit (15) // game supports studio models, so we can use hitbox-based aiming
|
||||
)
|
||||
|
||||
// defines map type
|
||||
|
|
@ -70,6 +71,18 @@ CR_DECLARE_SCOPED_ENUM (EntitySearchResult,
|
|||
Break
|
||||
)
|
||||
|
||||
// player body parts
|
||||
CR_DECLARE_SCOPED_ENUM (PlayerPart,
|
||||
Head = 1,
|
||||
Chest,
|
||||
Stomach,
|
||||
LeftArm,
|
||||
RightArm,
|
||||
LeftLeg,
|
||||
RightLeg,
|
||||
Feet // custom!
|
||||
)
|
||||
|
||||
// variable reg pair
|
||||
struct ConVarReg {
|
||||
cvar_t reg;
|
||||
|
|
@ -112,6 +125,29 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
// player model part info enumerator
|
||||
class PlayerHitboxEnumerator final {
|
||||
public:
|
||||
struct Info {
|
||||
float updated {};
|
||||
Vector head {};
|
||||
Vector stomach {};
|
||||
Vector feet {};
|
||||
Vector right {};
|
||||
Vector left {};
|
||||
} m_parts[kGameMaxPlayers] {};
|
||||
|
||||
public:
|
||||
// get's the enemy part based on bone info
|
||||
Vector get (edict_t *ent, int part, float updateTimestamp);
|
||||
|
||||
// update bones positions for given player
|
||||
void update (edict_t *ent);
|
||||
|
||||
// reset all the poisitons
|
||||
void reset ();
|
||||
};
|
||||
|
||||
// provides utility functions to not call original engine (less call-cost)
|
||||
class Game final : public Singleton <Game> {
|
||||
public:
|
||||
|
|
@ -353,6 +389,11 @@ public:
|
|||
m_gameFlags |= type;
|
||||
}
|
||||
|
||||
// clears game flag
|
||||
void clearGameFlag (const int type) {
|
||||
m_gameFlags &= ~type;
|
||||
}
|
||||
|
||||
// gets the map type
|
||||
bool mapIs (const int type) const {
|
||||
return !!(m_mapFlags & type);
|
||||
|
|
|
|||
|
|
@ -355,6 +355,8 @@ private:
|
|||
Array <edict_t *> m_ignoredBreakable {}; // list of ignored breakables
|
||||
Array <edict_t *> m_hostages {}; // pointer to used hostage entities
|
||||
|
||||
UniquePtr <class PlayerHitboxEnumerator> m_hitboxEnumerator {};
|
||||
|
||||
Path *m_path {}; // pointer to the current path node
|
||||
String m_chatBuffer {}; // space for strings (say text...)
|
||||
Frustum::Planes m_viewFrustum {};
|
||||
|
|
@ -407,6 +409,8 @@ private:
|
|||
bool isWeaponRestrictedAMX (int wid);
|
||||
bool isInViewCone (const Vector &origin);
|
||||
bool checkBodyParts (edict_t *target);
|
||||
bool checkBodyPartsWithOffsets (edict_t *target);
|
||||
bool checkBodyPartsWithHitboxes (edict_t *target);
|
||||
bool seesEnemy (edict_t *player);
|
||||
bool hasActiveGoal ();
|
||||
bool advanceMovement ();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue