Example #1
0
    public override AttackData GetClone()
    {
        PredatorPlayerAttackData clone = new PredatorPlayerAttackData();

        base.CloneBasic(clone as UnitAnimationData);
        clone.Type                        = this.Type;
        clone.hitTriggerType              = this.hitTriggerType;
        clone.DamageForm                  = this.DamageForm;
        clone.HitTestType                 = this.HitTestType;
        clone.HitRate                     = this.HitRate;
        clone.HitTestCollider             = this.HitTestCollider;
        clone.HitTestDistance             = this.HitTestDistance;
        clone.HitTestAngularDiscrepancy   = this.HitTestAngularDiscrepancy;
        clone.AttackableRange             = this.AttackableRange;
        clone.HitTime                     = this.HitTime;
        clone.Projectile                  = this.Projectile;
        clone.ProjectileInstantiateAnchor = this.ProjectileInstantiateAnchor;
        clone.DamagePointBase             = this.DamagePointBase;
        clone.MinDamageBonus              = this.MinDamageBonus;
        clone.MaxDamageBonus              = this.MaxDamageBonus;
        clone.ScriptObjectAttachToTarget  = this.ScriptObjectAttachToTarget;
        clone.CanDoCriticalAttack         = this.CanDoCriticalAttack;
        clone.CriticalAttackBonusRate     = this.CriticalAttackBonusRate;
        clone.CriticalAttackChance        = this.CriticalAttackChance;
        return(clone);
    }
Example #2
0
 public static PredatorPlayerAttackData[] EditPredatorPlayerAttackDataArray(UnitBase unit, PredatorPlayerAttackData[] predatorPlayerAttackDataArray)
 {
     if (GUILayout.Button("Add PredatorPlayerAttackData:"))
     {
         PredatorPlayerAttackData _p = new PredatorPlayerAttackData();
         predatorPlayerAttackDataArray = Util.AddToArray <PredatorPlayerAttackData>(_p, predatorPlayerAttackDataArray);
     }
     for (int i = 0; i < predatorPlayerAttackDataArray.Length; i++)
     {
         PredatorPlayerAttackData attackData = predatorPlayerAttackDataArray[i];
         if (DynamicalToggle.Keys.Contains(attackData.Name) == false)
         {
             DynamicalToggle.Add(attackData.Name, true);
         }
         EditorGUILayout.BeginHorizontal();
         EditorGUILayout.LabelField("Edit attack data:" + attackData.Name);
         DynamicalToggle[attackData.Name] = EditorGUILayout.Toggle(DynamicalToggle[attackData.Name]);
         EditorGUILayout.EndHorizontal();
         if (DynamicalToggle[attackData.Name] == false)
         {
             continue;
         }
         attackData = EditPredatorPlayerAttackData(unit, attackData);
         predatorPlayerAttackDataArray[i] = attackData;
         if (GUILayout.Button("Delete PredatorPlayerAttackData:" + attackData.Name))
         {
             predatorPlayerAttackDataArray = Util.CloneExcept <PredatorPlayerAttackData>(predatorPlayerAttackDataArray, attackData);
         }
     }
     return(predatorPlayerAttackDataArray);
 }
    public override IEnumerator DoNormalAttack()
    {
        PredatorPlayerAttackData attackData = predatorPlayerUnit.PredatorAttackDataDict[this.NormalAttackDataName];

        StartCoroutine(attackController.SendHitMessage(attackData, CurrentSplitTarget));
        yield return(null);
    }
