public override void OnFrame() { CheckRequirements(); if (Active) { if (VBot.Bot.Observation.Observation.GameLoop - 32 > lastAttackFrame) { foreach (var agent in Controller.GetAgents(Units.ArmyUnits).Where(a => !a.Busy)) { if (!AssignedAgents.Contains(agent)) { AssignedAgents.Add(agent); } } var armyTags = AssignedAgents.Select(a => a.Unit.Tag); targetLocation = VBot.Bot.Map.TargetAttackLocation; var unitCommand = new ActionRawUnitCommand(); unitCommand.AbilityId = (int)Abilities.ATTACK; unitCommand.TargetWorldSpacePos = targetLocation; unitCommand.UnitTags.AddRange(armyTags); lastAttackFrame = VBot.Bot.Observation.Observation.GameLoop; VBot.Bot.AddAction(unitCommand); } } }
public void BuildPylon(ResponseObservation observation, List <Action> actions) { var probes = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.PROBE && d.Alliance == Alliance.Self).ToList(); if (probes.Count() > 16 && observation.Observation.PlayerCommon.FoodCap < observation.Observation.PlayerCommon.FoodUsed + 8 && observation.Observation.PlayerCommon.Minerals >= 100) { PylonCount++; var command = new ActionRawUnitCommand { AbilityId = 881, //pylon TargetWorldSpacePos = new Point2D { X = MainPylon.Pos.X + (PylonCount * 2), Y = MainPylon.Pos.Y }, QueueCommand = true }; command.UnitTags.Add(MainBuildingProbe(probes)); actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } }
private void MoveOver(ResponseObservation observation, List <Action> actions) { var over = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.OVERLORD && d.Alliance == Alliance.Self && d.Orders.Count() == 0).FirstOrDefault(); if (over == null) { return; } var newBase = Bases.Where(b => !b.Taken && !b.OverSent).OrderBy(b => b.DistanceToMain).FirstOrDefault(); if (newBase == null) { return; } newBase.OverSent = true; var command = new ActionRawUnitCommand { AbilityId = 1, TargetWorldSpacePos = new Point2D { X = newBase.Position.X, Y = newBase.Position.Y }, }; command.UnitTags.Add(over.Tag); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
public void AttackProxy(ResponseObservation observation, List <Action> actions) { var zealots = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.ZEALOT && d.Alliance == Alliance.Self); foreach (var zealot in zealots) { if (zealot.Orders.Count() != 0) { continue; } var RandomMineral = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.MINERAL_FIELD).FirstOrDefault(); var command = new ActionRawUnitCommand { AbilityId = 23, //attack, TargetWorldSpacePos = new Point2D { X = RandomMineral.Pos.X, Y = RandomMineral.Pos.Y }, }; command.UnitTags.Add(zealot.Tag); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } }
public void BuildGateWay(ResponseObservation observation, List <Action> actions) { var probes = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.PROBE && d.Alliance == Alliance.Self).ToList(); if (probes.Count() <= 15) { return; } if (GateWayCount < 4 && observation.Observation.PlayerCommon.Minerals >= 150) { var command = new ActionRawUnitCommand { AbilityId = 883, //gateway TargetWorldSpacePos = new Point2D { X = MainPylon.Pos.X - 6 + (GateWayCount * 3), Y = MainPylon.Pos.Y - 3 }, QueueCommand = true }; command.UnitTags.Add(MainBuildingProbe(probes)); actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); GateWayCount++; } }
public void BuildZealots(ResponseObservation observation, List <Action> actions) { var gateways = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.GATEWAY && d.Alliance == Alliance.Self).ToList(); if (gateways.Count() == 0) { return; } foreach (var gateway in gateways) { if (observation.Observation.PlayerCommon.Minerals >= 100 && gateway.Orders.Count() < 1) { var command = new ActionRawUnitCommand { AbilityId = 916 // zealot }; command.UnitTags.Add(gateway.Tag); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } } }
private void BuildZerlings(ResponseObservation observation, List <Action> actions) { var pool = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.SPAWNING_POOL && d.Alliance == Alliance.Self).FirstOrDefault(); if (pool == null) { return; } foreach (var l in observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.LARVA && d.Alliance == Alliance.Self)) { var command = new ActionRawUnitCommand { AbilityId = 1343 }; command.UnitTags.Add(l.Tag); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } }
private void BuildQueen(ResponseObservation observation, List <Action> actions) { if (observation.Observation.PlayerCommon.Minerals < 200) { return; } if (AbilityInProgress(observation, UnitTypes.HATA_ABILITY_BUILD_QUEEN)) { return; } var hata = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.HATCHERY && d.Alliance == Alliance.Self).FirstOrDefault(); if (hata == null) { return; } var command = new ActionRawUnitCommand { AbilityId = UnitTypes.HATA_ABILITY_BUILD_QUEEN, QueueCommand = true }; command.UnitTags.Add(hata.Tag); actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
private void BuildDrones(ResponseObservation observation, List <Action> actions) { var drones = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.DRONE && d.Alliance == Alliance.Self); var pool = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.SPAWNING_POOL && d.Alliance == Alliance.Self).FirstOrDefault(); if (pool != null && observation.Observation.PlayerCommon.FoodArmy < observation.Observation.PlayerCommon.FoodWorkers + 10) { return; } foreach (var l in observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.LARVA && d.Alliance == Alliance.Self)) { var command = new ActionRawUnitCommand { AbilityId = 1342 }; command.UnitTags.Add(l.Tag); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } }
private void AttackZerglings(ResponseObservation observation, List <Action> actions) { var hata = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.HATCHERY && d.Alliance == Alliance.Self).FirstOrDefault(); var zerglings = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.ZERGLING && d.Alliance == Alliance.Self); if (zerglings.Count() < 40) { return; } foreach (var zergling in zerglings) { var command = new ActionRawUnitCommand { AbilityId = 23, //1155 - pool, TargetWorldSpacePos = EnemyStartPosition, }; command.UnitTags.Add(zergling.Tag); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } }
private void BuildHata(ResponseObservation observation, List <Action> actions) { if (observation.Observation.PlayerCommon.Minerals < 300) { return; } if (Bases.Where(b => b.Taken).Count() > 2) { return; } var newBase = GetBaseForPool(); var command = new ActionRawUnitCommand { AbilityId = 1152, TargetWorldSpacePos = new Point2D { X = newBase.Position.X, Y = newBase.Position.Y }, QueueCommand = true }; command.UnitTags.Add(GetBuldingDrone(observation).Tag); actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
public void Order(uint abilityId, Point2D position) { // ignore similar orders if (Unit.Orders.Count > 0) { if (Unit.Orders[0].AbilityId == abilityId) { return; } } // update resources if macro task if (Abilities.CreatesUnit.ContainsKey(abilityId)) { var unitInfo = VBot.Bot.Data.Units[(int)Abilities.CreatesUnit[abilityId]]; VBot.Bot.ReservedMinerals += (int)unitInfo.MineralCost; VBot.Bot.ReservedGas += (int)unitInfo.VespeneCost; VBot.Bot.ReservedSupply += (int)unitInfo.FoodRequired - (int)unitInfo.FoodProvided; } Command = new ActionRawUnitCommand { AbilityId = (int)abilityId, TargetWorldSpacePos = position }; Command.UnitTags.Add(Unit.Tag); VBot.Bot.AddAction(Command); LastCommandFrame = VBot.Bot.Observation.Observation.GameLoop; }
public void Order(int ability, Point2D target) { // Make sure blink doesn't get cancelled. if (LastAbility == Abilities.BLINK && Tyr.Bot.Frame - LastOrderFrame <= 20) { return; } // Short delay between orders to prevent order spam. if (LastAbility == ability && Tyr.Bot.Frame - LastOrderFrame <= 5) { return; } LastAbility = ability; // Ignore orders that are the same or similar to existing orders. if (target != null && Unit.Orders.Count != 0 && Unit.Orders[0].TargetWorldSpacePos != null && SC2Util.DistanceGrid(Unit.Orders[0].TargetWorldSpacePos, target) <= 3 && Unit.Orders[0].AbilityId == ability) { return; } LastOrderFrame = Tyr.Bot.Frame; Command = new ActionRawUnitCommand(); Command.AbilityId = ability; Command.TargetWorldSpacePos = target; Command.UnitTags.Add(Unit.Tag); }
public void AddAction(ActionRawUnitCommand action) { var a = new Action(); a.ActionRaw = new ActionRaw(); a.ActionRaw.UnitCommand = action; AddAction(a); }
public override IEnumerable <SC2APIProtocol.Action> PerformActions(int frame) { var actions = new List <SC2APIProtocol.Action>(); if (WallPoints != null) { var buildings = ActiveUnitData.Commanders.Where(u => u.Value.UnitCalculation.Attributes.Contains(Attribute.Structure) && WallPoints.Any(point => Vector2.DistanceSquared(new Vector2(point.X, point.Y), u.Value.UnitCalculation.Position) < 1)).Select(b => b.Value); if (buildings.Count() == 0) { Ended = true; Disable(); } var attacked = false; foreach (var building in buildings) { if (building != null) { if (building.UnitCalculation.Unit.BuildProgress < 1) { var action = building.Order(frame, Abilities.CANCEL); if (action != null) { actions.AddRange(action); } } else { if (!attacked) { var command = new ActionRawUnitCommand(); foreach (var commander in UnitCommanders) { command.UnitTags.Add(commander.UnitCalculation.Unit.Tag); } command.AbilityId = (int)Abilities.ATTACK; command.TargetUnitTag = building.UnitCalculation.Unit.Tag; var action = new SC2APIProtocol.Action { ActionRaw = new ActionRaw { UnitCommand = command } }; actions.Add(action); attacked = true; } } } } } return(actions); }
public void MineralOptimizationByNikita(ResponseObservation observation, List <Action> actions) { var hatas = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.HATCHERY && d.Alliance == Alliance.Self).ToList(); if (hatas.Count() < 2) { return; } foreach (var h in hatas) { if (h.AssignedHarvesters <= h.IdealHarvesters) { continue; } var boringHata = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.HATCHERY && d.Alliance == Alliance.Self && d.IdealHarvesters > d.AssignedHarvesters).FirstOrDefault(); if (boringHata == null) { return; } var drones = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.DRONE && d.Alliance == Alliance.Self); foreach (var d in drones) { if (IsNeightbors(d, h) && d.Orders.Where(a => a.AbilityId == 1183).Any()) { var bse = Bases.Where(b => b.BaseId == boringHata.Tag).FirstOrDefault(); Unit mineralSent = GetClosestMineral(observation, boringHata.Pos); var command = new ActionRawUnitCommand { AbilityId = 1183, TargetWorldSpacePos = new Point2D { X = mineralSent.Pos.X, Y = mineralSent.Pos.Y }, QueueCommand = true, TargetUnitTag = mineralSent.Tag }; command.UnitTags.Add(d.Tag); actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); return; } } } }
/// <inheritdoc /> public void UseTargetlessAbility(int abilityId, ulong unit, bool queue = false) { var command = new ActionRawUnitCommand { AbilityId = abilityId, QueueCommand = queue, UnitTags = { unit } }; rawManager.QueueActions(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
public void AttackZealots(ResponseObservation observation, List <Action> actions) { if (MainIsKilled) { AttackProxy(observation, actions); return; } var nexus = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.NEXUS && d.Alliance == Alliance.Self).FirstOrDefault(); var zealots = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.ZEALOT && d.Alliance == Alliance.Self); if (zealots.Count() > 20) { MainIsKilled = true; } var EnemyPositionX = 160.5f; var EnemyPositionY = 46.5f; if (nexus.Pos.X == 160.5 && nexus.Pos.Y == 46.5) { EnemyPositionX = 55.5f; EnemyPositionY = 157.5f; } if (zealots.Count() < 5) { return; } foreach (var zealot in zealots) { var command = new ActionRawUnitCommand { AbilityId = 23, //attack, TargetWorldSpacePos = new Point2D { X = EnemyPositionX, Y = EnemyPositionY }, }; command.UnitTags.Add(zealot.Tag); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } }
private void BuildPool(ResponseObservation observation, List <Action> actions) { var hatas = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.HATCHERY && d.Alliance == Alliance.Self).ToList(); if (hatas.Count() < 2) { return; } int buildPoolAbilityId = 1155; //pool var pool = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.SPAWNING_POOL && d.Alliance == Alliance.Self).FirstOrDefault(); if (pool != null) { return; } if (observation.Observation.PlayerCommon.Minerals < 200) { return; } var b2 = GetBaseForPool(); if (b2 == null) { return; } //var hata = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.HATCHERY && d.Alliance == Alliance.Self).FirstOrDefault(); var command = new ActionRawUnitCommand { AbilityId = buildPoolAbilityId, TargetWorldSpacePos = new Point2D { X = b2.Position.X + 4, Y = b2.Position.Y + 1 }, QueueCommand = true }; command.UnitTags.Add(GetBuldingDrone(observation).Tag); actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
/// <inheritdoc /> public void Attack(ulong sourceUnit, ulong targetUnit, bool queue = false) { var command = new ActionRawUnitCommand { AbilityId = BlizzardConstants.Ability.GeneralAttack, QueueCommand = queue, TargetUnitTag = targetUnit, UnitTags = { sourceUnit } }; rawManager.QueueActions(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
/// <inheritdoc /> public void UseTargetedAbility(int abilityId, ulong sourceUnit, ulong targetUnit, bool queue = false) { var command = new ActionRawUnitCommand { AbilityId = abilityId, QueueCommand = queue, TargetUnitTag = targetUnit, UnitTags = { sourceUnit } }; rawManager.QueueActions(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
/// <inheritdoc /> public void UsePointCenteredAbility(int abilityId, ulong unit, Point2D point, bool queue = false) { var command = new ActionRawUnitCommand { AbilityId = abilityId, QueueCommand = queue, TargetWorldSpacePos = point, UnitTags = { unit } }; rawManager.QueueActions(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
/// <inheritdoc /> public void AttackMove(ulong unit, Point2D point, bool queue = false) { var command = new ActionRawUnitCommand { AbilityId = BlizzardConstants.Ability.GeneralAttack, QueueCommand = queue, TargetWorldSpacePos = point, UnitTags = { unit } }; rawManager.QueueActions(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
private void MoveUnit(IUnit unit, Point2D point) { var command = new ActionRawUnitCommand { AbilityId = BlizzardConstants.Ability.Move, QueueCommand = true, TargetWorldSpacePos = point, UnitTags = { unit.Tag } }; rawManager.QueueActions(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); }
internal void ArchonMerge(Agent agent) { // Short delay between orders to prevent order spam. if (Tyr.Bot.Frame - LastOrderFrame <= 5) { return; } agent.Command = null; LastOrderFrame = Tyr.Bot.Frame; Command = new ActionRawUnitCommand(); Command.AbilityId = 1766; Command.UnitTags.Add(Unit.Tag); Command.UnitTags.Add(agent.Unit.Tag); }
internal void ArchonMerge(Agent agent) { // Short delay between orders to prevent order spam. if (Tyr.Bot.Frame - lastOrderFrame <= 5) { return; } agent.Command = null; lastOrderFrame = Tyr.Bot.Frame; System.Console.WriteLine("Merging archon."); Command = new ActionRawUnitCommand(); Command.AbilityId = 1766; Command.UnitTags.Add(Unit.Tag); Command.UnitTags.Add(agent.Unit.Tag); }
public List <SC2APIProtocol.Action> UnloadSpecificUnit(int frame, Abilities ability, ulong targetTag, bool allowSpam = false) { if (!allowSpam && ability == LastAbility && targetTag == LastTargetTag && AbilityOrderTimes[ability] > frame - SpamFrames) { return(null); // if new action is exactly the same, don't do anything to prevent apm spam } var passenger = UnitCalculation.Unit.Passengers.Where(p => p.Tag == targetTag).FirstOrDefault(); if (passenger == null) { return(null); } var selectionCommand = new ActionRawUnitCommand(); selectionCommand.UnitTags.Add(UnitCalculation.Unit.Tag); selectionCommand.AbilityId = 0; var selectAction = new SC2APIProtocol.Action { ActionRaw = new ActionRaw { UnitCommand = selectionCommand }, }; var unloadAction = new SC2APIProtocol.Action { ActionUi = new ActionUI { CargoPanel = new ActionCargoPanelUnload { UnitIndex = UnitCalculation.Unit.Passengers.IndexOf(passenger) } }, }; LastAbility = ability; LastTargetLocation = null; LastTargetTag = targetTag; AbilityOrderTimes[ability] = frame; LastOrderFrame = frame; return(new List <SC2APIProtocol.Action> { selectAction, unloadAction }); }
public void MoveToProxyLocation(ResponseObservation observation, List <Action> actions) { var nexus = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.NEXUS && d.Alliance == Alliance.Self).FirstOrDefault(); var probes = observation.Observation.RawData.Units.Where(d => d.UnitType == UnitTypes.PROBE && d.Alliance == Alliance.Self).ToList(); if (nexus.Pos.X == 160.5 && nexus.Pos.Y == 46.5) { var command = new ActionRawUnitCommand { AbilityId = 1, //move, TargetWorldSpacePos = new Point2D { X = 115, Y = 155 }, }; command.UnitTags.Add(MainBuildingProbe(probes)); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } else { var command = new ActionRawUnitCommand { AbilityId = 1, //move, TargetWorldSpacePos = new Point2D { X = 100, Y = 50 }, }; command.UnitTags.Add(MainBuildingProbe(probes)); command.QueueCommand = true; actions.Add(new Action { ActionRaw = new ActionRaw { UnitCommand = command } }); } }
public SC2APIProtocol.Action Merge(ulong targetTag) { var command = new ActionRawUnitCommand(); command.AbilityId = (int)Abilities.MORPH_ARCHON; command.UnitTags.Add(UnitCalculation.Unit.Tag); command.UnitTags.Add(targetTag); var action = new SC2APIProtocol.Action { ActionRaw = new ActionRaw { UnitCommand = command } }; return(action); }
public void Order(int ability, ulong targetTag) { // Make sure blink doesn't get cancelled. if (LastAbility == Abilities.BLINK && Tyr.Bot.Frame - LastOrderFrame <= 20) { return; } // Ignore orders that are the same or similar to existing orders. if (Unit.Orders.Count != 0 && Unit.Orders[0].TargetUnitTag == targetTag && Unit.Orders[0].AbilityId == ability) { return; } LastAbility = ability; Command = new ActionRawUnitCommand(); Command.AbilityId = ability; Command.TargetUnitTag = targetTag; Command.UnitTags.Add(Unit.Tag); }