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); } }
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); } }
/// <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); } }
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()); } }