示例#1
0
    void OnFire()
    {
        List <UnitScript> targetUnits = new List <UnitScript>();

        for (int i = 0; i < skill.unitGroupScript.unitsInGroupRange.Count; i++)
        {
            if (i == numTargets)
            {
                break;
            }
            UnitScript unit = skill.unitGroupScript.unitsInGroupRangeScripts[i];
            if (unit != null)
            {
                if (unit.flagScript.Faction == targetFaction &&
                    !unit.flagScript.currentSkillFlags.ContainsKey(SkillResult.flag_recentlyHealed) &&
                    unit.healthScript.CurrentHealth < unit.healthScript.BaseHealth)
                {
                    targetUnits.Add(unit);
                }
            }
        }

        if (targetUnits.Count < numTargets)
        {
            for (int i = 0; i < skill.unitGroupScript.unitsInGroupScripts.Count; i++)
            {
                if (i == numTargets)
                {
                    break;
                }
                UnitScript unit = skill.unitGroupScript.unitsInGroupScripts[i];
                if (unit != null)
                {
                    if (unit.flagScript.Faction == targetFaction &&
                        !unit.flagScript.currentSkillFlags.ContainsKey(SkillResult.flag_recentlyHealed) &&
                        unit.healthScript.CurrentHealth < unit.healthScript.BaseHealth)
                    {
                        targetUnits.Add(unit);
                    }
                }
            }
        }

        sortByLowestHealth(ref targetUnits);
        SkillResult skillResult = new SkillResult();

        skillResult.skillType      = SkillResult.SkillType.Heal;
        skillResult.skillPower     = healpower;
        skillResult.skillFlag      = SkillResult.flag_recentlyHealed;
        skillResult.skillFlagTimer = Time.time + flagCooldown;

        if (targetUnits.Count > 0 && numTargets > 0)
        {
            for (int i = 0; i < numTargets; i++)
            {
                SkillCalculator.passSkillResult(this.gameObject, targetUnits[i].gameObject, skillResult);
                Instantiate(healEffect, targetUnits[i].transform.position, Quaternion.identity);
            }
        }
    }
示例#2
0
    private void CastSkil()
    {
        SkillResult result = this.skill.canCast(BattleManager.Instance.CurrentTarget);

        switch (result)
        {
        case SkillResult.InvalidTarget:
            MessageBox.Show("技能:[" + this.skill.Define.Name + "]目标无效");
            break;

        case SkillResult.OutOfMp:
            MessageBox.Show("技能:[" + this.skill.Define.Name + " ]MP 不足");
            break;

        case SkillResult.CoolDown:
            MessageBox.Show("技能:[" + this.skill.Define.Name + " ]长、正在冷却");
            break;

        case SkillResult.OutOfRange:
            MessageBox.Show("技能:[" + this.skill.Define.Name + " ]施法范围");
            break;
        }

        BattleManager.Instance.CastSkill(this.skill);
    }
示例#3
0
    public void passSkillResultToGroup(SkillResult skillResult, GameObject attacker)
    {
        if (skillResult.skillType == SkillResult.SkillType.Buff)
        {
            if (!currentSkillFlags.ContainsKey(skillResult.skillFlag))
            {
                currentSkillFlags.Add(skillResult.skillFlag, skillResult.skillFlagTimer);
            }
            for (int i = 0; i < unitsInGroup.Count; i++)
            {
                SkillCalculator.passSkillResult(attacker, unitsInGroup[i], skillResult);
            }
            return;
        }
        else if (skillResult.skillType == SkillResult.SkillType.RemoveBuff)
        {
            if (currentSkillFlags.ContainsKey(skillResult.skillFlag))
            {
                currentSkillFlags.Remove(skillResult.skillFlag);
            }
            for (int i = 0; i < unitsInGroup.Count; i++)
            {
                SkillCalculator.passSkillResult(attacker, unitsInGroup[i], skillResult);
            }
            return;
        }

        for (int i = 0; i < unitsInGroup.Count; i++)
        {
            SkillCalculator.passSkillResult(attacker, unitsInGroup[i], skillResult);
        }

        return;
    }
 public static void passSkillResult(GameObject attacker, GameObject target, SkillResult skillResult)
 {
     if (target != null)
     {
         target.SendMessage("OnSkillResult", skillResult, SendMessageOptions.DontRequireReceiver);
     }
 }
示例#5
0
    public void OnFire()
    {
        Collider[] hitColliders = Physics.OverlapSphere(transform.parent.position, attackRadius);

        int i = 0;

        while (i < hitColliders.Length)
        {
            Debug.Log("HIT");
            if (hitColliders[i].gameObject.tag.Contains(vars.attackable_tag) &&
                hitColliders[i].gameObject.GetComponent <FlagScript>().Faction == targetFaction &&
                !hitColliders[i].gameObject.GetComponent <FlagScript>().currentSkillFlags.ContainsKey(SkillResult.flag_movementspeedDecreased) &&
                hitColliders[i].gameObject.GetComponent <HealthScript>().hasHealth)
            {
                SkillResult skillResult = new SkillResult();
                sporeEffect.emitOnce();
                skillResult.skillType      = SkillResult.SkillType.Debuff;
                skillResult.skillAttribute = SkillResult.SkillAttribute.MovementSpeed;
                skillResult.skillFlag      = SkillResult.flag_movementspeedDecreased;
                skillResult.skillFlagTimer = 1.0f;
                skillResult.skillPower     = attackPower;

                SkillCalculator.passSkillResult(transform.gameObject, hitColliders[i].gameObject, skillResult);
            }
            i++;
        }
    }
示例#6
0
        public IEnumerable <Tera.Game.Skill> SkillsIdBySource(UserEntity source, Entity target, bool timed)
        {
            IEnumerable <Tera.Game.Skill> result;


            if (!SourceTargetSkill.ContainsKey(source))
            {
                return(new List <Tera.Game.Skill>());
            }
            if (timed || target == null)
            {
                result = from skills in SourceTargetSkill[source].Values
                         from skill in skills
                         select SkillResult.GetSkill(source, skill.Pet, skill.SkillId, skill.HotDot, PacketProcessor.Instance.EntityTracker,
                                                     BasicTeraData.Instance.SkillDatabase, BasicTeraData.Instance.HotDotDatabase, BasicTeraData.Instance.PetSkillDatabase);

                return(result.Distinct());
            }

            if (!SourceTargetSkill[source].ContainsKey(target))
            {
                return(new List <Tera.Game.Skill>());
            }
            result = from skills in SourceTargetSkill[source][target]
                     select SkillResult.GetSkill(source, skills.Pet, skills.SkillId, skills.HotDot, PacketProcessor.Instance.EntityTracker,
                                                 BasicTeraData.Instance.SkillDatabase, BasicTeraData.Instance.HotDotDatabase, BasicTeraData.Instance.PetSkillDatabase);

            return(result.Distinct());
        }
