예제 #1
0
    void OnCollisionEnter(Collision collision)
    {
        AggroData aggroData = new AggroData();

        aggroData.aggro = AggroValue;
        MessageHandler msgHandler = collision.gameObject.GetComponent <MessageHandler>();

        if (collision.gameObject.CompareTag("Enemy") || collision.gameObject.CompareTag("wall") || collision.gameObject.CompareTag("Objects"))
        {
            DestroyObject();
            DoSpellFlare();
            if (collision.gameObject.CompareTag("Enemy") && _SpellCaster != collision.gameObject)
            {
                DisplayDamage(collision.gameObject, _DamageColor, Damage);
            }
        }
        else if ((collision.gameObject.CompareTag("Player/Boy") || collision.gameObject.CompareTag("Player/Girl")) && _SpellCaster.gameObject.tag == "Enemy")
        {
            DestroyObject();
            DoSpellFlare();
            if ((collision.gameObject.CompareTag("Player/Boy") || collision.gameObject.CompareTag("Player/Girl")) && _SpellCaster != collision.gameObject)
            {
                DisplayDamage(collision.gameObject, _DamageColor, Damage);
            }
        }

        if (msgHandler || collision.gameObject.CompareTag("Enemy"))
        {
            msgHandler.GiveMessage(MessageTypes.AGGROCHANGED, _SpellCaster, aggroData);
            //  Debug.Log("Bullet: gave AGGRO message");
            // Debug.Log("BULLET: _Spellcaster is : " + _SpellCaster.name);
            //  Debug.Log("BULLET: aggroData is: " + aggroData.aggro);
            //  Debug.Log("BULLET: collision with: " + collision.gameObject.name);
        }
    }
예제 #2
0
    private void SendMessageToEnemyHealthController()
    {
        DamageData dmgData = new DamageData();

        dmgData.damage = damage;

        AggroData aggroData = new AggroData();

        aggroData.aggro = aggro;

        //Really need to make sure MessageHandler is on all enemies and players
        MessageHandler msgHandler = target.GetComponent <MessageHandler>();

        if (msgHandler)
        {
            if (target.GetComponent <BattleEnemy>())
            {
                if (target.GetComponent <BattleEnemy>().isInvincible == true)
                {
                    //m_audioSource.PlayOneShot(_InvinsibleSFX);
                    return;
                }
            }

            msgHandler.GiveMessage(MessageTypes.DAMAGED, this.gameObject, dmgData);
            msgHandler.GiveMessage(MessageTypes.AGGROCHANGED, this.gameObject, aggroData);
            //Debug.Log("MeleeDamage: this = " + this.name);
        }
    }
예제 #3
0
    /// <summary>
    /// id에 해당하는 db데이터 넣기
    /// </summary>
    /// <param name="id"></param>
    public void AggroDBSetting(short id)
    {
        aggroData = CSV_AI.instance.aggroDictionary[id];

        aggroData.aggroTime          = 2f;
        aggroData.currentTargetMatch = 20f;
    }
    public AggroData AddAggro(Unit attacker, float damage, float percent = 0)
    {
        // 어그로 포인트 계산
        int point = (int)damage;

        //point = (int)(damage + (damage * (attacker.CharInfo.Def * addingDefRate)));
        point = (int)(damage + (damage));     // * attacker.CharInfo.Stats[AbilityType.AddAggro].FinalValue ) );

        AggroData attackerData = FindData(attacker);

        if (attackerData == null)
        {
            // 처음 생긴 어그로라면
            AggroData NewData = new AggroData();
            NewData.Attacker    = attacker;
            NewData.LastAttackT = Time.time;
            NewData.Point       = Mathf.Max(0, point + (point * percent));
            aggroList.Add(NewData);
        }
        else
        {
            //기존 어그로가 있다면
            attackerData.Point  = attackerData.Point + (attackerData.Point * percent);
            attackerData.Point += point;
            attackerData.Point  = Mathf.Max(0, attackerData.Point);

            attackerData.LastAttackT = Time.time;
        }

        return(aggroList[0]);
    }
    /// <summary>
    /// 가장 최상위 타겟을 찾아준다. (주의. Update문에서 사용하지 말것!)
    /// </summary>
    public Unit TopMostTarget()
    {
        Validate();

        eAttackType attackType = Owner.CharInfo.AttackType;

        AggroData selTargetData = aggroList.Find((aggro) => { return(G_GameInfo.CharacterMgr.CanTarget(attackType, aggro.Attacker)); });

        return(null != selTargetData ? selTargetData.Attacker : null);
        //return aggroList.Count > 0 ? aggroList[0].Attacker : null;
    }
    void RecieveMessage(MessageTypes msgType, GameObject go, MessageData msgData)
    {
        switch (msgType)
        {
        case MessageTypes.DAMAGED:
            DamageData dmgData = msgData as DamageData;

            if (gameObject.tag == "Player/Boy" || gameObject.tag == "Player/Girl")
            {
                if (dmgData != null && !invincibility)
                {
                    invincibilityTimer = 0;
                    invincibility      = true;
                    ApplyDamage(dmgData.damage, go);
                }
            }
            if (gameObject.tag == "Enemy" || gameObject.tag == "Objects")
            {
                if (dmgData != null && !invincibility)
                {
                    ApplyDamage(dmgData.damage, go);
                }
            }
            break;

        case MessageTypes.AGGROCHANGED:
            AggroData aggroData = msgData as AggroData;

            if (go.name == "Boy")
            {
                aggroBoy += aggroData.aggro;     //Need to establish Aggro for each character on all enemies
            }
            else if (go.name == "Girl")
            {
                //Debug.Log("here");
                aggroGirl += aggroData.aggro;
            }
            break;

        case MessageTypes.HEALED:     //for healing character
            RecoverData recoverData = msgData as RecoverData;
            if (recoverData != null && !invincibilityHeal)
            {
                invincibilityHealTimer = 0;
                invincibilityHeal      = true;
                //Debug.Log("HealthController: case HEALED");
                RecoverHealth(recoverData.HP_up, go);
            }
            break;
        }
    }
        int IComparable.CompareTo(object o)
        {
            AggroData temp = (AggroData)o;

            if (this.Point == temp.Point)
            {
                return(0);
            }
            else if (this.Point < temp.Point)
            {
                return(1);
            }
            else
            {
                return(-1);
            }
        }
예제 #8
0
    protected virtual void AddAggroEvent(HealthChangeNotificationData hcnd)
    {
        AggroData temp = aggro.GetValue((t) => t.source == hcnd.overallSource);

        if (temp == null)
        {
            if (DEBUGFLAGS.AGGRO)
            {
                Debug.Log("new aggro");
            }
            aggro.Push(new AggroData(hcnd));
            UpdateChosenPlayer();
            return;
        }
        if (DEBUGFLAGS.AGGRO)
        {
            Debug.Log(string.Format("update aggro from {0} to {1}", temp.value, temp.value + hcnd.value * hcnd.aggroPercentage));
        }
        temp.value += hcnd.value * hcnd.aggroPercentage;
        UpdateChosenPlayer();
    }
    public void UpdateAggro()
    {
        Validate();

        aggroList.Sort();

        AggroData topData = aggroList.Count > 0 ? aggroList[0] : null;

        if (null == topData)
        {
            return;
        }

        // 유저 캐릭터들은 정해진 타겟 안바뀌게 하기.
        bool canChangeTarget = !(Owner.UnitType == UnitType.Unit);

        if (Owner.TargetID != topData.Attacker.GetInstanceID() && canChangeTarget)
        {
            Owner.SetTarget(topData.Attacker.GetInstanceID());
        }
    }