using Gameplay.Common; using Gameplay.Level; using System.Collections.Generic; using Gameplay.Unit; using static Gameplay.Level.LevelData; namespace Gameplay.AI { public static class AIUtils { public static GameUnit FindNearestEnemyInSightDistance(GameUnit owner) { var enemies = new List(); GameUnitManager.instance.characterManager.SearchEnemies(owner, enemies); var distanceList = new Dictionary(); for (var i = 0; i < enemies.Count; i++) { var enemy = enemies[i]; if (enemy == null) { continue; } var distance = MapUtils.Distance(LevelManager.Instance.CurrentLevel.Map, owner.transData.cellIndex, enemy.transData.cellIndex); if (distance <= owner.fightData.findEnemyRange) { distanceList.Add(enemy, distance); } } if (distanceList.Count <= 0) { return null; } else { var minDistance = float.MaxValue; GameUnit nearestEnemy = null; foreach (var pair in distanceList) { if (minDistance > pair.Value) { minDistance = pair.Value; nearestEnemy = pair.Key; } } return nearestEnemy; } } public static List FindEnemiesInAttackDistance(GameUnit owner) { var enemies = new List(); GameUnitManager.instance.characterManager.SearchEnemies(owner, enemies); var enemiesInAttackDistance = new List(); for (int i = 0; i < enemies.Count; i++) { var enemy = enemies[i]; if (enemy == null || enemy.GetID() == owner.GetID()) { continue; } var distance = MapUtils.Distance(LevelManager.Instance.CurrentLevel.Map, owner.transData.cellIndex, enemy.transData.cellIndex); if (distance <= owner.fightData.attackDistance) { enemiesInAttackDistance.Add(enemy); } } return enemiesInAttackDistance; } public static List FindFriendsInSightDistance(GameUnit owner) { var allFriends = new List(); var friendsInSight = new List(); GameUnitManager.instance.characterManager.SearchFriends(owner, allFriends); for (var i = 0; i < allFriends.Count; i++) { var friend = allFriends[i]; if (friend == null || friend.GetID() == owner.GetID()) { continue; } var distance = MapUtils.Distance(LevelManager.Instance.CurrentLevel.Map, owner.transData.cellIndex, friend.transData.cellIndex); if (distance <= owner.fightData.findEnemyRange) { friendsInSight.Add(friend); } } return friendsInSight; } public static GameUnit GetNearestGameUnit(GameUnit owner,GameUnit newUnit, GameUnit unit) { var distance = MapUtils.Distance( LevelManager.Instance.CurrentLevel.Map, owner.transData.cellIndex, unit.transData.cellIndex); var newDistance = MapUtils.Distance( LevelManager.Instance.CurrentLevel.Map, owner.transData.cellIndex, newUnit.transData.cellIndex); return distance <= newDistance ? unit : newUnit; } public static int FindNearestPointInPatrolInfo(GameUnit owner, List patrolInfos) { var distanceList = new Dictionary(); for (var i = 0; i < patrolInfos.Count; i++) { var point = LevelManager.Instance.CurrentLevel.Map.BlockPosition2TGSCellIndex(patrolInfos[i].patrolPoint); distanceList.Add(i, MapUtils.Distance(LevelManager.Instance.CurrentLevel.Map, owner.transData.cellIndex, point)); } var minDistance = int.MaxValue; int nearestPoint = 0; foreach (var pair in distanceList) { if (minDistance > pair.Value) { minDistance = pair.Value; nearestPoint = pair.Key; } } return nearestPoint; } public static bool IsNeedStop(GameUnit owner) { return owner.statusData.isOnVehicle || owner.statusData.isChaos || owner.statusData.isStun || owner.statusData.isLockPos ||owner.statusData.isRetreat; } } }