void CreateConsumedAttribute() { conAttributes = new ConsumedAttribute[(int)ConsumedAttributeName.Count]; for (int i = 0; i < conAttributes.Length; i++) { conAttributes[i] = new ConsumedAttribute((ConsumedAttributeName)i, GetConsumedAttributeModifier((ConsumedAttributeName)i)); } }
public override void OnBuff(BaseCharacterBehavior character, BaseCharacterBehavior caster, bool stackable = false, float updateValue = 0) { if (stackable) { stack++; valueOverLayer.Add(updateValue); } else { stack = 1; if (updateValue != 0) { valueOverLayer[0] = updateValue; } } this.caster = caster; ConsumedAttribute conAttr = character.status.GetConsumedAttrubute(this.attr3); int addMount = (int)(type == BuffType.Absolute ? valueOverLayer[stack - 1] : conAttr.baseValue * valueOverLayer[stack - 1]); conAttr.buffedValue += addMount; if (addMount != 0) { character.buffHt.SetText(conAttr.name.ToString() + (addMount > 0 ? " + " : " ") + addMount); } switch (attr3) { case ConsumedAttributeName.Health: character.Heal(addMount, caster); character.Heal(onceValue, caster); if (addMount + onceValue < 0) { caster.CurrentMakeDamage += -(addMount + onceValue); } break; case ConsumedAttributeName.Mana: character.ManaRecover(addMount); character.ManaRecover(onceValue); break; case ConsumedAttributeName.Energy: character.EnergyRecover(addMount); character.EnergyRecover(onceValue); break; default: break; } if (ofTimeValue != 0) { this.status = character.status; timer = Time.time; } }
protected virtual void Awake() { myTransform = transform; buildPosition = transform.position; hp = new ConsumedAttribute(ConsumedAttributeName.Health, MaxHealth, 0, 0, 50, new AttributeModifier(), MaxHealth); GetComponent <Damagable>().damageHandler += Build_damageHandler; this.tag = Tags.Build; GameObject go; var hudTextPoint = myTransform.Find("BuffHUDTextPoint"); if (hudTextPoint != null) { go = hudTextPoint.gameObject; } else { go = new GameObject("BuffHUDTextPoint"); go.transform.parent = myTransform; go.transform.position = myTransform.position + new Vector3(0, .1f, 0); hudTextPoint = go.transform; } ht = (GameObject.Instantiate( ResourceLoader.UIPrefabs.GetHurtText(), go.transform.position, Quaternion.identity) as GameObject) .GetComponent <HurtText>(); ht.InitailHUDText(hudTextPoint); var bloodPoint = myTransform.Find("BloodPoint"); if (bloodPoint != null) { go = bloodPoint.gameObject; } else { go = new GameObject("BloodPoint"); go.transform.parent = myTransform; go.transform.position = myTransform.position + new Vector3(0, .5f, 0); } GameObject bb = GameObject.Instantiate(ResourceLoader.UIPrefabs.GetBuildBlood(), go.transform.position, Quaternion.identity) as GameObject; buildBlood = bb.GetComponent <BuildBlood>(); buildBlood.InitialWithTarget(go.transform, this); if (myTransform.Find("DestroyFire") != null) { destroyFire = myTransform.Find("DestroyFire").gameObject; } SetNPCType(type); }
public override void OnDeBuff(BaseCharacterBehavior character) { ConsumedAttribute conAttr = character.status.GetConsumedAttrubute(this.attr3); foreach (float value in valueOverLayer) { int addMount = (int)(type == BuffType.Absolute ? value: conAttr.baseValue * value) * -1; conAttr.buffedValue += addMount * stack; if (addMount != 0) { character.buffHt.SetText(conAttr.name.ToString() + (addMount > 0 ? " + " : " ") + addMount); } } }
//Combat public void Heal(float mount, BaseCharacterBehavior source) { if (IsDead) { return; } if (mount == 0) { return; } ConsumedAttribute health = status.GetConsumedAttrubute(ConsumedAttributeName.Health); if (health.LossValue == 0) { return; } mount *= status.GetStaticAttribute(StaticAttributeName.HealTakeFix).AdjustedValue; source.CurrentMakeHealing += mount; if (health.LossValue < mount) { mount = health.LossValue; } health.CurValue += mount; if (healingColloctEnable) { HealingCounterInDelta += mount; } else { healingColloctEnable = true; ht.SetText((int)mount); } if (health.CurValue <= 0) { Dead(); } else { //保留event("GetHeal"); } }
public void Damage(DamageType type, IDamageMaker damageMaker, BaseCharacterBehavior source, bool triggerEvent) { if (IsDead) { return; } bool isCritical; float additionHit; float mount = damageMaker.GetCurDamage(type, out isCritical, out additionHit); if (mount == 0) { return; } float damage = 0; if (type == DamageType.Nature) { damage = mount; } else { //Calculate hit float dodge = status.GetSecondaryAttrubute(SecondaryAttributeName.Dodge).AdjustedValue; int dodgeRnd = Random.Range(0, 1000); if (type != DamageType.Magic && dodgeRnd < dodge) { //Miss if (dodge > additionHit) { ht.SetText("Miss!!"); return; } } float deffence = 0; switch (type) { case DamageType.Physical: deffence = status.GetSecondaryAttrubute(SecondaryAttributeName.PhysicalDeffence) .AdjustedValue; break; case DamageType.Skill: deffence = status.GetSecondaryAttrubute(SecondaryAttributeName.SkillDeffence) .AdjustedValue; break; case DamageType.Magic: deffence = status.GetSecondaryAttrubute(SecondaryAttributeName.MagicalDeffence) .AdjustedValue; break; } //def 300 => 1-300/600 => .5f, def 1000=>1- 1000/1300=> .23f damage = mount * (1 - deffence / (deffence + 300)); damage *= status.GetStaticAttribute(StaticAttributeName.DamageTakeFix).AdjustedValue; } CurrentTakeDamage += damage; source.CurrentMakeDamage += damage; ConsumedAttribute health = status.GetConsumedAttrubute(ConsumedAttributeName.Health); health.CurValue -= damage >= 1 ? damage : 1; if (isCritical) { ht.SetText((int)damage * -1, true); } else { if (damageColloctEnable) { DamageCounterInDelta += damage; } else { damageColloctEnable = true; ht.SetText((int)damage * -1); } } if (health.CurValue <= 0) { Dead(); } else { if (triggerEvent && OnDamaged != null) { OnDamaged(mount, type, damage, this, source); } } }