public override Dictionary <PrefabProfile, GameObject> Cast(IAbilityCaster source, Interactable target, Interactable originalTarget, AbilityEffectContext abilityEffectContext) { //Debug.Log(DisplayName + "ChanneledEffect.Cast(" + source + ", " + (target == null ? "null" : target.name) + ")"); if (target == null) { // maybe target died or despawned in the middle of cast? //Debug.Log(DisplayName + "ChanneledEffect.Cast(" + source + ", " + (target == null ? "null" : target.name) + "): TARGE IS NULL"); return(null); } if (abilityEffectContext == null) { abilityEffectContext = new AbilityEffectContext(source); } Dictionary <PrefabProfile, GameObject> returnObjects = base.Cast(source, target, originalTarget, abilityEffectContext); if (returnObjects != null) { //Debug.Log(DisplayName + "ChanneledEffect.Cast(" + source + ", " + (target == null ? "null" : target.name) + ") PREFABOBJECTS WAS NOT NULL"); foreach (PrefabProfile prefabProfile in returnObjects.Keys) { // recently added code will properly spawn the object based on universal attachments // get references to the parent and rotation to pass them onto the channeled object script // since this object will switch parents to avoid moving/rotating with the character body GameObject prefabParent = returnObjects[prefabProfile].transform.parent.gameObject; Vector3 sourcePosition = returnObjects[prefabProfile].transform.localPosition; returnObjects[prefabProfile].transform.parent = playerManager.EffectPrefabParent.transform; IChanneledObject channeledObjectScript = returnObjects[prefabProfile].GetComponent <IChanneledObject>(); if (channeledObjectScript != null) { /* * GameObject prefabParent = source.AbilityManager.UnitGameObject; * Transform usedPrefabSourceBone = null; * if (prefabProfile.TargetBone != null && prefabProfile.TargetBone != string.Empty) { * usedPrefabSourceBone = prefabParent.transform.FindChildByRecursive(prefabProfile.TargetBone); * } * if (usedPrefabSourceBone != null) { * prefabParent = usedPrefabSourceBone.gameObject; * } */ Vector3 endPosition = Vector3.zero; Interactable usedTarget = target; if (abilityEffectContext.baseAbility != null && abilityEffectContext.baseAbility.GetTargetOptions(source).RequiresGroundTarget == true) { endPosition = abilityEffectContext.groundTargetLocation; usedTarget = null; //Debug.Log(DisplayName + "ChanneledEffect.Cast() abilityEffectInput.prefabLocation: " + abilityEffectInput.prefabLocation); } else { endPosition = target.GetComponent <Collider>().bounds.center - target.transform.position; } channeledObjectScript.Setup(prefabParent, sourcePosition, usedTarget?.gameObject, endPosition, systemGameManager); //channeledObjectScript.MyStartObject = prefabParent; //channeledObjectScript.MyStartPosition = source.AbilityManager.UnitGameObject.GetComponent<Collider>().bounds.center - source.MyCharacterUnit.transform.position; //channeledObjectScript.MyStartPosition = prefabProfile.MyPosition; //channeledObjectScript.MyStartPosition = prefabParent.transform.TransformPoint(prefabOffset); //channeledObjectScript.MyEndObject = target.gameObject; //channeledObjectScript.MyEndPosition = target.GetComponent<Collider>().bounds.center - target.transform.position; } else { Debug.LogError(DisplayName + ".ChanneledEffect.Cast(" + source + ", " + (target == null ? "null" : target.name) + "): CHECK INSPECTOR, IChanneledObject NOT FOUND"); } } // delayed damage //source.StartCoroutine(PerformAbilityHitDelay(source, target, abilityEffectInput)); source.AbilityManager.BeginPerformAbilityHitDelay(source, target, abilityEffectContext, this); } else { //Debug.Log(DisplayName + ".ChanneledEffect.Cast(" + source + ", " + (target == null ? "null" : target.name) + ") PREFABOBJECTS WAS NULL"); } return(returnObjects); }
public override Dictionary <PrefabProfile, GameObject> Cast(IAbilityCaster source, Interactable target, Interactable originalTarget, AbilityEffectContext abilityEffectContext) { //Debug.Log(DisplayName + ".KnockBackEffect.Cast()"); if (target == null) { return(null); } Dictionary <PrefabProfile, GameObject> returnObjects = base.Cast(source, target, originalTarget, abilityEffectContext); Vector3 sourcePosition = source.AbilityManager.UnitGameObject.transform.position; Vector3 targetPosition = target.transform.position; CharacterUnit targetCharacterUnit = CharacterUnit.GetCharacterUnit(target); if (targetCharacterUnit != null && targetCharacterUnit.BaseCharacter != null && targetCharacterUnit.BaseCharacter.CharacterAbilityManager != null) { //Debug.Log("KnockBackEffect.Cast(): stop casting"); targetCharacterUnit.BaseCharacter.CharacterAbilityManager.StopCasting(); } if (knockbackType == KnockbackType.Knockback) { if (targetCharacterUnit != null && targetCharacterUnit.BaseCharacter.UnitController.UnitMotor != null) { //Debug.Log("KnockBackEffect.Cast(): casting on character"); targetCharacterUnit.BaseCharacter.UnitController.UnitMotor.Move(GetKnockBackVelocity(sourcePosition, targetPosition), true); } else { Rigidbody rigidbody = target.GetComponent <Rigidbody>(); if (rigidbody != null) { rigidbody.constraints = RigidbodyConstraints.FreezeRotation; rigidbody.AddForce(GetKnockBackVelocity(sourcePosition, targetPosition), ForceMode.VelocityChange); } } } else { Collider[] colliders = new Collider[0]; //int playerMask = 1 << LayerMask.NameToLayer("Default"); //int characterMask = 1 << LayerMask.NameToLayer("CharacterUnit"); //int validMask = (playerMask | characterMask); //int validMask = playerMask; //colliders = Physics.OverlapSphere(targetPosition, explosionRadius, validMask); Vector3 explosionCenter = Vector3.zero; if (abilityEffectContext.groundTargetLocation != Vector3.zero) { explosionCenter = abilityEffectContext.groundTargetLocation; } else { explosionCenter = targetPosition; } colliders = Physics.OverlapSphere(explosionCenter, explosionRadius, explosionMask); foreach (Collider collider in colliders) { //Debug.Log(DisplayName + ".KnockBackEffect.Cast() hit: " + collider.gameObject.name + "; layer: " + collider.gameObject.layer); Rigidbody rigidbody = collider.gameObject.GetComponent <Rigidbody>(); if (rigidbody != null) { //Debug.Log(DisplayName + ".KnockBackEffect.Cast() rigidbody was not null on : " + collider.gameObject.name + "; layer: " + collider.gameObject.layer); //rigidbody.AddForce(GetKnockBackVelocity(targetPosition, collider.gameObject.transform.position), ForceMode.VelocityChange); // we have to handle player knockback specially, as they need to be in knockback state or the idle update will freeze them in place if (collider.gameObject == PlayerManager.MyInstance.ActiveUnitController.gameObject) { PlayerManager.MyInstance.PlayerUnitMovementController.KnockBack(); } // if this is a character, we want to freeze their rotation. for inanimate objects, we want rotation Interactable _interactable = collider.gameObject.GetComponent <Interactable>(); if (_interactable != null && CharacterUnit.GetCharacterUnit(_interactable) != null) { rigidbody.constraints = RigidbodyConstraints.FreezeRotation; } rigidbody.AddExplosionForce(explosionForce, explosionCenter, 0, upwardModifier, ForceMode.VelocityChange); } } } return(returnObjects); }