示例#7
0
    public void OnFire()
    {
        Collider[] hitColliders = Physics.OverlapSphere(transform.parent.position, radius);

        int i = 0;

        while (i < hitColliders.Length)
        {
            if (hitColliders[i].gameObject.tag.Contains(vars.attackable_tag) &&
                hitColliders[i].gameObject.GetComponent <FlagScript>().Faction == targetFaction &&
                !hitColliders[i].gameObject.GetComponent <FlagScript>().currentSkillFlags.ContainsKey(SkillResult.flag_movementspeedIncreased) &&
                hitColliders[i].gameObject.GetComponent <HealthScript>().hasHealth)
            {
                if (hitColliders[i].gameObject.tag.Contains(vars.collector_ant_tag) ||
                    hitColliders[i].gameObject.tag.Contains(vars.scout_ant_tag))
                {
                    SkillResult skillResult = new SkillResult();

                    skillResult.skillType      = SkillResult.SkillType.Buff;
                    skillResult.skillAttribute = SkillResult.SkillAttribute.MovementSpeed;
                    skillResult.skillFlag      = SkillResult.flag_movementspeedIncreased;
                    skillResult.skillFlagTimer = duration;
                    skillResult.skillPower     = boost;

                    SkillCalculator.passSkillResult(transform.gameObject, hitColliders[i].gameObject, skillResult);
                }
            }
            i++;
        }
    }
    public void OnFire()
    {
        Collider[] hitColliders = Physics.OverlapSphere(transform.parent.position, radius);

        int i = 0;
        while (i < hitColliders.Length) {
            if(hitColliders[i].gameObject.tag.Contains(vars.attackable_tag) &&
               hitColliders[i].gameObject.GetComponent<FlagScript>().Faction == targetFaction &&
               !hitColliders[i].gameObject.GetComponent<FlagScript>().currentSkillFlags.ContainsKey(SkillResult.flag_movementspeedIncreased) &&
               hitColliders[i].gameObject.GetComponent<HealthScript>().hasHealth) {
                if(hitColliders[i].gameObject.tag.Contains(vars.collector_ant_tag) ||
                   hitColliders[i].gameObject.tag.Contains(vars.scout_ant_tag)) {
                    SkillResult skillResult = new SkillResult();

                    skillResult.skillType = SkillResult.SkillType.Buff;
                    skillResult.skillAttribute = SkillResult.SkillAttribute.MovementSpeed;
                    skillResult.skillFlag = SkillResult.flag_movementspeedIncreased;
                    skillResult.skillFlagTimer = duration;
                    skillResult.skillPower = boost;

                    SkillCalculator.passSkillResult(transform.gameObject, hitColliders[i].gameObject, skillResult);
                }
            }
            i++;
        }
    }
示例#9
0
文件: Skill.cs 项目: Lenzan/newmmo
        internal SkillResult Cast(BattleContext context)
        {
            SkillResult result = this.CanCast(context);

            if (result == SkillResult.Ok)
            {
                this.castingTime = 0;
                this.skillTime   = 0;
                this.cd          = this.Define.CD;
                this.Context     = context;
                this.Hit         = 0;
                this.Bullets.Clear();

                this.AddBuff(TriggerType.SkillCast, this.Context.Target);
                if (this.Instant)
                {
                    this.DoHit();
                }
                else
                {
                    if (this.Define.CastTime > 0)
                    {
                        this.Status = SkillStatus.Casting;
                    }
                    else
                    {
                        this.Status = SkillStatus.Running;
                    }
                }
            }
            Log.InfoFormat("Skill[{0}].Cast  Result:[{1}]  Status:{2}", this.Define.Name, result, this.Status);
            return(result);
        }
示例#10
0
    public void OnFire()
    {
        Collider[] hitColliders = Physics.OverlapSphere(transform.parent.position, attackRadius);

        int i = 0;

        while (i < hitColliders.Length)
        {
            if (hitColliders[i].gameObject.tag.Contains(vars.attackable_tag) &&
                hitColliders[i].gameObject.GetComponent <FlagScript>().Faction == targetFaction &&
                hitColliders[i].gameObject.GetComponent <HealthScript>().hasHealth)
            {
                laser.target = hitColliders[i].gameObject;
                laser.emitOnce();
                Debug.Log("FOUND TARGET");
                SkillResult skillResult = new SkillResult();

                skillResult.skillType  = SkillResult.SkillType.Damage;
                skillResult.skillPower = attackPower;
                SkillCalculator.passSkillResult(transform.gameObject, hitColliders[i].gameObject, skillResult);

                break;
            }
            i++;
        }
    }
示例#11
0
    public void attackCurrentTarget()
    {
        if (unitScript.unitTargetScript.attackTarget == null)
        {
            return;
        }
        SkillResult skillResult  = new SkillResult();
        GameObject  weaponTarget = unitScript.unitTargetScript.attackTarget.gameObject;

        if (weaponTarget == previousTarget)
        {
            numHitsOnCurrentTarget++;
        }
        else
        {
            numHitsOnCurrentTarget = 0;
            previousTarget         = weaponTarget;
        }


        skillResult.skillType  = SkillResult.SkillType.Damage;
        skillResult.skillPower = unitScript.attributeScript.CurrentAttackDamage;
        if (unitScript.unitTargetScript.attackTarget != null)
        {
            SkillCalculator.passSkillResult(transform.gameObject, unitScript.unitTargetScript.attackTarget.gameObject, skillResult);
        }
    }