Example #4
0
    /// <summary>
    /// Process a PredatorCombatData and perform attack behavior.
    /// </summary>
    /// <param name="combat"></param>
    /// <returns></returns>
    IEnumerator DoCombat(PredatorCombatData combat)
    {
        string useAttackDataName            = Util.RandomFromArray <string>(combat.useAttackDataName);
        PredatorPlayerAttackData attackData = this.PredatorPlayerUnit.PredatorAttackDataDict[useAttackDataName];

        if (combat.OverrideAttackData)
        {
            attackData = attackData.GetClone() as PredatorPlayerAttackData;
            attackData.DamagePointBase         = combat.DamagePointBase;
            attackData.MinDamageBonus          = combat.MinDamagePointBonus;
            attackData.MaxDamageBonus          = combat.MaxDamagePointBonus;
            attackData.CanDoCriticalAttack     = combat.CanDoCriticalAttack;
            attackData.CriticalAttackBonusRate = combat.CriticalAttackBonusRate;
            attackData.CriticalAttackChance    = combat.CriticalAttackChance;
        }
        currentProcessCombat = combat;
        //If combat.BlockUserInput = TRUE, user gesture input will be dropped during combat processing
        if (combat.BlockPlayerInput == true)
        {
            ReleaseUserInputBlockTime = Time.time + animation[attackData.AnimationName].length * 0.5f;
            BlockUserGestureInput     = true;
        }

        //Look for enemy - in near radius
        float DistanceToEnemy = 0;

        CurrentTarget = FindTarget(transform.forward, RushRadius, out DistanceToEnemy);

//		Debug.Log(string.Format("Find the target:{0}, enemy distance:{1}, AttackableRange:{2}", CurrentTarget,DistanceToEnemy,attackData.AttackableRange) );

        if (CurrentTarget != null)
        {
            Util.RotateToward(transform, CurrentTarget.transform.position, false, 0);
            //if target farer than attack attackableRange, rush to the target.
            if (DistanceToEnemy > attackData.AttackableRange)
            {
                yield return(StartCoroutine(RushTo(CurrentTarget.transform, 0.3f)));
            }
            //if attackData.hitTriggerType = ByTime, means the message should be sent N seconds after animation.
            //else if attackData.hitTriggerType = ByEvent, the message should be triggered by animation event.
            if (attackData.hitTriggerType == HitTriggerType.ByTime)
            {
                StartCoroutine(SendHitMessage(attackData, CurrentTarget));
            }
        }
        animation.CrossFade(attackData.AnimationName);
        if (combat.FinalCombat)
        {
            Invoke("ClearUnprocessCombatList", animation[attackData.AnimationName].length * 0.5f);
        }
        if (combat.WaitUntilAnimationReturn)
        {
            yield return(new WaitForSeconds(animation[attackData.AnimationName].length));
        }
        else
        {
            yield return(new WaitForSeconds(CombatCooldown));
        }
    }
Example #5
0
    void _Attack(string AttackDataName)
    {
        PredatorPlayerAttackData attackData = this.PredatorPlayerUnit.PredatorAttackDataDict[AttackDataName];

        if (CurrentTarget != null && IsTargetDead(CurrentTarget) == false)
        {
            StartCoroutine(SendHitMessage(attackData, CurrentTarget));
        }
    }
Example #6
0
    /// <summary>
    /// Sends the ApplyDamage message to enemy.
    /// </summary>
    public IEnumerator SendHitMessage(PredatorPlayerAttackData attackData, GameObject enemy)
    {
        if (enemy == null)
        {
            yield break;
        }
        //if attackData.hitTime > 0, wait for the hitTime.
        if (Mathf.Approximately(attackData.HitTime, 0) == false)
        {
            yield return(new WaitForSeconds(attackData.HitTime));
        }
        //in case the enemy object is destoryed between the previous yield time.
        if (enemy == null)
        {
            yield break;
        }
        //if attack type = Instant, means there is only one target to be attacked.
        if (attackData.Type == AIAttackType.Instant)
        {
            if (CheckHitCondition(enemy, attackData))
            {
                //send applyDamage to target.
                DamageParameter damageParam = GetDamageParameter(attackData);
                enemy.SendMessage("ApplyDamage", damageParam);

                //at each hit, plus the rage
                this.PredatorPlayerUnit.Rage = Mathf.Clamp(this.PredatorPlayerUnit.Rage + this.PredatorPlayerUnit.RageEarnPerHit, 0, this.PredatorPlayerUnit.MaxRage);

                //send GameEvent to HUD to display the damage text.
                GameEvent _e = new GameEvent(GameEventType.DisplayDamageParameterOnNPC);
                _e.receiver        = enemy;
                _e.ObjectParameter = damageParam;
                PredatorPlayerUnit.HUDObject.SendMessage("OnGameEvent", _e);
            }
        }
        else if (attackData.Type == AIAttackType.Regional)
        {
            Collider[] colliders = Physics.OverlapSphere(transform.position, this.RushRadius, this.EnemyLayer);
            foreach (Collider collider in colliders)
            {
                if (attackData.HitTestCollider.bounds.Intersects(collider.bounds))
                {
                    //send applyDamage to every object intersect with the hitTestCollider.
                    DamageParameter damageParam = GetDamageParameter(attackData);
                    collider.gameObject.SendMessage("ApplyDamage", damageParam);
//				   this.SendMessage("AddRage", damageParam);
                    //send GameEvent to HUD to display the damage text.
                    GameEvent _e = new GameEvent(GameEventType.DisplayDamageParameterOnNPC);
                    _e.receiver        = collider.gameObject;
                    _e.ObjectParameter = damageParam;
                    PredatorPlayerUnit.HUDObject.SendMessage("OnGameEvent", _e);
                }
            }
        }
    }
