private void ChangeHealth(float amt, HealthChangeType type) { _health += amt; //TODO: Die, update effective max.... if (_health < 0.0f) { GetComponent <PlayerEventMessenger>().SendDeathEvent(gameObject, "PlayerHealth"); _health = 0.0f; } _healthBar.OnHealthChange(_health / _maxHealth, _maxEffectiveHealth / _maxHealth); }
/// <summary> /// Generalized private health diff calculation function /// </summary> /// <param name="changeType">HealthChangeType representing type of change</param> /// <param name="amount">Integer change</param> /// <returns>|change in HP|</returns> private float ChangeHealth (HealthChangeType changeType, float amount) { float diff = 0; switch (changeType) { case HealthChangeType.Damage: diff = hp - amount < 0 ? 0 : -amount; break; case HealthChangeType.Heal: diff = hp + amount > MAX_HP ? MAX_HP - hp : amount; break; default: // NOTE(jordan): use UnityEngine's Debug, not System's Console.WriteLine Debug.LogError(string.Format("Unrecognized HealthChangeType: {0}", changeType)); break; } Debug.Log(string.Format("HP Change: {0}", diff)); hp += diff; return diff; }
public void ReceiveHealthChangeEvent(GameObject source, string sourceName, float damage, HealthChangeType type) { ChangeHealth(damage, type); }
public void SendHealthChangeEvent(GameObject source, string sourceName, float damage, HealthChangeType type) { foreach (HealthChangeEventReceiver healthChangeEventReceiver in _healthChangeEventReceivers) healthChangeEventReceiver.ReceiveHealthChangeEvent(source, sourceName, damage, type); }
/// <summary> /// 计算技能伤害/治疗 /// </summary> /// <param name="member"></param> /// <param name="target">技能目标</param> /// <param name="type">伤害或治疗</param> /// <param name="unitType">伤害/治疗值类型</param> /// <param name="calculationType">计算类型</param> /// <param name="value">具体值, 必须大于等于0</param> /// <returns>伤害/治疗具体量</returns> public static float GetHurtForSkill(DisplayOwner member, DisplayOwner target, DemageOrCure type, HealthChangeType unitType, HealthChangeCalculationType calculationType, float value) { if (member == null || member.ClusterData == null || target == null || target.ClusterData == null || target.ClusterData.AllData.MemberData == null) { throw new Exception("目标对象为空."); } if (value < 0) { throw new Exception("伤害/治疗值不能为负数."); } var result = 0f; // 区分伤害类型 switch (calculationType) { case HealthChangeCalculationType.Fix: { var zhanqianJueduizhi = member.ClusterData.AllData.MemberData.Attack1; var zhandouJueduizhiAdd = 0.0f; var zhanqianBaifenbiAdd = 0.0f; var zhandouBaifenbiAdd = 0.0f; // 伤害能力 var huoli = (zhanqianJueduizhi + zhandouJueduizhiAdd) * (1 + zhanqianBaifenbiAdd + zhandouBaifenbiAdd); // 减伤 var jianshanglv = AdjustJianshang(member, target); // 克制关系 var kezhixishu = AdjustKezhi(member, target); //if (unitType == HealthChangeType.Percentage) //{ // result = target.ClusterData.AllData.MemberData.TotalHp*value; //} var shanghaijiacheng = 0.0f; var mianyijiacheng = 0.0f; var jinengjiacheng = 0.0f; // 计算增伤 shanghaijiacheng = GetDemageUpper(member, target); // 计算减伤 mianyijiacheng = GetDemageLower(member, target); result = huoli * (1 - jianshanglv) * kezhixishu * (1 + Mathf.Max(-0.8f, (shanghaijiacheng - mianyijiacheng))) + jinengjiacheng; } break; case HealthChangeCalculationType.Calculation: break; } return(result); }
public void ReceiveHealthChangeEvent(GameObject source, string sourceName, float damage, HealthChangeType type) { PlayerInfo player = PlayerInfoManager.instance.GetAttachedPlayer(source); int index = PlayerInfoManager.instance.GetFirstIndexOfTeam(player.team) + player.positionInTeam; if ((type & HealthChangeType.Heal) == 0) { _uiElements[index].AddDamageDealt(-damage); } else { _uiElements[index].AddHealingDone(damage); } }