protected override void OnDeath() { if (owner != null && !(owner.Equals(null)) && owner.GetUnitsCommanding().Contains(this)) { owner.GetUnitsCommanding().Remove(this); } base.OnDeath(); }
/// <summary> /// Starts the spawning countdown /// </summary> public override void Activate() { if (craft != null && craft.GetUnitsCommanding().Count < craft.GetTotalCommandLimit()) { base.Activate(); } else if (craft is PlayerCore player && craft.GetUnitsCommanding().Count >= craft.GetTotalCommandLimit()) { player.alerter.showMessage("Unit limit reached!", "clip_alert"); } }
/// <summary> /// Starts the spawning countdown /// </summary> public override void Activate() { if (craft != null && craft.GetUnitsCommanding().Count < craft.GetTotalCommandLimit()) { //Core.TakeEnergy(-energyCost); i'm not sure what this line of code does, but it seemed to make drones take energy from the user's max energy instead of their current energy base.Activate(); } else if (craft is PlayerCore player && craft.GetUnitsCommanding().Count >= craft.GetTotalCommandLimit()) { player.alerter.showMessage("Unit limit reached!", "clip_alert"); } }
/// <summary> /// Starts the spawning countdown /// </summary> public override void Activate() { if (craft != null && craft.GetUnitsCommanding().Count < craft.GetTotalCommandLimit()) { Core.TakeEnergy(-energyCost); base.Activate(); } else if (craft as PlayerCore && craft.GetUnitsCommanding().Count >= craft.GetTotalCommandLimit()) { (craft as PlayerCore).alerter.showMessage("Unit limit reached!", "clip_alert"); } }
public void SetOwner(IOwner owner) { this.owner = owner; ai.owner = owner; owner.GetUnitsCommanding().Add(this); if (owner as AirCarrier || owner as GroundCarrier) { // GET THE DRONES TO MOVE ai.setMode(AirCraftAI.AIMode.Path); var path = ScriptableObject.CreateInstance <Path>(); path.waypoints = new List <Path.Node>(); var vec = Vector2.zero; if (owner as AirCarrier) { foreach (var ent in BattleZoneManager.getTargets()) { if (ent && ent is ICarrier && !FactionManager.IsAllied(ent.faction, owner.GetFaction()) && ent.transform) { vec = ent.transform.position; } } } // otherwise this is a ground carrier, drones are defensive for them so set a path to the drone position currently else { var angle = Random.Range(0F, 360); vec = owner.GetTransform().position + new Vector3(5 * Mathf.Sin(angle), 5 * Mathf.Cos(angle)); } // TODO: jank, fix this eventually var node = new Path.Node(); node.position = vec; node.ID = 0; node.children = new List <int>(); if (vec != Vector2.zero) { path.waypoints.Add(node); } if (owner as AirCarrier) { ai.setPath(path); } else { NodeEditorFramework.Standard.PathData data = new NodeEditorFramework.Standard.PathData(); data.waypoints = new List <NodeEditorFramework.Standard.PathData.Node>(); // TODO: LOL THESE TWO ARE DIFFERENT, unify them foreach (var point in path.waypoints) { var node2 = new NodeEditorFramework.Standard.PathData.Node(); node2.ID = point.ID; node2.children = point.children; node2.position = point.position; data.waypoints.Add(node2); } ai.setPath(data, null, true); } } }
/// <summary> /// Starts the spawning countdown /// </summary> protected override void Execute() { if (craft != null && craft.GetUnitsCommanding().Count < craft.GetTotalCommandLimit()) { isActive = true; // set to active isOnCD = true; // set to on cooldown ToggleIndicator(); } else { Core.TakeEnergy(-energyCost); } if (craft as PlayerCore && craft.GetUnitsCommanding().Count >= craft.GetTotalCommandLimit()) { (craft as PlayerCore).alerter.showMessage("Unit limit reached!", "clip_alert"); } }
public void Update() { // TODO: timers & member boolean variables to reduce checks each frame if (!useAbilities) { return; } if (timer > Time.time) { return; } timer = Time.time + interval; // Use abilities if needed if (!ai.movement.targetIsInRange()) { if (ai.movement.DistanceToTarget > 5f) { bool allowSpeed = true; if (craft.faction == 0 && PlayerCore.Instance != null && !PlayerCore.Instance.GetIsDead() && ai.movement.GetTarget() != null) { // Don't run away or get behind when escorting a player float ownD = ((Vector2)ai.movement.GetTarget() - (Vector2)craft.transform.position).sqrMagnitude; float playerD = ((Vector2)ai.movement.GetTarget() - (Vector2)PlayerCore.Instance.transform.position).sqrMagnitude; allowSpeed = playerD < ownD; } if (allowSpeed) { var speeds = GetAbilities(1); int half = Mathf.CeilToInt(speeds.Count() / 2f); int count = 0; foreach (var booster in speeds) { booster.Activate(); if (booster.GetActiveTimeRemaining() > 0) { if (++count >= half) { break; } } } } } } if (craft.GetHealth()[0] < craft.GetMaxHealth()[0] * 0.8f) { var shellBoosts = GetAbilities(2, 17, 26, 29, 30, 31); // shell heal, shell regen, area restore foreach (var booster in shellBoosts) { if (craft.GetHealth()[0] > craft.GetMaxHealth()[0] * 0.9f) { break; } booster.Activate(); } } if (craft.GetHealth()[0] < craft.GetMaxHealth()[0] * 0.25f && Time.time > nextStealth) { var escapeAbilities = GetAbilities(24, 29, 27); // stealth, absorption, pin down foreach (var escapeAbility in escapeAbilities) { escapeAbility.Activate(); if (escapeAbility.GetActiveTimeRemaining() > 0f) { nextStealth = Time.time + escapeAbility.GetActiveTimeRemaining() + 1.0f; break; } } } if (craft.GetHealth()[0] < craft.GetMaxHealth()[0] * 0.2f) { var retreats = GetAbilities(28); // retreat foreach (var retreat in retreats) { bool CD = retreat.TimeUntilReady() > 0f; if (!CD) { retreat.Activate(); if (retreat.TimeUntilReady() > 0f) { break; } } } } if (craft.GetHealth()[1] < craft.GetMaxHealth()[1] * 0.5f) { var core = GetAbilities(11, 31); // core heal & regen foreach (var ability in core) { ability.Activate(); if (ability.GetActiveTimeRemaining() > 0) { break; } } } if (craft.GetHealth()[2] < craft.GetMaxHealth()[2] * 0.5f) { var energy = GetAbilities(12, 32); // energy add & regen foreach (var ability in energy) { ability.Activate(); if (ability.GetActiveTimeRemaining() > 0) { break; } } } var target = craft.GetTargetingSystem().GetTarget(); if (target != null && target) { Entity targetEntity = target.GetComponent <Entity>(); if (targetEntity != null && targetEntity && !targetEntity.GetIsDead()) { var damageBoosts = GetAbilities(25, 33); // damage boost, disrupt foreach (var damageBoost in damageBoosts) { damageBoost.Activate(); } // TODO: use only if the enemy is close enough! var pinDown = GetAbilities(27); // pin down if (Time.time > nextPin) { foreach (var pin in pinDown) { if (pin.GetActiveTimeRemaining() <= 0) { pin.Activate(); if (pin.GetActiveTimeRemaining() > 0f) { nextPin = Time.time + pin.GetActiveTimeRemaining() - 1.5f; // 2 sec activation time, leave 0.5 sec for fleeing break; } } } } } } if (craft is IOwner && target != null && target) { IOwner owner = craft as IOwner; if (owner.GetUnitsCommanding().Count < owner.GetTotalCommandLimit()) { var droneSpawns = GetAbilities(10); // drone spawn foreach (var droneSpawn in droneSpawns) { droneSpawn.Activate(); } } } }
public void SetOwner(IOwner owner) { this.owner = owner; owner.GetUnitsCommanding().Add(this); }