예제 #1
0
        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);
        }
예제 #2
0
        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);
        }