void CharacterController::InjectKeyDown(const OIS::IKeyboard* keyboard) { if (HasObjectAttached() AND HasActivated()) { if (keyboard->HasKeyDown(OIS::KeyCode_E) AND _currentUsableObject != nullptr) { if (_currentUsableObject->HasUsing()) _currentUsableObject->Unuse(); else _currentUsableObject->Use(); } Math::Vec3F movement = VEC3F_ZERO; Math::Vec3F rotation = VEC3F_ZERO; if (keyboard->HasKeyDown(OIS::KeyCode_W) OR keyboard->HasKeyDownStr("up")) { _movementState = (HasRunning()) ? Character::CHARACTER_STATE::RunForward : Character::CHARACTER_STATE::WalkForward; movement = VEC3F_FORWARD; SetNormalSpeed(((HasRunning()) ? GetRunSpeed() : GetWalkSpeed()) * 0.02f); SetMoving(true); } if (keyboard->HasKeyDown(OIS::KeyCode_S) OR keyboard->HasKeyDownStr("down")) { _movementState = (HasRunning()) ? Character::CHARACTER_STATE::RunBack : Character::CHARACTER_STATE::WalkBack; movement = VEC3F_BACK; SetNormalSpeed(((HasRunning()) ? GetRunSpeed() : GetWalkSpeed()) * 0.02f); SetMoving(true); } if (keyboard->HasKeyDown(OIS::KeyCode_D) OR keyboard->HasKeyDownStr("right")) { _movementState = (HasRunning()) ? Character::CHARACTER_STATE::RunRight : Character::CHARACTER_STATE::WalkRight; movement = VEC3F_RIGHT; SetNormalSpeed(((HasRunning()) ? GetRunSpeed() : GetWalkSpeed()) * 0.015f); SetMoving(true); } if (keyboard->HasKeyDown(OIS::KeyCode_A) OR keyboard->HasKeyDownStr("left")) { _movementState = (HasRunning()) ? Character::CHARACTER_STATE::RunLeft : Character::CHARACTER_STATE::WalkLeft; movement = VEC3F_LEFT; SetNormalSpeed(((HasRunning()) ? GetRunSpeed() : GetWalkSpeed()) * 0.015f); SetMoving(true); } SetMovementDirection(movement); } }
void Bot::CombatFight (void) { // no enemy? no need to do strafing if (FNullEnt (m_enemy)) return; Vector enemyOrigin = m_lookAt; if (m_currentWeapon == WEAPON_KNIFE) m_destOrigin = m_enemy->v.origin; enemyOrigin = (enemyOrigin - EyePosition ()).SkipZ (); // ignore z component (up & down) float distance = enemyOrigin.GetLength (); // how far away is the enemy scum? if (m_timeWaypointMove + m_frameInterval < engine->GetTime ()) { if (m_currentWeapon == WEAPON_KNIFE) return; int approach; if ((m_states & STATE_SUSPECTENEMY) && !(m_states & STATE_SEEINGENEMY)) // if suspecting enemy stand still approach = 49; else if (m_isReloading || m_isVIP) // if reloading or vip back off approach = 29; else if (m_currentWeapon == WEAPON_KNIFE) // knife? approach = 100; else { approach = static_cast <int> (pev->health * m_agressionLevel); if (UsesSniper () && (approach > 49)) approach = 49; } // only take cover when bomb is not planted and enemy can see the bot or the bot is VIP if (approach < 30 && !g_bombPlanted && (::IsInViewCone (pev->origin, m_enemy) || m_isVIP)) { m_moveSpeed = -pev->maxspeed; GetCurrentTask ()->taskID = TASK_SEEKCOVER; GetCurrentTask ()->canContinue = true; GetCurrentTask ()->desire = TASKPRI_FIGHTENEMY + 1.0f; } else if (approach < 50) m_moveSpeed = 0.0f; else m_moveSpeed = pev->maxspeed; if (distance < 96 && m_currentWeapon != WEAPON_KNIFE) m_moveSpeed = -pev->maxspeed; if (UsesSniper ()) { m_fightStyle = 1; m_lastFightStyleCheck = engine->GetTime (); } else if (UsesRifle () || UsesSubmachineGun ()) { if (m_lastFightStyleCheck + 3.0f < engine->GetTime ()) { int rand = engine->RandomInt (1, 100); if (distance < 450) m_fightStyle = 0; else if (distance < 1024) { if (rand < (UsesSubmachineGun () ? 50 : 30)) m_fightStyle = 0; else m_fightStyle = 1; } else { if (rand < (UsesSubmachineGun () ? 80 : 93)) m_fightStyle = 1; else m_fightStyle = 0; } m_lastFightStyleCheck = engine->GetTime (); } } else { if (m_lastFightStyleCheck + 3.0f < engine->GetTime ()) { if (engine->RandomInt (0, 100) < 65) m_fightStyle = 1; else m_fightStyle = 0; m_lastFightStyleCheck = engine->GetTime (); } } if ((m_skill > 50 && m_fightStyle == 0) || ((pev->button & IN_RELOAD) || m_isReloading) || (UsesPistol () && distance < 500.0f)) { if (m_strafeSetTime < engine->GetTime ()) { // to start strafing, we have to first figure out if the target is on the left side or right side MakeVectors (m_enemy->v.v_angle); Vector dirToPoint = (pev->origin - m_enemy->v.origin).Normalize2D (); Vector rightSide = g_pGlobals->v_right.Normalize2D (); if ((dirToPoint | rightSide) < 0) m_combatStrafeDir = 1; else m_combatStrafeDir = 0; if (engine->RandomInt (1, 100) < 30) m_combatStrafeDir ^= 1; m_strafeSetTime = engine->GetTime () + engine->RandomFloat (0.5, 2.5); } if (m_combatStrafeDir == 0) { if (!CheckWallOnLeft ()) m_strafeSpeed = -160.0f; else { m_combatStrafeDir ^= 1; m_strafeSetTime = engine->GetTime () + 0.7f; } } else { if (!CheckWallOnRight ()) m_strafeSpeed = 160.0f; else { m_combatStrafeDir ^= 1; m_strafeSetTime = engine->GetTime () + 1.0f; } } if (m_skill > 80 && (m_jumpTime + 5.0f < engine->GetTime () && IsOnFloor () && engine->RandomInt (0, 1000) < (m_isReloading ? 8 : 2) && pev->velocity.GetLength2D () > 150.0f)) pev->button |= IN_JUMP; if (m_moveSpeed != 0.0f && distance > 150.0f) m_moveSpeed = 0.0f; } else if (m_fightStyle == 1) { bool shouldDuck = true; // should duck // check the enemy height float enemyHalfHeight = ((m_enemy->v.flags & FL_DUCKING) == FL_DUCKING ? 36.0f : 72.0f) / 2; // check center/feet if (!IsVisible (m_enemy->v.origin, GetEntity ()) && !IsVisible (m_enemy->v.origin + Vector (0, 0, -enemyHalfHeight), GetEntity ())) shouldDuck = false; int nearestToEnemyPoint = g_waypoint->FindNearest (m_enemy->v.origin); if (shouldDuck && GetCurrentTask ()->taskID != TASK_SEEKCOVER && GetCurrentTask ()->taskID != TASK_HUNTENEMY && (m_visibility & VISIBILITY_BODY) && !(m_visibility & VISIBILITY_OTHER) && g_waypoint->IsDuckVisible (m_currentWaypointIndex, nearestToEnemyPoint)) m_duckTime = engine->GetTime () + m_frameInterval * 3.5f; m_moveSpeed = 0.0f; m_strafeSpeed = 0.0f; m_navTimeset = engine->GetTime (); } } if (m_duckTime > engine->GetTime ()) { m_moveSpeed = 0.0f; m_strafeSpeed = 0.0f; } if (m_moveSpeed != 0.0f) m_moveSpeed = GetWalkSpeed (); if (m_isReloading) { m_moveSpeed = -pev->maxspeed; m_duckTime = engine->GetTime () - (m_frameInterval * 4.0f); } if (!IsInWater () && !IsOnLadder () && (m_moveSpeed != 0 || m_strafeSpeed != 0)) { MakeVectors (pev->v_angle); if (IsDeadlyDrop (pev->origin + (g_pGlobals->v_forward * m_moveSpeed * 0.2f) + (g_pGlobals->v_right * m_strafeSpeed * 0.2f) + (pev->velocity * m_frameInterval))) { m_strafeSpeed = -m_strafeSpeed; m_moveSpeed = -m_moveSpeed; pev->button &= ~IN_JUMP; } } }
// SyPB Pro P.30 - Attack Ai void Bot::CombatFight(void) { if (FNullEnt(m_enemy)) return; //if (m_currentWeapon == WEAPON_KNIFE) // SyPB Pro P.34 - Base Ai m_destOrigin = GetEntityOrigin(m_enemy); // SyPB Pro P.30 - Zombie Mod if (GetGameMod() == 2 || GetGameMod () == 4) // SyPB Pro P.37 - small change { m_currentWaypointIndex = -1; m_prevGoalIndex = -1; m_moveToGoal = false; m_navTimeset = engine->GetTime(); if (IsZombieBot(GetEntity())) { m_moveSpeed = pev->maxspeed; return; } } Vector enemyOrigin = GetEntityOrigin(m_enemy); float distance = (pev->origin - enemyOrigin).GetLength(); if (m_timeWaypointMove + m_frameInterval < engine->GetTime()) { if (GetGameMod() == 2) { float baseDistance = 600.0f; if (::IsInViewCone(pev->origin, m_enemy) && GetNearbyEnemiesNearPosition (GetEntityOrigin (m_enemy), 300) < 3) // SyPB Pro P.37 - Zombie Mode Attack Ai { if (m_currentWeapon == WEAPON_KNIFE) baseDistance = 450.0f; else baseDistance = 400.0f; } else { if (m_currentWeapon == WEAPON_KNIFE) baseDistance = -1.0f; else baseDistance = 300.0f; } if (baseDistance != -1.0f) { int fdPlayer = GetNearbyFriendsNearPosition(pev->origin, (baseDistance > 0.0f) ? int(baseDistance) / 2 : 300); int enPlayer = GetNearbyEnemiesNearPosition(enemyOrigin, (baseDistance > 0.0f) ? int(baseDistance) : 400); baseDistance -= (fdPlayer * 10.0f); baseDistance += (enPlayer * 20.0f); if (baseDistance <= 0.0f) baseDistance = 50.0f; } if (baseDistance < 0.0f) m_moveSpeed = pev->maxspeed; else { if (distance <= baseDistance) m_moveSpeed = -pev->maxspeed; else if (distance >= (baseDistance + 100.0f)) m_moveSpeed = 0.0f; } if (m_moveSpeed > 0.0f) { if (baseDistance != -1.0f) { if (distance <= 100) m_moveSpeed = -pev->maxspeed; else m_moveSpeed = 0.0f; } } } else if (GetGameMod() == 1) { if (m_currentWeapon == WEAPON_KNIFE) m_moveSpeed = pev->maxspeed; else m_moveSpeed = 0.0f; } else { int approach; if ((m_states & STATE_SUSPECTENEMY) && !(m_states & STATE_SEEINGENEMY)) // if suspecting enemy stand still approach = 49; else if (m_isReloading || m_isVIP) // if reloading or vip back off approach = 29; else if (m_currentWeapon == WEAPON_KNIFE) // knife? approach = 100; else { approach = static_cast <int> (pev->health * m_agressionLevel); if (UsesSniper() && (approach > 49)) approach = 49; // SyPB Pro P.35 - Base mode Weapon Ai Improve if (UsesSubmachineGun()) approach += 20; } // only take cover when bomb is not planted and enemy can see the bot or the bot is VIP if (approach < 30 && !g_bombPlanted && (::IsInViewCone(pev->origin, m_enemy) && !UsesSniper () || m_isVIP)) { m_moveSpeed = -pev->maxspeed; GetCurrentTask()->taskID = TASK_SEEKCOVER; GetCurrentTask()->canContinue = true; GetCurrentTask()->desire = TASKPRI_FIGHTENEMY + 1.0f; } else if (approach < 50) m_moveSpeed = 0.0f; else m_moveSpeed = pev->maxspeed; // SyPB Pro P.35 - Base mode Weapon Ai Improve if (distance < 96 && m_currentWeapon != WEAPON_KNIFE) { pev->button |= IN_DUCK; m_moveSpeed = -pev->maxspeed; } } if (UsesSniper()) { m_fightStyle = 1; m_lastFightStyleCheck = engine->GetTime(); } else if (UsesRifle() || UsesSubmachineGun()) { if (m_lastFightStyleCheck + 3.0f < engine->GetTime()) { int rand = engine->RandomInt(1, 100); if (distance < 450) m_fightStyle = 0; else if (distance < 1024) { if (rand < (UsesSubmachineGun() ? 50 : 30)) m_fightStyle = 0; else m_fightStyle = 1; } else { if (rand < (UsesSubmachineGun() ? 80 : 93)) m_fightStyle = 1; else m_fightStyle = 0; } m_lastFightStyleCheck = engine->GetTime(); } } else { if (m_lastFightStyleCheck + 3.0f < engine->GetTime()) { if (engine->RandomInt(0, 100) < 65) m_fightStyle = 1; else m_fightStyle = 0; m_lastFightStyleCheck = engine->GetTime(); } } if (((pev->button & IN_RELOAD) || (m_isReloading) || (m_skill >= 70 && m_fightStyle && distance < 800.0f)) && GetGameMod () != 2 && GetGameMod () != 4) { if (m_strafeSetTime < engine->GetTime()) { // to start strafing, we have to first figure out if the target is on the left side or right side MakeVectors(m_enemy->v.v_angle); Vector dirToPoint = (pev->origin - GetEntityOrigin(m_enemy)).Normalize2D(); Vector rightSide = g_pGlobals->v_right.Normalize2D(); if ((dirToPoint | rightSide) < 0) m_combatStrafeDir = 1; else m_combatStrafeDir = 0; if (engine->RandomInt(1, 100) < 30) m_combatStrafeDir ^= 1; m_strafeSetTime = engine->GetTime() + engine->RandomFloat(0.5, 2.5); } if (m_combatStrafeDir == 0) { if (!CheckWallOnLeft()) m_strafeSpeed = -160.0f; else { m_combatStrafeDir ^= 1; m_strafeSetTime = engine->GetTime() + 0.7f; } } else { if (!CheckWallOnRight()) m_strafeSpeed = 160.0f; else { m_combatStrafeDir ^= 1; m_strafeSetTime = engine->GetTime() + 1.0f; } } if (m_skill > 80 && (m_jumpTime + 5.0f < engine->GetTime() && IsOnFloor() && engine->RandomInt(0, 1000) < (m_isReloading ? 8 : 2) && pev->velocity.GetLength2D() > 150.0f)) pev->button |= IN_JUMP; } else if ((GetGameMod() != 2 && m_fightStyle) || (m_fightStyle && m_moveSpeed == 0.0f)) { bool shouldDuck = true; // should duck // check the enemy height float enemyHalfHeight = ((m_enemy->v.flags & FL_DUCKING) == FL_DUCKING ? 36.0f : 72.0f) / 2; // check center/feet if (!IsVisible(GetEntityOrigin(m_enemy), GetEntity()) && !IsVisible(GetEntityOrigin(m_enemy) + Vector(0, 0, -enemyHalfHeight), GetEntity())) shouldDuck = false; int nearestToEnemyPoint = g_waypoint->FindNearest(GetEntityOrigin(m_enemy)); if (shouldDuck && GetCurrentTask()->taskID != TASK_SEEKCOVER && GetCurrentTask()->taskID != TASK_HUNTENEMY && (m_visibility & VISIBILITY_BODY) && !(m_visibility & VISIBILITY_OTHER) && g_waypoint->IsDuckVisible(m_currentWaypointIndex, nearestToEnemyPoint)) m_duckTime = engine->GetTime() + m_frameInterval * 3.5f; m_moveSpeed = 0.0f; m_strafeSpeed = 0.0f; m_navTimeset = engine->GetTime(); } else m_strafeSpeed = 0.0f; } if (m_duckTime > engine->GetTime()) { m_moveSpeed = 0.0f; m_strafeSpeed = 0.0f; } if (GetGameMod() == 2) return; if (m_moveSpeed != 0.0f) m_moveSpeed = GetWalkSpeed(); if (m_isReloading) { m_moveSpeed = -pev->maxspeed; m_duckTime = engine->GetTime() - (m_frameInterval * 4.0f); } if (!IsInWater() && !IsOnLadder()) { if (m_moveSpeed != 0 || m_strafeSpeed != 0) { if (IsDeadlyDrop(pev->origin + (g_pGlobals->v_forward * m_moveSpeed * 0.2f) + (g_pGlobals->v_right * m_strafeSpeed * 0.2f) + (pev->velocity * m_frameInterval))) { m_strafeSpeed = -m_strafeSpeed; m_moveSpeed = -m_moveSpeed; pev->button &= ~IN_JUMP; } } } }