示例#12
0
        public IEnumerable <Tera.Game.Skill> SkillsIdBySource(UserEntity source, Entity target, bool timed)
        {
            IEnumerable <Tera.Game.Skill> result;


            if (timed || target == null)
            {
                result = from skills in SourceTargetSkill[source.Id].Values
                         from skill in skills
                         select
                         SkillResult.GetSkill(source.Id, skill.Pet, skill.SkillId, skill.HotDot,
                                              NetworkController.Instance.EntityTracker, BasicTeraData.Instance.SkillDatabase,
                                              BasicTeraData.Instance.HotDotDatabase, BasicTeraData.Instance.PetSkillDatabase);

                return(result.Distinct());
            }


            result = from skills in SourceTargetSkill[source.Id][target.Id]
                     select
                     SkillResult.GetSkill(source.Id, skills.Pet, skills.SkillId, skills.HotDot,
                                          NetworkController.Instance.EntityTracker, BasicTeraData.Instance.SkillDatabase,
                                          BasicTeraData.Instance.HotDotDatabase, BasicTeraData.Instance.PetSkillDatabase);

            return(result.Distinct());
        }
 internal S_EACH_SKILL_RESULT(Tera.Game.Messages.EachSkillResultServerMessage message)
 {
     NetworkController.Instance.EntityTracker.Update(message);
     var skillResult = new SkillResult(message, NetworkController.Instance.EntityTracker, NetworkController.Instance.PlayerTracker,
                BasicTeraData.Instance.SkillDatabase, BasicTeraData.Instance.PetSkillDatabase, NetworkController.Instance.AbnormalityTracker);
     DamageTracker.Instance.Update(skillResult);
     NotifyProcessor.Instance.UpdateMeterBoss(message);
 }
        internal S_EACH_SKILL_RESULT(Tera.Game.Messages.EachSkillResultServerMessage message)
        {
            NetworkController.Instance.EntityTracker.Update(message);
            var skillResult = new SkillResult(message, NetworkController.Instance.EntityTracker, NetworkController.Instance.PlayerTracker,
                                              BasicTeraData.Instance.SkillDatabase, BasicTeraData.Instance.PetSkillDatabase, NetworkController.Instance.AbnormalityTracker);

            DamageTracker.Instance.Update(skillResult);
            NotifyProcessor.Instance.UpdateMeterBoss(message);
        }