Example #7
0
    public DamageParameter GetDamageParameter(PredatorPlayerAttackData attackData)
    {
        DamageParameter dp = new DamageParameter(this.gameObject, attackData.DamageForm, 0);

        UnityEngine.Random.seed = DateTime.Now.Millisecond;
        //calculate damage point = base point + random(min, max)
        dp.damagePoint = attackData.DamagePointBase + UnityEngine.Random.Range(attackData.MinDamageBonus, attackData.MaxDamageBonus);
        //if critical attack is enabled and random chance matches, multiple the bonus rate.
        //Usually, designer can put the critical attack chance to the final combat of a combo-combat, this is like the great-final hit.
        if (attackData.CanDoCriticalAttack && UnityEngine.Random.Range(0f, 1f) <= attackData.CriticalAttackChance)
        {
            dp.damagePoint *= attackData.CriticalAttackBonusRate;
            dp.extraParameter.Add(DamageParameter.ExtraParameterKey.IsCriticalStrike, true);
            dp.extraParameter.Add(DamageParameter.ExtraParameterKey.CritcialStrikeRate, attackData.CriticalAttackBonusRate);
        }
        return(dp);
    }
    /// <summary>
    /// Sends the ApplyDamage message to enemy.
    /// </summary>
    public IEnumerator SendHitMessage(PredatorPlayerAttackData attackData, GameObject enemy)
    {
        if (enemy == null) {
            yield break;
        }
        //if attackData.hitTime > 0, wait for the hitTime.
        if (Mathf.Approximately (attackData.HitTime, 0) == false) {
            yield return new WaitForSeconds(attackData.HitTime);
        }
        //in case the enemy object is destoryed between the previous yield time.
        if (enemy == null)
        {
            yield break;
        }
        //if attack type = Instant, means there is only one target to be attacked.
        if(attackData.Type == AIAttackType.Instant)
        {
            if(CheckHitCondition(enemy, attackData))
            {
               //send applyDamage to target.
               DamageParameter damageParam = GetDamageParameter(attackData);
               enemy.SendMessage ("ApplyDamage", damageParam);

               //at each hit, plus the rage
               this.PredatorPlayerUnit.Rage = Mathf.Clamp(this.PredatorPlayerUnit.Rage + this.PredatorPlayerUnit.RageEarnPerHit, 0, this.PredatorPlayerUnit.MaxRage);

               //send GameEvent to HUD to display the damage text.
               GameEvent _e = new GameEvent(GameEventType.DisplayDamageParameterOnNPC);
               _e.receiver = enemy;
               _e.ObjectParameter = damageParam;
               PredatorPlayerUnit.HUDObject.SendMessage("OnGameEvent", _e);
            }
        }
        else if(attackData.Type == AIAttackType.Regional)
        {
            Collider[] colliders = Physics.OverlapSphere(transform.position, this.RushRadius, this.EnemyLayer);
            foreach(Collider collider in colliders)
            {
                if(attackData.HitTestCollider.bounds.Intersects(collider.bounds))
                {
                   //send applyDamage to every object intersect with the hitTestCollider.
                   DamageParameter damageParam = GetDamageParameter(attackData);
                   collider.gameObject.SendMessage ("ApplyDamage", damageParam);
        //				   this.SendMessage("AddRage", damageParam);
                   //send GameEvent to HUD to display the damage text.
                   GameEvent _e = new GameEvent(GameEventType.DisplayDamageParameterOnNPC);
                   _e.receiver = collider.gameObject;
                   _e.ObjectParameter = damageParam;
                   PredatorPlayerUnit.HUDObject.SendMessage("OnGameEvent", _e);
                }
            }
        }
    }
 public DamageParameter GetDamageParameter(PredatorPlayerAttackData attackData)
 {
     DamageParameter dp = new DamageParameter(this.gameObject, attackData.DamageForm, 0);
     UnityEngine.Random.seed = DateTime.Now.Millisecond;
     //calculate damage point = base point + random(min, max)
     dp.damagePoint = attackData.DamagePointBase + UnityEngine.Random.Range(attackData.MinDamageBonus, attackData.MaxDamageBonus);
     //if critical attack is enabled and random chance matches, multiple the bonus rate.
     //Usually, designer can put the critical attack chance to the final combat of a combo-combat, this is like the great-final hit.
     if(attackData.CanDoCriticalAttack && UnityEngine.Random.Range(0f,1f) <= attackData.CriticalAttackChance)
     {
         dp.damagePoint *= attackData.CriticalAttackBonusRate;
         dp.extraParameter.Add(DamageParameter.ExtraParameterKey.IsCriticalStrike, true);
         dp.extraParameter.Add(DamageParameter.ExtraParameterKey.CritcialStrikeRate, attackData.CriticalAttackBonusRate);
     }
     return dp;
 }
 public static PredatorPlayerAttackData[] EditPredatorPlayerAttackDataArray(UnitBase unit, PredatorPlayerAttackData[] predatorPlayerAttackDataArray)
 {
     if(GUILayout.Button("Add PredatorPlayerAttackData:"))
     {
        PredatorPlayerAttackData _p = new PredatorPlayerAttackData();
        predatorPlayerAttackDataArray = Util.AddToArray<PredatorPlayerAttackData>(_p, predatorPlayerAttackDataArray);
     }
     for(int i=0; i<predatorPlayerAttackDataArray.Length; i++)
     {
        PredatorPlayerAttackData attackData = predatorPlayerAttackDataArray[i];
        if(DynamicalToggle.Keys.Contains(attackData.Name) == false)
        {
             DynamicalToggle.Add(attackData.Name, true);
        }
        		   EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Edit attack data:" + attackData.Name);
        DynamicalToggle[attackData.Name] = EditorGUILayout.Toggle(DynamicalToggle[attackData.Name]);
        EditorGUILayout.EndHorizontal();
        if(DynamicalToggle[attackData.Name] == false)
        {
             continue;
        }
        attackData = EditPredatorPlayerAttackData(unit,attackData);
        predatorPlayerAttackDataArray[i] = attackData;
        if(GUILayout.Button("Delete PredatorPlayerAttackData:"+attackData.Name))
        {
           predatorPlayerAttackDataArray = Util.CloneExcept<PredatorPlayerAttackData>(predatorPlayerAttackDataArray, attackData);
        }
     }
     return predatorPlayerAttackDataArray;
 }
 public static PredatorPlayerAttackData EditPredatorPlayerAttackData(UnitBase unit, PredatorPlayerAttackData predatorPlayerAttackData)
 {
     EditorCommon.EditAttackData(unit, predatorPlayerAttackData);
     predatorPlayerAttackData.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack ?" , predatorPlayerAttackData.CanDoCriticalAttack);
     if(predatorPlayerAttackData.CanDoCriticalAttack)
     {
         predatorPlayerAttackData.CriticalAttackChance = EditorGUILayout.Slider("Critical attack chance:", 0,1,predatorPlayerAttackData.CriticalAttackChance);
         predatorPlayerAttackData.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical attack bonus rate:", predatorPlayerAttackData.CriticalAttackBonusRate);
     }
     return predatorPlayerAttackData;
 }
