public static bool Prefix(BehaviorNode __instance, ref BehaviorTreeResults __result, ref BehaviorTree ___tree, ref AbstractActor ___unit) { try { List <AbstractActor> allAlliesOf = ___unit.Combat.GetAllAlliesOf(___unit); AuraBubble sensors = ___unit.sensorAura(); for (int index1 = 0; index1 < ___tree.enemyUnits.Count; ++index1) { ICombatant enemyUnit = ___tree.enemyUnits[index1]; AbstractActor abstractActor = enemyUnit as AbstractActor; float magnitude = (enemyUnit.CurrentPosition - ___unit.CurrentPosition).magnitude; if (AIUtil.UnitHasVisibilityToTargetFromPosition(___unit, enemyUnit, ___unit.CurrentPosition, allAlliesOf)) { if (___unit.CanEngageTarget(enemyUnit) || ___unit.CanDFATargetFromPosition(enemyUnit, ___unit.CurrentPosition)) { __result = new BehaviorTreeResults(BehaviorNodeState.Success); return(false); } if ((double)magnitude <= (double)___unit.MaxWalkDistance) { __result = new BehaviorTreeResults(BehaviorNodeState.Success); return(false); } if (abstractActor != null && abstractActor.IsGhosted) { float num = Mathf.Lerp(___unit.MaxWalkDistance, ___unit.MaxSprintDistance, ___unit.BehaviorTree.GetBehaviorVariableValue(BehaviorVariableName.Float_SignalInWeapRngWhenEnemyGhostedWithinMoveDistance).FloatVal); float range = sensors.collider.radius; if ((double)Vector3.Distance(___unit.CurrentPosition, abstractActor.CurrentPosition) - (double)range >= (double)num) { continue; } } for (int index2 = 0; index2 < ___unit.Weapons.Count; ++index2) { Weapon weapon = ___unit.Weapons[index2]; if (weapon.CanFire && (double)weapon.MaxRange >= (double)magnitude) { __result = new BehaviorTreeResults(BehaviorNodeState.Success); return(false); } } } } __result = new BehaviorTreeResults(BehaviorNodeState.Failure); return(false); } catch (Exception e) { Log.Debug?.Write(e.ToString() + "\n"); __result = new BehaviorTreeResults(BehaviorNodeState.Failure); return(false); } }
public static bool Prefix(CombatAuraReticle __instance, ref ButtonState __result, ref AbstractActor ___owner, ref CombatHUD ___HUD) { try { AuraBubble aura = __instance.AuraBubble(); if (aura == null) { __result = ButtonState.Disabled; return(false); } __result = __instance.isAuraVisible(aura, ___owner, ___HUD, false)? ButtonState.Enabled : ButtonState.Disabled; return(false); }catch (Exception e) { Log.LogWrite(e.ToString() + "\n"); } return(true); //__instance.GameRep.PlayVFXAt(__instance.GameRep.thisTransform, Vector3.zero, "vfxPrfPrtl_ECM_loop", true, Vector3.zero, false, -1f); }
public static bool Prefix(CombatAuraReticle __instance, ref AbstractActor ___owner, ref float ___currentAuraRange, ref CombatHUD ___HUD, ref Transform ___thisTransform, ref bool __result) { try { //if (CombatHUD_Update_HideReticlesHotKey.hideReticles == AuraShowState.HideAll) { __result = false; return false; }; AuraBubble aura = __instance.AuraBubble(); if (aura == null) { return(true); } ; __result = __instance.isAuraVisible(aura, ___owner, ___HUD, true); return(false); }catch (Exception e) { Log.LogWrite(e.ToString() + "\n"); } return(true); }
public static bool Prefix(AITeam __instance, List <AbstractActor> unusedUnits, ref AbstractActor __result) { try { if (!__instance.CanEntireEnemyTeamBeGhosted()) { __result = null; return(false); } AbstractActor result = (AbstractActor)null; float minDistance = float.MaxValue; for (int index1 = 0; index1 < unusedUnits.Count; ++index1) { AbstractActor unusedUnit = unusedUnits[index1]; List <AbstractActor> enemies = AIUtil.HostilesToUnit(unusedUnit); AuraBubble sensors = unusedUnit.sensorAura(); if (sensors == null) { continue; } ; for (int index2 = 0; index2 < enemies.Count; ++index2) { AbstractActor enemy = enemies[index2]; if (enemy.HasECMAbilityInstalled) { float floatVal = unusedUnit.BehaviorTree.GetBehaviorVariableValue(BehaviorVariableName.Float_SignalInWeapRngWhenEnemyGhostedWithinMoveDistance).FloatVal; float maxMoveDist = Mathf.Lerp(unusedUnit.MaxWalkDistance, unusedUnit.MaxSprintDistance, floatVal); float range = sensors.collider.radius; float needMoveDist = Vector3.Distance(unusedUnit.CurrentPosition, enemy.CurrentPosition) - range; if ((double)needMoveDist <= (double)maxMoveDist && (double)needMoveDist < (double)minDistance) { result = unusedUnit; minDistance = needMoveDist; } } } } __result = result; return(false); }catch (Exception e) { Log.WriteCritical(e.ToString() + "\n"); __result = null; return(false); } }
public static bool Prefix(CombatAuraReticle __instance, bool isBright, ref AbstractActor ___owner, ref CombatHUD ___HUD, ref bool ___currentAPIsBright) { try { AuraBubble aura = __instance.AuraBubble(); if (aura == null) { return(true); } if (isBright == false) { return(false); } isBright = ___HUD.SelectedActor != null && ___HUD.SelectionHandler.ActiveState is SelectionStateMoveBase; if (isBright) { __instance.activeProbeDecal.DecalMaterial = __instance.activeProbeMatBright; //this.apSpinAnim.DORestartById("spin"); } else { __instance.activeProbeDecal.DecalMaterial = __instance.activeProbeMatDim; //this.apSpinAnim.DOPause(); } if (___currentAPIsBright != aura.Def.isSpining) { ___currentAPIsBright = aura.Def.isSpining; if (___currentAPIsBright) { __instance.apSpinAnim.DORestartById("spin"); } else { __instance.apSpinAnim.DOPause(); } } return(false); } catch (Exception e) { Log.LogWrite(e.ToString() + "\n"); } return(true); }
public static bool Prefix(CombatAuraReticle __instance, bool showActiveProbe, ref AbstractActor ___owner, ref float ___currentAPRange) { try { GameObject activeProbeRangeScaledObject = __instance.activeProbeRangeScaledObject(); if (showActiveProbe == false) { activeProbeRangeScaledObject.SetActive(false); return(false); } //AuraBubble mainSensorsBubble = __instance.MainSensors(); //Log.LogWrite("CombatAuraReticle.RefreshAuraRange " + (mainSensorsBubble == null ? "null" : mainSensorsBubble.collider.radius.ToString()) + "\n"); //if (mainSensorsBubble != null) { //auraRangeScaledObject.SetActive(true); //float b = mainSensorsBubble.collider.radius; //if (!Mathf.Approximately(___currentAuraRange, b)) { //auraRangeScaledObject.transform.localScale = new Vector3(b * 2f, 1f, b * 2f); //} //___currentAuraRange = b; //return false; //} AuraBubble auraBubble = __instance.AuraBubble(); if (auraBubble != null) { activeProbeRangeScaledObject.SetActive(true); float b = auraBubble.collider.radius; if (!Mathf.Approximately(___currentAPRange, b)) { activeProbeRangeScaledObject.transform.localScale = new Vector3(b * 2f, 1f, b * 2f); } ___currentAPRange = b; return(false); } } catch (Exception e) { Log.LogWrite(e.ToString() + "\n", true); } return(true); }
public static bool isAuraVisible(this CombatAuraReticle __instance, AuraBubble aura, AbstractActor ___owner, CombatHUD ___HUD, bool spinning) { if (CombatHUD_Update_HideReticlesHotKey.hideReticles == AuraShowState.HideAll) { return(false); } ; if ((___owner.IsVisibleToPlayer() == false) || (___owner.IsOperational == false)) { return(false); } if (aura != null) { if (aura.Def.isSpining != spinning) { return(false); } if (aura.isMainSensors) { if (CombatHUD_Update_HideReticlesHotKey.hideReticles == AuraShowState.ShowAll) { return(true); } if (aura.Def.NotShowOnSelected) { return(false); } ; if (aura.Def.HideOnNotSelected) { if (___HUD.SelectedActor != null) { if (___HUD.SelectedActor.GUID == ___owner.GUID) { return(true); } } return(false); } else { return(true); } } if (aura.source != null) { if (aura.Def.isSpining != spinning) { return(false); } Weapon weapon = aura.source as Weapon; if ((weapon == null) || (aura.Def.Id != "AMS")) { if (CombatHUD_Update_HideReticlesHotKey.hideReticles == AuraShowState.ShowAll) { return(true); } if (aura.Def.NotShowOnSelected) { return(false); } ; if (aura.Def.HideOnNotSelected) { if (___HUD.SelectedActor != null) { if (___HUD.SelectedActor.GUID == ___owner.GUID) { return(true); } } return(false); } else { return(true); } } else { if (weapon.isAMS() == false) { return(false); } if (weapon.IsEnabled == false) { return(false); } if (CombatHUD_Update_HideReticlesHotKey.hideReticles == AuraShowState.ShowAll) { return(true); } if (aura.Def.NotShowOnSelected) { return(false); } ; if (aura.Def.HideOnNotSelected) { if (___HUD.SelectedActor != null) { if (___HUD.SelectedActor.GUID == ___owner.GUID) { return(true); } } return(false); } else { return(true); } } } else { return(false); } } return(false); }
public static AuraPreviewRecord fillPreviewCache(this AbstractActor movingActor, Vector3 position) { AuraActorBody body = movingActor.bodyAura(); if (body == null) { Log.WriteCritical("WARNING!" + movingActor.DisplayName + ":" + movingActor.GUID + " has no body to apply auras\n"); return(new AuraPreviewRecord(movingActor)); } HashSet <AuraBubble> newAuras = new HashSet <AuraBubble>(); HashSet <AuraBubble> remAuras = new HashSet <AuraBubble>(); foreach (var aura in body.affectedAurasEffects) { if (aura.Key.owner.GUID != movingActor.GUID) { remAuras.Add(aura.Key); } } Collider[] hitColliders = Physics.OverlapSphere(position, 1f); foreach (Collider collider in hitColliders) { AuraBubble aura = collider.gameObject.GetComponent <AuraBubble>(); if (aura == null) { continue; } if (aura.Def.RemoveOnSensorLock && movingActor.IsSensorLocked) { continue; } if (aura.owner.GUID == movingActor.GUID) { continue; } if (body.affectedAurasEffects.ContainsKey(aura) == false) { newAuras.Add(aura); } else { remAuras.Remove(aura); } } AuraPreviewRecord result = new AuraPreviewRecord(movingActor); result.aurasAdded.Add(movingActor, new List <AuraPreview>()); result.aurasRemoved.Add(movingActor, new List <AuraPreview>()); List <AuraPreview> tmpList = result.aurasAdded[movingActor]; foreach (AuraBubble aura in newAuras) { if ((aura.owner.GUID == movingActor.GUID) && (aura.Def.ApplySelf == false)) { continue; } tmpList.Add(new AuraPreview(aura.owner, movingActor, aura.Def)); } tmpList = result.aurasRemoved[movingActor]; foreach (AuraBubble aura in remAuras) { tmpList.Add(new AuraPreview(aura.owner, movingActor, aura.Def)); } List <AuraBubble> actorAuras = movingActor.actorAuras(); foreach (AuraBubble aura in actorAuras) { if (aura.collider.enabled == false) { continue; } if (aura.collider.radius < 1f) { continue; } hitColliders = Physics.OverlapSphere(position, aura.collider.radius); HashSet <AbstractActor> newUnits = new HashSet <AbstractActor>(); HashSet <AbstractActor> remUnits = new HashSet <AbstractActor>(); foreach (var unit in aura.affectedTo) { if (unit.owner.GUID != movingActor.GUID) { remUnits.Add(unit.owner); } } foreach (Collider collider in hitColliders) { AuraActorBody otherBody = collider.gameObject.GetComponent <AuraActorBody>(); if (otherBody == null) { continue; } if (movingActor.GUID == otherBody.owner.GUID) { continue; } if (aura.Def.RemoveOnSensorLock && otherBody.owner.IsSensorLocked) { continue; } if (aura.affectedTo.Contains(otherBody) == false) { newUnits.Add(otherBody.owner); } else { remUnits.Remove(otherBody.owner); } } foreach (AbstractActor unit in newUnits) { if (result.aurasAdded.ContainsKey(unit) == false) { result.aurasAdded.Add(unit, new List <AuraPreview>()); } ; result.aurasAdded[unit].Add(new AuraPreview(aura.owner, unit, aura.Def)); } foreach (AbstractActor unit in remUnits) { if (result.aurasRemoved.ContainsKey(unit) == false) { result.aurasRemoved.Add(unit, new List <AuraPreview>()); } ; result.aurasRemoved[unit].Add(new AuraPreview(aura.owner, unit, aura.Def)); } } result.RecalculateStealthPips(); //Log.LogWrite("fillPreviewCache:"+movingActor.DisplayName+" "+position.ToString()+"\n"); //result.DBGLogPrint(); return(result); }