Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ This is the changelog for the version V3.0 Don't forget to [join us on Discord](
* Bots don't use 3rd seat of Tanks anymore (by MatiasPastori)
* Support for dynamic-jet-spawn + fixes for some special cases (by MatiasPastori)
* Support of Gunship on Rush-Maps
* Variation in default fire-cycles (by MatiasPastori)

### some open TODOs:
* rework of raycasts for better performance
Expand Down
2 changes: 2 additions & 0 deletions WebUI/classes/BotEditor.js
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,8 @@ const BotEditor = (new function BotEditor() {
case 'defend_g':
case 'defend_h':
case 'back_to_comm':
case 'follow_me':
case 'stop_follow':
WebUI.Call('DispatchEventLocal', 'BotEditor', JSON.stringify({
action: parent.dataset.action
}));
Expand Down
243 changes: 131 additions & 112 deletions ext/Server/Bot.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,184 +17,197 @@ local m_Logger = Logger('Bot', Debug.Server.BOT)
function Bot:__init(p_Player)
-- Player Object.
---@type Player
self.m_Player = p_Player
self.m_Player = p_Player
---@type string
self.m_Name = p_Player.name
self.m_Name = p_Player.name
---@type integer
self.m_Id = p_Player.id
self.m_Id = p_Player.id

-- statemachine-part
self.m_ActiveState = g_BotStates.States.Idle
self.m_StateTimer = 0.0
self.m_ActiveState = g_BotStates.States.Idle
self.m_StateTimer = 0.0

-- create some character proporties
---@type BotBehavior
self.m_Behavior = nil
self.m_Reaction = 0.0
self.m_Accuracy = 0.0
self.m_Skill = 0.0
self.m_PrefWeapon = ""
self.m_PrefVehicle = ""
self.m_Behavior = nil
self.m_Reaction = 0.0
self.m_Accuracy = 0.0
self.m_Skill = 0.0
self.m_PrefWeapon = ""
self.m_PrefVehicle = ""

self._AttackPosition = Vec3.zero
self._AttackPosition = Vec3.zero

-- Common settings.
---@type BotSpawnModes
self._SpawnMode = BotSpawnModes.NoRespawn
self._SpawnMode = BotSpawnModes.NoRespawn
---@type BotMoveModes
self._MoveMode = BotMoveModes.Standstill
self._ForcedMovement = false
self._MoveMode = BotMoveModes.Standstill
self._ForcedMovement = false
---@type BotKits|integer
self.m_Kit = nil
self.m_Kit = nil
-- Only used in BotSpawner.
---@type BotColors|integer
self.m_Color = nil
self.m_Color = nil
---@type Weapon|nil
self.m_ActiveWeapon = nil
self.m_ActiveVehicle = nil
self.m_ActiveGmWeaponName = nil
self.m_ActiveWeapon = nil
self.m_ActiveVehicle = nil
self.m_ActiveGmWeaponName = nil
---@type Weapon|nil
self.m_Primary = nil
self.m_Primary = nil
---@type Weapon|nil
self.m_Pistol = nil
self.m_Pistol = nil
---@type Weapon|nil
self.m_PrimaryGadget = nil
self.m_PrimaryGadget = nil
---@type Weapon|nil
self.m_SecondaryGadget = nil
self.m_SecondaryGadget = nil
---@type Weapon|nil
self.m_Grenade = nil
self.m_Grenade = nil
---@type Weapon|nil
self.m_Knife = nil
self._Respawning = false
self.m_HasBeacon = false
self.m_DontRevive = false
self.m_AttackPriority = 1
self.m_Knife = nil
self._Respawning = false
self.m_HasBeacon = false
self.m_DontRevive = false
self.m_AttackPriority = 1

-- Timers.
self._SpawnDelayTimer = 0.0
self._WayWaitTimer = 0.0
self._VehicleWaitTimer = 0.0
self._VehicleSeatTimer = 0.0
self._VehicleTakeoffTimer = 0.0
self._WayWaitYawTimer = 0.0
self._ObstacleSequenceTimer = 0.0
self._StuckTimer = 0.0
self._ShotTimer = 0.0
self._SoundTimer = 30.0
self._VehicleSecondaryWeaponTimer = 0.0
self._ShootModeTimer = 0.0
self._ReloadTimer = 0.0
self._DeployTimer = 0.0
self._AttackModeMoveTimer = 0.0
self._MeleeCooldownTimer = 0.0
self._ShootTraceTimer = 0.0
self._ActionTimer = 0.0
self._BrakeTimer = 0.0
self._SpawnProtectionTimer = 0.0
self._DefendTimer = 0.0
self._SidewardsTimer = 0.0
self._KillYourselfTimer = 0.0
self._RocketCooldownTimer = 0.0
self._SpawnDelayTimer = 0.0
self._WayWaitTimer = 0.0
self._VehicleWaitTimer = 0.0
self._VehicleSeatTimer = 0.0
self._VehicleTakeoffTimer = 0.0
self._WayWaitYawTimer = 0.0
self._ObstacleSequenceTimer = 0.0
self._StuckTimer = 0.0
self._ShotTimer = 0.0
self._SoundTimer = 30.0
self._VehicleSecondaryWeaponTimer = 0.0
self._ShootModeTimer = 0.0
self._ReloadTimer = 0.0
self._DeployTimer = 0.0
self._AttackModeMoveTimer = 0.0
self._MeleeCooldownTimer = 0.0
self._ShootTraceTimer = 0.0
self._ActionTimer = 0.0
self._BrakeTimer = 0.0
self._SpawnProtectionTimer = 0.0
self._DefendTimer = 0.0
self._SidewardsTimer = 0.0
self._KillYourselfTimer = 0.0
self._RocketCooldownTimer = 0.0

-- Shared movement vars.
---@type BotMoveModes
self.m_ActiveMoveMode = BotMoveModes.Standstill
self.m_ActiveMoveMode = BotMoveModes.Standstill
---@type BotMoveSpeeds
self.m_ActiveSpeedValue = BotMoveSpeeds.NoMovement
self.m_KnifeMode = false
self.m_ActiveSpeedValue = BotMoveSpeeds.NoMovement
self.m_KnifeMode = false

---@class ActiveInput
---@field value number
---@field reset boolean

---@type table<integer|EntryInputActionEnum, ActiveInput>
self.m_ActiveInputs = {}
self.m_DelayedInputs = {}
self.m_ActiveInputs = {}
self.m_DelayedInputs = {}

-- Sidewards movement.
self.m_YawOffset = 0.0
self.m_StrafeValue = 0.0
self.m_YawOffset = 0.0
self.m_StrafeValue = 0.0

-- Advanced movement.
---@type BotAttackModes
self._AttackMode = BotAttackModes.RandomNotSet
self._AttackMode = BotAttackModes.RandomNotSet
---@type BotActionFlags
self._ActiveAction = BotActionFlags.NoActionActive
self._ActiveAction = BotActionFlags.NoActionActive
---@type Waypoint|nil
self._CurrentWayPoint = nil
self._TargetYaw = 0.0
self._TargetYawMovementVehicle = 0.0
self._TargetPitch = 0.0
self._CurrentWayPoint = nil
self._TargetYaw = 0.0
self._TargetYawMovementVehicle = 0.0
self._TargetPitch = 0.0
---@type Waypoint|nil
self._TargetPoint = nil
self._TargetPoint = nil
---@type Waypoint|nil
self._NextTargetPoint = nil
self._PathIndex = 0
self._LastWayDistance = 0.0
self._InvertPathDirection = false
self._ExitVehicleActive = false
self._ObstacleRetryCounter = 0
self._Objective = ''
self._ObjectiveMode = BotObjectiveModes.Default
self._OnSwitch = false
self._ActiveDelay = 0.0
self._VehicleMoveWhileShooting = false
self._NextTargetPoint = nil
self._PathIndex = 0
self._LastWayDistance = 0.0
self._InvertPathDirection = false
self._ExitVehicleActive = false
self._ObstacleRetryCounter = 0
self._Objective = ''
self._ObjectiveMode = BotObjectiveModes.Default
self._OnSwitch = false
self._ActiveDelay = 0.0
self._VehicleMoveWhileShooting = false
self._OnFootStopMovingWhenAttacking = false
self._FireCycleModifier = 1.0

-- Vehicle stuff.
---@type integer|nil
self._VehicleMovableId = -1
self._LastVehicleYaw = 0.0
self._VehicleReadyToShoot = false
self._FullVehicleSteering = false
self._VehicleDirBackPositive = false
self._JetAbortAttackActive = false
self._JetTakeoffActive = false
self._ExitVehicleHealth = 0.0
self._LastVehicleHealth = 0.0
self._VehicleWeaponSlotToUse = 1
self._ActiveVehicleWeaponSlot = 0
self._VehicleMovableId = -1
self._LastVehicleYaw = 0.0
self._VehicleReadyToShoot = false
self._FullVehicleSteering = false
self._VehicleDirBackPositive = false
self._JetAbortAttackActive = false
self._JetTakeoffActive = false
self._ExitVehicleHealth = 0.0
self._LastVehicleHealth = 0.0
self._VehicleWeaponSlotToUse = 1
self._ActiveVehicleWeaponSlot = 0
---@type ControllableEntity|nil
self._RepairVehicleEntity = nil
self._RepairVehicleEntity = nil
-- PID Controllers.
-- Normal driving.
---@type PidController
self._Pid_Drv_Yaw = PidController(5, 0.05, 0.2, 1.0)
self._Pid_Drv_Yaw = PidController(5, 0.05, 0.2, 1.0)
-- Chopper / Plane
---@type PidController
self._Pid_Drv_Throttle = PidController(3, 0.05, 0.2, 1.0)
self._Pid_Drv_Throttle = PidController(3, 0.05, 0.2, 1.0)
---@type PidController
self._Pid_Drv_Tilt = PidController(6, 0.1, 0.2, 1.0)
self._Pid_Drv_Tilt = PidController(6, 0.1, 0.2, 1.0)
---@type PidController
self._Pid_Drv_Roll = PidController(6, 0.1, 0.2, 1.0)
self._Pid_Drv_Roll = PidController(6, 0.1, 0.2, 1.0)
-- Guns.
---@type PidController
self._Pid_Att_Yaw = PidController(10, 2.0, 2.0, 1.0)
self._Pid_Att_Yaw = PidController(10, 2.0, 2.0, 1.0)
---@type PidController
self._Pid_Att_Pitch = PidController(10, 2.0, 2.0, 1.0)
self._Pid_Att_Pitch = PidController(10, 2.0, 2.0, 1.0)

-- Shooting.
self._Shoot = false
self._Shoot = false
---@type Player|nil
self._ShootPlayer = nil
self._ActiveShootDuration = 0.0
self._DoneShootDuration = 0.0
self._DontAttackPlayers = false
self._ShootPlayer = nil
self._ActiveShootDuration = 0.0
self._DoneShootDuration = 0.0
self._DontAttackPlayers = false
---@type VehicleTypes
self._ShootPlayerVehicleType = VehicleTypes.NoVehicle
self._ShootPlayerName = ''
self._DistanceToPlayer = 0.0
self._ShootPlayerVehicleType = VehicleTypes.NoVehicle
self._ShootPlayerName = ''
self._DistanceToPlayer = 0.0
---@type BotWeapons
self._WeaponToUse = BotWeapons.Primary
self._WeaponToUse = BotWeapons.Primary
-- To-do: add emmylua type.
self._ShootWayPoints = {}
self._ShootWayPoints = {}
---@type Vec3[]
self._KnifeWayPositions = {}
self._Accuracy = 0.0
self._AccuracySniper = 0.0
self._SkillFound = false
self._KnifeWayPositions = {}
self._Accuracy = 0.0
self._AccuracySniper = 0.0
self._SkillFound = false

---@type Player|nil
self._TargetPlayer = nil
self._TargetPlayer = nil


-- Following player functionality
self._FollowTargetPlayer = nil
self._PersistentFollowTarget = nil
self._FollowDistance = 3.0
self._FollowAngle = 0
self._FollowStrafeTimer = 0.0
self._FollowLookTimer = 0.0
self._FollowReturnTimer = 0.0
self._FollowLastDist = 0.0
end

---@param p_State any
Expand Down Expand Up @@ -1045,6 +1058,9 @@ function Bot:ResetSpawnVars()
self._ExitVehicleActive = false
self._OnSwitch = false
self._VehicleMoveWhileShooting = false
self._OnFootStopMovingWhenAttacking = false
self._FireCycleModifier = 1.0 -- don't init it at all on spawn?


self.m_AttackPriority = 1
self.m_DelayedInputs = {}
Expand All @@ -1058,6 +1074,9 @@ function Bot:ResetSpawnVars()
}
self.m_Player.input:SetLevel(l_EIA, 0.0)
end

self._FollowReturnTimer = 0.0
self._PersistentFollowTarget = nil
end

---@param p_Player Player
Expand Down
14 changes: 11 additions & 3 deletions ext/Server/Bot/BotAttacking.lua
Original file line number Diff line number Diff line change
Expand Up @@ -337,17 +337,25 @@ local function _DefaultAttackingAction(p_DeltaTime, p_Bot)
end
end
else
if p_Bot._ShotTimer >= (p_Bot.m_ActiveWeapon.fireCycle + p_Bot.m_ActiveWeapon.pauseCycle) then
if p_Bot._ShotTimer >= ((p_Bot.m_ActiveWeapon.fireCycle + p_Bot.m_ActiveWeapon.pauseCycle) * p_Bot._FireCycleModifier) then
p_Bot._ShotTimer = 0.0
local behaviorFactor = 1.0
if p_Bot.m_Behavior == BotBehavior.LongerAttacking then
behaviorFactor = 0.8
elseif p_Bot.m_Behavior == BotBehavior.AbortAttackFast then
behaviorFactor = 1.4
end
local spread = 0.7 - (p_Bot.m_Skill * 0.4 * behaviorFactor)
p_Bot._FireCycleModifier = math.max(0.7, math.min(2.0, Utilities:RandomNormal(1.0, spread)))
end

if p_Bot._ShotTimer >= 0.0 and p_Bot._ActiveAction ~= BotActionFlags.MeleeActive then
if p_Bot.m_ActiveWeapon.delayed == false then
if p_Bot._ShotTimer <= p_Bot.m_ActiveWeapon.fireCycle then
if p_Bot._ShotTimer <= (p_Bot.m_ActiveWeapon.fireCycle * p_Bot._FireCycleModifier) then
_Fire(p_Bot)
end
else -- Start with pause Cycle.
if p_Bot._ShotTimer >= p_Bot.m_ActiveWeapon.pauseCycle then
if p_Bot._ShotTimer >= (p_Bot.m_ActiveWeapon.pauseCycle * p_Bot._FireCycleModifier) then
_Fire(p_Bot)
end
end
Expand Down
Loading