Example #12
0
 public override AttackData GetClone()
 {
     PredatorPlayerAttackData clone = new PredatorPlayerAttackData();
     base.CloneBasic(clone as UnitAnimationData);
     clone.Type = this.Type;
     clone.hitTriggerType = this.hitTriggerType;
     clone.DamageForm = this.DamageForm;
     clone.HitTestType = this.HitTestType;
     clone.HitRate = this.HitRate;
     clone.HitTestCollider = this.HitTestCollider;
     clone.HitTestDistance = this.HitTestDistance;
     clone.HitTestAngularDiscrepancy = this.HitTestAngularDiscrepancy;
     clone.AttackableRange = this.AttackableRange;
     clone.HitTime = this.HitTime;
     clone.Projectile = this.Projectile;
     clone.ProjectileInstantiateAnchor = this.ProjectileInstantiateAnchor;
     clone.DamagePointBase = this.DamagePointBase;
     clone.MinDamageBonus = this.MinDamageBonus;
     clone.MaxDamageBonus = this.MaxDamageBonus;
     clone.ScriptObjectAttachToTarget = this.ScriptObjectAttachToTarget;
     clone.CanDoCriticalAttack = this.CanDoCriticalAttack;
     clone.CriticalAttackBonusRate = this.CriticalAttackBonusRate;
     clone.CriticalAttackChance = this.CriticalAttackChance;
     return clone;
 }
Example #13
0
 public static PredatorPlayerAttackData EditPredatorPlayerAttackData(UnitBase unit, PredatorPlayerAttackData predatorPlayerAttackData)
 {
     EditorCommon.EditAttackData(unit, predatorPlayerAttackData);
     predatorPlayerAttackData.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack ?", predatorPlayerAttackData.CanDoCriticalAttack);
     if (predatorPlayerAttackData.CanDoCriticalAttack)
     {
         predatorPlayerAttackData.CriticalAttackChance    = EditorGUILayout.Slider("Critical attack chance:", 0, 1, predatorPlayerAttackData.CriticalAttackChance);
         predatorPlayerAttackData.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical attack bonus rate:", predatorPlayerAttackData.CriticalAttackBonusRate);
     }
     return(predatorPlayerAttackData);
 }