示例#15
0
        public SkillResult ApplySkill(Skill skill, Character target)
        {
            if (Stats.ActionPoints < skill.ActionPoints)
            {
                return(new SkillResult
                {
                    IsSuccess = false,
                    Comment = "Not enough action points."
                });
            }

            if (Stats.Mana < skill.ManaConsumption)
            {
                return(new SkillResult
                {
                    IsSuccess = false,
                    Comment = "Not enough mana."
                });
            }

            var result = new SkillResult
            {
                IsSuccess = true,
            };

            switch (skill.SkillType)
            {
            case SkillType.Melee:
                result.Damage        = skill.BasePower * (Stats.Strength / 2);
                target.Stats.Health -= skill.BasePower * (Stats.Strength / 2);
                break;

            case SkillType.Heal:
                result.Damage        = -(skill.BasePower * (Stats.Intelligence / 2));
                target.Stats.Health += -(skill.BasePower * (Stats.Intelligence / 2));
                break;

            case SkillType.Projectile:
                result.Damage        = skill.BasePower * (Stats.Intelligence);
                target.Stats.Health -= skill.BasePower * (Stats.Intelligence);
                break;

            case SkillType.AreaOfEffect:
                result.Damage        = skill.BasePower * (Stats.Intelligence / 3);
                target.Stats.Health -= skill.BasePower * (Stats.Intelligence / 3);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            Stats.Mana         -= skill.ManaConsumption;
            Stats.ActionPoints -= skill.ActionPoints;

            return(result);
        }
示例#16
0
        internal S_EACH_SKILL_RESULT(EachSkillResultServerMessage message)
        {
            PacketProcessor.Instance.EntityTracker.Update(message);
            var skillResult = new SkillResult(message, PacketProcessor.Instance.EntityTracker, PacketProcessor.Instance.PlayerTracker,
                                              BasicTeraData.Instance.SkillDatabase, BasicTeraData.Instance.PetSkillDatabase, PacketProcessor.Instance.AbnormalityTracker);

            DamageTracker.Instance.Update(skillResult);
            RichPresence.Instance.EachSkillResult(skillResult);
            NotifyProcessor.Instance.UpdateMeterBoss(message);
        }
示例#17
0
    //public bool visited;
    //public float distance;
    //public int ancestor;
    //public bool tagged;


    public void OnSkillResult(SkillResult skillResult)
    {
        if (skillResult.skillType == SkillResult.SkillType.Buff)
        {
            if (skillResult.skillAttribute == SkillResult.SkillAttribute.WPVision)
            {
                GetComponent <FogOfWarCircleRevealer>().increaseRange(skillResult.skillPower);
            }
        }
    }
    public override SkillResult GenerateResultToTarget(CharacterData inSource, CharacterData inTarget)
    {
        SkillResult result = PoolManager.poolSkillResults.GetNext();

        result.Init(this, inSource, inTarget);

        result.statChanges.Set(Stat.hp, -CalcHpChange(inSource, inTarget));

        return(result);
    }
示例#19
0
    private static string GenDamage(SkillResult skillResult)
    {
        if (skillResult.IsMiss)
        {
            return("Miss");
        }
        string critical = skillResult.IsCritical ? "Critical! " : "";

        return($"{critical}cause <color=\"red\">{skillResult.Damage}</color> damage.");
    }
    void OnUnFire()
    {
        SkillResult skillResult = new SkillResult();

        skillResult.skillAttribute = skillAttribute;
        skillResult.skillType      = SkillResult.SkillType.Buff;
        skillResult.skillPower     = -skillPower;
        skillResult.skillFlag      = skillResult.skillType.ToString() + "" + skillAttribute.ToString();

        SkillCalculator.passSkillResult(this.gameObject, skill.skillTarget, skillResult);
    }
    void OnUnFire()
    {
        SkillResult skillResult = new SkillResult();

        skillResult.skillAttribute = skillAttribute;
        skillResult.skillType = SkillResult.SkillType.Buff;
        skillResult.skillPower = -skillPower;
        skillResult.skillFlag = skillResult.skillType.ToString()+""+skillAttribute.ToString();

        SkillCalculator.passSkillResult(this.gameObject, skill.skillTarget, skillResult);
    }
示例#22
0
        private PlayerInfo GetOrCreate(SkillResult skillResult)
        {
            NpcEntity npctarget = skillResult.Target as NpcEntity;

            //ignore pvp if onlybosses is ticked
            if (OnlyBosses && npctarget == null && IsValidAttack(skillResult))
            {
                return(null);
            }

            if (npctarget != null)
            {
                if (OnlyBosses)//not count bosses
                {
                    if (!npctarget.Info.Boss)
                    {
                        return(null);
                    }
                }
                if (IgnoreOneshots)
                {
                    if ((npctarget.Info.HP > 0)
                        //ignore damage that is more than 10x times than mob's hp
                        && (npctarget.Info.HP <= skillResult.Damage / 10
                            //ignore damage over 100m on a boss
                            || (npctarget.Info.Boss && skillResult.Damage > 99999999)))
                    {
                        return(null);
                    }
                }
            }
            var        player      = skillResult.SourcePlayer;
            PlayerInfo playerStats = StatsByUser.FirstOrDefault(pi => pi.Player.Equals(player));

            if (playerStats == null && (IsFromHealer(skillResult) ||                                 //either healer
                                        (!IsFromHealer(skillResult) && IsValidAttack(skillResult)))) //or damage from non-healer
            {
                playerStats = new PlayerInfo(player, this);
                StatsByUser.Add(playerStats);
            }

            //update primary target if it's a mob
            if (npctarget != null)
            {
                if (!_targetHitCount.ContainsKey(npctarget))
                {
                    _targetHitCount.Add(npctarget, 0);
                }
                _targetHitCount[npctarget]++;

                PrimaryTarget = _targetHitCount.Aggregate((l, r) => l.Value > r.Value ? l : r).Key;
            }
            return(playerStats);
        }
示例#23
0
    void OnSkillResult(SkillResult skillresult)
    {
        if (skillresult.skillType == SkillResult.SkillType.Damage)
        {
            float removedFromShield = 0;

            if (CurrentShield > 0)
            {
                removedFromShield = Mathf.Abs(CurrentShield - skillresult.skillPower);
                if (shieldObject != null)
                {
                    shieldObject.SetActive(true);
                    currentShieldCooldown = 3.0f;
                }
            }

            CurrentHealth = Mathf.Clamp(CurrentHealth - (skillresult.skillPower - removedFromShield), -1.0f, BaseHealth);
            if (unitScript != null)
            {
                unitScript.setIsInFight(true);
            }
        }

        else if (skillresult.skillType == SkillResult.SkillType.Heal)
        {
            CurrentHealth = Mathf.Clamp(CurrentHealth + skillresult.skillPower, -1.0f, BaseHealth);
        }

        else if (skillresult.skillType == SkillResult.SkillType.Buff)
        {
            if (skillresult.skillAttribute == SkillResult.SkillAttribute.Shield)
            {
                BaseShield   += skillresult.skillPower;
                CurrentShield = BaseShield;
            }

            if (skillresult.skillAttribute == SkillResult.SkillAttribute.Health)
            {
                BaseHealth   += skillresult.skillPower;
                CurrentHealth = BaseHealth;
            }
        }

        if (skillresult.skillFlag != "")
        {
            if (!unitScript.flagScript.currentSkillFlags.ContainsKey(skillresult.skillFlag))
            {
                unitScript.flagScript.currentSkillFlags.Add(skillresult.skillFlag, skillresult.skillFlagTimer);
            }
        }

        checkDeath();
    }
    public override SkillResult GenerateResultToTarget(CharacterData inSource, CharacterData inTarget)
    {
        SkillResult result = PoolManager.poolSkillResults.GetNext();

        result.Init(this, inSource, inTarget);

        //strike deals attack damage directly
        result.statChanges.Set(Stat.hp, -CalcHpChange(inSource, inTarget));
        result.ApplyStatusEffectsBasedOnStats(inSource.stats);

        return(result);
    }
示例#25
0
    public SkillResult Copy()
    {
        SkillResult copy = new SkillResult();

        copy.Skill          = Skill;
        copy.ArtInfo        = ArtInfo;
        copy.Current        = Current;
        copy.HasHit         = HasHit;
        copy.HasZeroHealth  = HasZeroHealth;
        copy.AppliedEffects = new List <Effect>(AppliedEffects);
        copy.SkillEntries   = new List <SkillResultEntry>(SkillEntries);
        return(copy);
    }
示例#26
0
 public void OnSkillHit(SkillResult skillResult)
 {
     if (skillResult.IsMiss)
     {
         Debug.Log("Miss");
         return;
     }
     if (skillResult.IsCritical)
     {
         Debug.Log("Critical");
     }
     AddHp(-skillResult.Damage);
 }
    void OnSkillResult(SkillResult skillResult)
    {
        if (skillResult.skillType == SkillResult.SkillType.Buff)
        {
            switch (skillResult.skillAttribute)
            {
            case SkillResult.SkillAttribute.AttackRange: {
                CurrentAttackRange += skillResult.skillPower;
                break;
            }

            case SkillResult.SkillAttribute.AttackDamage: {
                CurrentAttackDamage += skillResult.skillPower;
                break;
            }

            case SkillResult.SkillAttribute.AttackSpeed: {
                CurrentAttackSpeed += skillResult.skillPower;
                break;
            }

            case SkillResult.SkillAttribute.HealthRegeneration: {
                CurrentHealthRegeneration += skillResult.skillPower;
                break;
            }

            case SkillResult.SkillAttribute.ShieldRegenration: {
                CurrentShieldRegeneration += skillResult.skillPower;
                break;
            }

            case SkillResult.SkillAttribute.VisionRange: {
                CurrentVisionRange += skillResult.skillPower;
                break;
            }

            case SkillResult.SkillAttribute.MovementSpeed: {
                CurrentMovementSpeed         += skillResult.skillPower;
                unitScript.navMeshAgent.speed = CurrentMovementSpeed;
                if (skillResult.skillFlag != "")
                {
                    if (!unitScript.flagScript.currentSkillFlags.ContainsKey(skillResult.skillFlag))
                    {
                        unitScript.flagScript.currentSkillFlags.Add(skillResult.skillFlag, skillResult.skillFlagTimer);
                    }
                }
                break;
            }
            }
        }
    }
示例#28
0
        private static string AggregatedSkillName(this SkillResult skillResult, AggregationType type)
        {
            switch (type)
            {
            case AggregationType.Id:
                return(skillResult.SkillNameDetailed);

            case AggregationType.Name:
                return(skillResult.SkillShortName);

            default:
                return(string.Empty);
            }
        }
示例#29
0
 //public GameObject res_c_model_complete;
 //public GameObject res_c_model_bitten;
 public void OnSkillResult(SkillResult skillResult)
 {
     if(skillResult.skillType == SkillResult.SkillType.Buff) {
         if(skillResult.skillAttribute == SkillResult.SkillAttribute.RessourceAbbauzeit) {
             res.harvesting_time -= skillResult.skillPower;
         }
         if(skillResult.skillAttribute == SkillResult.SkillAttribute.RessourceMenge) {
             res.max_harvest += skillResult.skillPower;
             res.current_harvest_amount += skillResult.skillPower;
         }
         if(skillResult.skillAttribute == SkillResult.SkillAttribute.RessourceMenge) {
             res.ant_bite_decrease += skillResult.skillPower;
         }
     }
 }
示例#30
0
        public IEnumerable <KeyValuePair <Entity, Tera.Game.Skill> > SkillsIdByTarget(Entity target)
        {
            if (!TargetSourceSkill.ContainsKey(target))
            {
                return(new List <KeyValuePair <Entity, Tera.Game.Skill> >());
            }

            var result = from skills in TargetSourceSkill[target].Values
                         from skill in skills
                         select new KeyValuePair <Entity, Tera.Game.Skill>(skill.Source,
                                                                           SkillResult.GetSkill(skill.Source, skill.Pet, skill.SkillId, skill.HotDot, PacketProcessor.Instance.EntityTracker,
                                                                                                BasicTeraData.Instance.SkillDatabase, BasicTeraData.Instance.HotDotDatabase, BasicTeraData.Instance.PetSkillDatabase));

            return(result.Where(x => x.Value != null).Distinct());
        }
示例#31
0
    public static void ProcessSkill(ReqCastSkill msg)
    {
        Entity caster = EntityManager.Instance.Find(msg.caster);

        if (caster == null)
        {
            Log.Error("找不到技能释放者!  id = " + msg.caster);
            return;
        }
        CSVSkill skillInfo = CSVManager.GetSkillCfg(msg.skillID);

        if (skillInfo == null)
        {
            Log.Error("找不到技能配置 skillid = " + msg.skillID);
            return;
        }

        List <Entity> targets = GetTargets(msg, skillInfo);

        if (targets == null)
        {
            return;
        }

        List <SkillResult> result = null;

        for (int i = 0; i < targets.Count; i++)
        {
            SkillResult sr = new SkillResult();
            sr.target = msg.target;
            if (skillInfo.type == 1) //普攻
            {
                sr.damage = caster.Property.PhysicDamage - targets[i].Property.PhysicDefence;
            }
            else if (skillInfo.type == 2)        //物理技能攻击
            {
            }
            else if (skillInfo.type == 3)    //法术技能攻击
            {
            }
            result.Add(sr);
        }
        OnCastSkill rsp = new OnCastSkill();

        rsp.result = result;
        caster.OnEvent(eEntityEvent.OnSkillResult, rsp);
    }
    public void attackCurrentTarget()
    {
        SkillResult skillResult = new SkillResult();
        GameObject weaponTarget = unitScript.unitTargetScript.attackTarget.gameObject;

        if(weaponTarget == previousTarget) {
            numHitsOnCurrentTarget++;
        } else {
            numHitsOnCurrentTarget = 0;
            previousTarget = weaponTarget;
        }

        skillResult.skillType = SkillResult.SkillType.Damage;
        skillResult.skillPower = unitScript.attributeScript.CurrentAttackDamage;
        if(unitScript.unitTargetScript.attackTarget != null) {
            SkillCalculator.passSkillResult(transform.gameObject, unitScript.unitTargetScript.attackTarget.gameObject, skillResult);
        }
    }
示例#33
0
    virtual public void OnTakeSkillResult(SkillResult result)
    {
        if (result.skillType == SkillResult.SkillType.Heal)
        {
            unitCurrentHealth = Mathf.Clamp(unitCurrentHealth + result.skillPower, 0, unitBaseHealth);
        }
        if (result.skillType == SkillResult.SkillType.Damage)
        {
            unitCurrentHealth = Mathf.Clamp(unitCurrentHealth - result.skillPower, 0, unitBaseHealth);
        }

        if (!currentSkillFlags.ContainsKey(result.skillFlag))
        {
            currentSkillFlags.Add(result.skillFlag, result.skillFlagTimer);
        }

        checkForDeath();
    }
示例#34
0
        public void update(float elapsed)
        {
            while (this.combatRequests.Count > 0)
            {
                CombatRequest request = getFirst();
                if (request.Skill != null)
                {
                    SkillResult skillResult = request.Skill.perform(request.Source.Range);
                    if (skillResult != null)
                    {
                        foreach (var target in request.Targets)
                        {
                            if (target != null)
                            {
                                if (request.Source != null)
                                {
                                    // can we see the target?


                                    target.damage(skillResult.Damage);
                                    // did we kill the target?
                                    if (target.AmIDead)
                                    {
                                        removeRequests(target);
                                        // if we had a death effect it needs to go to the front of the list of actions and apply against all targets in the area
                                        Skill deathEffect = target.die();
                                        if (deathEffect != null)
                                        {
                                            List <Character> charactersInRange = target.CharactersInRange.Invoke(target);
                                            this.combatRequests.Insert(0, new CombatRequest()
                                            {
                                                Skill   = deathEffect,
                                                Source  = target,
                                                Targets = charactersInRange
                                            });
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
示例#35
0
    //public GameObject res_c_model_complete;
    //public GameObject res_c_model_bitten;


    public void OnSkillResult(SkillResult skillResult)
    {
        if (skillResult.skillType == SkillResult.SkillType.Buff)
        {
            if (skillResult.skillAttribute == SkillResult.SkillAttribute.RessourceAbbauzeit)
            {
                res.harvesting_time -= skillResult.skillPower;
            }
            if (skillResult.skillAttribute == SkillResult.SkillAttribute.RessourceMenge)
            {
                res.max_harvest            += skillResult.skillPower;
                res.current_harvest_amount += skillResult.skillPower;
            }
            if (skillResult.skillAttribute == SkillResult.SkillAttribute.RessourceMenge)
            {
                res.ant_bite_decrease += skillResult.skillPower;
            }
        }
    }
    void OnSkillResult(SkillResult skillresult)
    {
        if(skillresult.skillType == SkillResult.SkillType.Damage) {
            float removedFromShield = 0;

            if(CurrentShield > 0) {
                removedFromShield = Mathf.Abs(CurrentShield - skillresult.skillPower);
                if(shieldObject != null) {
                    shieldObject.SetActive(true);
                    currentShieldCooldown = 3.0f;
                }
            }

            CurrentHealth = Mathf.Clamp(CurrentHealth - (skillresult.skillPower - removedFromShield), -1.0f, BaseHealth);
            if(unitScript != null) {
                unitScript.setIsInFight(true);
            }
        }

        else if(skillresult.skillType == SkillResult.SkillType.Heal) {
            CurrentHealth = Mathf.Clamp(CurrentHealth + skillresult.skillPower, -1.0f, BaseHealth);
        }

        else if(skillresult.skillType == SkillResult.SkillType.Buff) {
            if(skillresult.skillAttribute == SkillResult.SkillAttribute.Shield) {
                BaseShield += skillresult.skillPower;
                CurrentShield = BaseShield;
            }

            if(skillresult.skillAttribute == SkillResult.SkillAttribute.Health) {
                BaseHealth += skillresult.skillPower;
                CurrentHealth = BaseHealth;
            }
        }

        if(skillresult.skillFlag != "") {
            if(!unitScript.flagScript.currentSkillFlags.ContainsKey(skillresult.skillFlag)) {
                unitScript.flagScript.currentSkillFlags.Add(skillresult.skillFlag, skillresult.skillFlagTimer);
            }
        }

        checkDeath();
    }
 void OnSkillResult(SkillResult skillResult)
 {
     if(skillResult.skillType == SkillResult.SkillType.Buff) {
         switch(skillResult.skillAttribute) {
         case SkillResult.SkillAttribute.AttackRange: {
             CurrentAttackRange += skillResult.skillPower;
             break;
         }
         case SkillResult.SkillAttribute.AttackDamage: {
             CurrentAttackDamage += skillResult.skillPower;
             break;
         }
         case SkillResult.SkillAttribute.AttackSpeed: {
             CurrentAttackSpeed += skillResult.skillPower;
             break;
         }
         case SkillResult.SkillAttribute.HealthRegeneration: {
             CurrentHealthRegeneration += skillResult.skillPower;
             break;
         }
         case SkillResult.SkillAttribute.ShieldRegenration: {
             CurrentShieldRegeneration += skillResult.skillPower;
             break;
         }
         case SkillResult.SkillAttribute.VisionRange: {
             CurrentVisionRange += skillResult.skillPower;
             break;
         }
         case SkillResult.SkillAttribute.MovementSpeed: {
             CurrentMovementSpeed += skillResult.skillPower;
             unitScript.navMeshAgent.speed = CurrentMovementSpeed;
             if(skillResult.skillFlag != "") {
                 if(!unitScript.flagScript.currentSkillFlags.ContainsKey(skillResult.skillFlag)) {
                     unitScript.flagScript.currentSkillFlags.Add(skillResult.skillFlag, skillResult.skillFlagTimer);
                 }
             }
             break;
         }
         }
     }
 }
示例#38
0
        public void Update(SkillResult skillResult)
        {
            if (skillResult.Source == null || skillResult.Target == null) return;

            var entitySource = UserEntity.ForEntity(NetworkController.Instance.EntityTracker.GetOrPlaceholder(skillResult.Source.Id));
            var entityTarget = GetActorEntity(skillResult.Target.Id);

            if (skillResult.SourcePlayer == null && skillResult.TargetPlayer == null) return;
            if (BasicTeraData.Instance.WindowData.PartyOnly &&
                (skillResult.SourcePlayer == null ||
                 !NetworkController.Instance.PlayerTracker.MyParty(skillResult.SourcePlayer)) &&
                (skillResult.TargetPlayer == null ||
                 !NetworkController.Instance.PlayerTracker.MyParty(skillResult.TargetPlayer))) return;
            if (BasicTeraData.Instance.WindowData.OnlyBoss && !(((entityTarget as NpcEntity)?.Info.Boss ?? false) ||
                                                                (skillResult.SourcePlayer != null && skillResult.TargetPlayer != null) ||
                                                                ((entitySource["root_source"] as NpcEntity)?.Info.Boss ?? false))) return;
            if (entitySource["root_source"] is PlaceHolderEntity|| entityTarget == null)
            {
                return;
            }
            InsertSkill(entityTarget, entitySource["root_source"], entitySource["source"], skillResult);
        }
示例#39
0
    public void OnFire()
    {
        Collider[] hitColliders = Physics.OverlapSphere(transform.parent.position, attackRadius);

        int i = 0;
        while (i < hitColliders.Length) {

            if(hitColliders[i].gameObject.tag.Contains(vars.attackable_tag) &&
               hitColliders[i].gameObject.GetComponent<FlagScript>().Faction == targetFaction &&
               hitColliders[i].gameObject.GetComponent<HealthScript>().hasHealth) {
                laser.target = hitColliders[i].gameObject;
                laser.emitOnce();
                Debug.Log ("FOUND TARGET");
                SkillResult skillResult = new SkillResult();

                skillResult.skillType = SkillResult.SkillType.Damage;
                skillResult.skillPower = attackPower;
                SkillCalculator.passSkillResult(transform.gameObject, hitColliders[i].gameObject, skillResult);

                break;
            }
            i++;
        }
    }
示例#40
0
    public void OnFire()
    {
        Collider[] hitColliders = Physics.OverlapSphere(transform.parent.position, attackRadius);

        int i = 0;
        while (i < hitColliders.Length) {
            Debug.Log ("HIT");
            if(hitColliders[i].gameObject.tag.Contains(vars.attackable_tag) &&
               hitColliders[i].gameObject.GetComponent<FlagScript>().Faction == targetFaction &&
               !hitColliders[i].gameObject.GetComponent<FlagScript>().currentSkillFlags.ContainsKey(SkillResult.flag_movementspeedDecreased) &&
               hitColliders[i].gameObject.GetComponent<HealthScript>().hasHealth) {
                SkillResult skillResult = new SkillResult();
                sporeEffect.emitOnce();
                skillResult.skillType = SkillResult.SkillType.Debuff;
                skillResult.skillAttribute = SkillResult.SkillAttribute.MovementSpeed;
                skillResult.skillFlag = SkillResult.flag_movementspeedDecreased;
                skillResult.skillFlagTimer = 1.0f;
                skillResult.skillPower = attackPower;

                SkillCalculator.passSkillResult(transform.gameObject, hitColliders[i].gameObject, skillResult);
            }
            i++;
        }
    }
示例#41
0
        private SkillStats StatsChange(SkillResult message)
        {
            var result = new SkillStats();
            if (message.Amount == 0)
                return result;

            result.Damage = message.Damage;
            result.Heal = message.Heal;

            if (IsFromHealer(message) || (!IsFromHealer(message) && !message.IsHeal))
            {
                result.Hits++;
                if (message.IsCritical)
                    result.Crits++;
            }

            return result;
        }
示例#42
0
 //public bool visited;
 //public float distance;
 //public int ancestor;
 //public bool tagged;
 public void OnSkillResult(SkillResult skillResult)
 {
     if(skillResult.skillType == SkillResult.SkillType.Buff) {
         if(skillResult.skillAttribute == SkillResult.SkillAttribute.WPVision) {
             GetComponent<FogOfWarCircleRevealer>().increaseRange(skillResult.skillPower);
         }
     }
 }
示例#43
0
        private void HandleMessageReceived(Message obj)
        {
            var message = _messageFactory.Create(obj);

            if (DamageTracker.IsArchived)
            {
                var npcOccupier = message as SNpcOccupierInfo;
                if (npcOccupier != null)
                {
                    Entity ent = _entityTracker.GetOrPlaceholder(npcOccupier.NPC);
                    if (ent is NpcEntity)
                    {
                        var npce = ent as NpcEntity;
                        if (npce.Info.Boss && npcOccupier.Target != EntityId.Empty)
                        {
                            CasualMessenger.Instance.ResetPlayerStats(true); //Stop viewing saved encounter on boss aggro
                        }
                    }
                    return;
                }
            }

            _entityTracker?.Update(message);
            var skillResultMessage = message as EachSkillResultServerMessage;
            if (skillResultMessage != null)
            {
                if (skillResultMessage.IsValid(DamageTracker))
                {
                    var skillResult = new SkillResult(skillResultMessage, _entityTracker, _playerTracker, _teraData.SkillDatabase, null, _abnormalityTracker);
                    CheckUpdate(skillResult);
                }
                return;
            }
            _playerTracker?.UpdateParty(message);
            _abnormalityTracker?.Update(message);
            var despawnNpc = message as SDespawnNpc;
            if (despawnNpc != null)
            {
                Entity ent = _entityTracker.GetOrPlaceholder(despawnNpc.Npc);
                if (ent is NpcEntity)
                {
                    var npce = ent as NpcEntity;
                    if (npce.Info.Boss && despawnNpc.Dead && !DamageTracker.IsArchived)
                    {   //no need to do something if we didn't count any skill against this boss
                        if (DamageTracker.StatsByUser.SelectMany(x => x.SkillLog).Any(x => x.Target == npce))
                        {
                            DamageTracker.PrimaryTarget = npce; //Name encounter with the last dead boss
                            DamageTracker.IsPrimaryTargetDead = despawnNpc.Dead;

                            //determine type
                            ExportType exportType = ExportType.None;
                            if (SettingsHelper.Instance.Settings.ExcelExport)
                                exportType = exportType | ExportType.Excel;
                            if (SettingsHelper.Instance.Settings.SiteExport)
                                exportType = exportType | ExportType.Upload;

                            if (exportType != ExportType.None)
                                DataExporter.ToTeraDpsApi(exportType, DamageTracker, _teraData);
                            if (AutosaveEncounters)
                                ResetDamageTracker(new ResetPlayerStatsMessage { ShouldSaveCurrent = true });
                        }
                    }
                }
                return;
            }

            var sLogin = message as LoginServerMessage;
            if (sLogin != null)
            {
                if (_needInit)
                {
                    Server = BasicTeraData.Servers.GetServer(sLogin.ServerId, Server);
                    _messageFactory.Version = Server.Region;
                    Logger.Info($"Logged in to server {Server.Name}.");
                    _teraData = BasicTeraData.DataForRegion(Server.Region);
                    _entityTracker = new EntityTracker(_teraData.NpcDatabase);
                    _playerTracker = new PlayerTracker(_entityTracker, BasicTeraData.Servers);
                    _abnormalityTracker = new AbnormalityTracker(_entityTracker, _playerTracker, _teraData.HotDotDatabase, _abnormalityStorage, CheckUpdate);
                    _entityTracker.Update(message);
                    _needInit = false;
                }
                _abnormalityStorage.EndAll(message.Time.Ticks);
                _abnormalityTracker = new AbnormalityTracker(_entityTracker, _playerTracker, _teraData.HotDotDatabase, _abnormalityStorage, CheckUpdate);
                return;
            }
            var cVersion = message as C_CHECK_VERSION;
            if (cVersion != null)
            {
                var opCodeNamer =
                    new OpCodeNamer(Path.Combine(BasicTeraData.ResourceDirectory,
                        $"opcodes/{cVersion.Versions[0]}.txt"));
                _messageFactory = new MessageFactory(opCodeNamer, Server.Region);
                return;
            }
        }
示例#44
0
 private void CheckUpdate(SkillResult skillResult)
 {
     if (PartyOnly &&//check if party only
         !(_playerTracker.MyParty(skillResult.SourcePlayer) || _playerTracker.MyParty(skillResult.TargetPlayer)))
         return;
     if (IsInactiveTimerReached() && skillResult.IsValid())
     {
         CasualMessenger.Instance.ResetPlayerStats(AutosaveEncounters || DamageTracker.IsArchived);
     }
     if (!DamageTracker.IsArchived && skillResult.IsValid(DamageTracker?.FirstAttack)) //don't process while viewing a past encounter
     {
         DamageTracker.Update(skillResult);
         if (!skillResult.IsHeal && skillResult.Amount > 0)
             _inactivityTimer.Restart();
         PlayerCount = DamageTracker.StatsByUser.Count;
     }
 }
    public void passSkillResultToGroup(SkillResult skillResult, GameObject attacker)
    {
        if(skillResult.skillType == SkillResult.SkillType.Buff) {
            if(!currentSkillFlags.ContainsKey(skillResult.skillFlag)) {
                currentSkillFlags.Add(skillResult.skillFlag, skillResult.skillFlagTimer);
            }
            for(int i = 0; i < unitsInGroup.Count; i++) {
                SkillCalculator.passSkillResult(attacker, unitsInGroup[i], skillResult);
            }
            return;
        }
        else if(skillResult.skillType == SkillResult.SkillType.RemoveBuff) {
            if(currentSkillFlags.ContainsKey(skillResult.skillFlag)) {
                currentSkillFlags.Remove(skillResult.skillFlag);
            }
            for(int i = 0; i < unitsInGroup.Count; i++) {
                SkillCalculator.passSkillResult(attacker, unitsInGroup[i], skillResult);
            }
            return;
        }

        for(int i = 0; i < unitsInGroup.Count; i++) {
            SkillCalculator.passSkillResult(attacker, unitsInGroup[i], skillResult);
        }

        return;
    }
示例#46
0
 public bool IsFromHealer(SkillResult skillResult)
 {
     return skillResult.SourcePlayer.IsHealer;
 }
示例#47
0
 public bool IsValidAttack(SkillResult skillResult)
 {
     return skillResult.SourcePlayer != null && skillResult.Damage > 0 &&
            skillResult.Source.Id != skillResult.Target.Id;
 }
示例#48
0
        private void InsertSkill(Entity entityTarget, Entity entitySource, Entity petSource, SkillResult message)
        {
            if (!IsValidSkill(message))
            {
                return;
            }

            var skillType = Database.Database.Type.Mana;
            if (message.IsHp)
            {
                skillType = message.IsHeal ? Database.Database.Type.Heal : Database.Database.Type.Damage;
            }

            var entity = entityTarget as NpcEntity;
            if (entity != null)
            {

                /*
                 * Remove data from resetted boss when hitting a new boss
                 * (we don't remove the data directly when the boss reset, to let the time for a review of the encounter.)
                 */
                if (skillType == Database.Database.Type.Damage && entity.Info.Boss)
                {
                    foreach (var delete in _toDelete)
                    {
                        DeleteEntity(delete);
                    }
                    _toDelete = new List<Entity>();
                }

                UpdateCurrentBoss(entity);

            }

            Database.Database.Instance.Insert(message.Amount, skillType, entityTarget, entitySource, message.SkillId,
               message.Abnormality, message.IsCritical, message.Time.Ticks, petSource, message.HitDirection);
        }
示例#49
0
        private static bool IsValidSkill(SkillResult message)
        {
            if (message.Amount == 0)
                // to count buff skills/consumable usage - need additional hitstat for it (damage/heal/mana/uses)
            {
                return false;
            }

            return (UserEntity.ForEntity(message.Source)["root_source"] != UserEntity.ForEntity(message.Target)["root_source"]) || (message.Damage == 0);
        }
示例#50
0
 public static bool IsSameSkillAs(this SkillResult skillResult, SkillResult other, AggregationType type)
 {
     return skillResult.AggregatedSkillName(type) == other.AggregatedSkillName(type) &&
            skillResult.IsHeal == other.IsHeal;
 }
 public static void passSkillResult(GameObject attacker, GameObject target, SkillResult skillResult)
 {
     if(target != null) {
         target.SendMessage("OnSkillResult", skillResult, SendMessageOptions.DontRequireReceiver);
     }
 }
示例#52
0
    public virtual void OnTakeSkillResult(SkillResult result)
    {
        if(result.skillType == SkillResult.SkillType.Heal) {
            unitCurrentHealth = Mathf.Clamp(unitCurrentHealth + result.skillPower, 0, unitBaseHealth);
        }
        if(result.skillType == SkillResult.SkillType.Damage) {
            unitCurrentHealth = Mathf.Clamp(unitCurrentHealth - result.skillPower, 0, unitBaseHealth);
        }

        if(!currentSkillFlags.ContainsKey(result.skillFlag)) {
            currentSkillFlags.Add(result.skillFlag, result.skillFlagTimer);
        }

        checkForDeath();
    }
示例#53
0
        private PlayerInfo GetOrCreate(SkillResult skillResult)
        {
            NpcEntity npctarget = skillResult.Target as NpcEntity;

            //ignore pvp if onlybosses is ticked
            if (OnlyBosses && npctarget == null && IsValidAttack(skillResult)) return null;

            if (npctarget != null)
            {
                if (OnlyBosses)//not count bosses
                    if (!npctarget.Info.Boss)
                        return null;
                if (IgnoreOneshots)
                    if ((npctarget.Info.HP>0)
                        //ignore damage that is more than 10x times than mob's hp
                        && (    npctarget.Info.HP <= skillResult.Damage/10
                        //ignore damage over 100m on a boss
                            ||  (npctarget.Info.Boss && skillResult.Damage > 99999999)))
                        return null;
            }
            var player = skillResult.SourcePlayer;
            PlayerInfo playerStats = StatsByUser.FirstOrDefault(pi => pi.Player.Equals(player));
            if (playerStats == null && (IsFromHealer(skillResult) ||//either healer
               (!IsFromHealer(skillResult) && IsValidAttack(skillResult))))//or damage from non-healer
            {
                playerStats = new PlayerInfo(player, this);
                StatsByUser.Add(playerStats);
            }

            //update primary target if it's a mob
            if (npctarget != null)
            {
                if (!_targetHitCount.ContainsKey(npctarget))
                    _targetHitCount.Add(npctarget, 0);
                _targetHitCount[npctarget]++;

                PrimaryTarget = _targetHitCount.Aggregate((l, r) => l.Value > r.Value ? l : r).Key;
            }
            return playerStats;
        }
示例#54
0
        public void Update(SkillResult skillResult)
        {
            if (IsArchived) return;//prevent archived trackers from accidentally recording stats

            if (skillResult.SourcePlayer != null)
            {
                var playerStats = GetOrCreate(skillResult);
                if (playerStats == null) return; //if this is null, that means we should ignore it
                var statsChange = StatsChange(skillResult);
                if (statsChange == null) Logger.Warn($"Generated null SkillStats from {skillResult}");

                playerStats.LogSkillUsage(skillResult);

                TotalDealt.Add(statsChange);
                playerStats.Dealt.Add(statsChange);
            }

            if (IsValidAttack(skillResult))
            {
                if (FirstAttack == null)
                    FirstAttack = skillResult.Time;

                LastAttack = skillResult.Time;
            }

            foreach (var playerStat in StatsByUser)
            {   //force update of calculated dps metrics
                playerStat.Dealt.UpdateStats();
            }
        }
示例#55
0
 public void LogSkillUsage(SkillResult result)
 {
     SkillLog.Add(result);
 }