Esempio n. 1
0
        private void UpdateKillAddDamage(CharacterInfo sender)
        {
            KillAddDamage kill_attr = sender.TalentManager.GetTalentAttribute(AttributeId.kKillAddDamage) as KillAddDamage;

            if (kill_attr == null || !kill_attr.IsActive)
            {
                //LogSystem.Error("----KillAddDamage: killAddDamage is not active!");
                return;
            }
            CombatStatisticInfo combat_info = sender.GetCombatStatisticInfo();

            if (combat_info == null)
            {
                //LogSystem.Error("----KillAddDamage: combat info is null!");
                return;
            }
            if (kill_attr.IsTriggerHit(combat_info.LastHitCountId) && kill_attr.IsTriggered)
            {
                //LogSystem.Error("----KillAddDamage: the trigger hit!");
                return;
            }
            if (kill_attr.IsTriggered && kill_attr.IsDamageHit(combat_info.LastHitCountId))
            {
                //LogSystem.Error("----KillAddDamage: the damage hit!");
                return;
            }
            ImpactSystem.Instance.SendImpactToCharacter(sender, kill_attr.ImpactId, sender.GetId(), -1,
                                                        -1, sender.GetMovementStateInfo().GetPosition3D(),
                                                        sender.GetMovementStateInfo().GetFaceDir());
            //LogSystem.Error("----KillAddDamage: begin add impact!");
            kill_attr.KillHitCountId = combat_info.LastHitCountId;
            kill_attr.IsTriggered    = true;
        }
        public override int RefixHpDamage(CharacterInfo obj, int impactId, int hpDamage, int senderId, ref bool isCritical, int impactOwnerId)
        {
            if (obj == null)
            {
                return(hpDamage);
            }
            if (impactOwnerId != senderId)
            {
                return(hpDamage);
            }
            UserInfo sender = obj.SceneContext.GetCharacterInfoById(senderId) as UserInfo;

            if (sender == null)
            {
                return(hpDamage);
            }
            CombatStatisticInfo combat_info = sender.GetCombatStatisticInfo();

            if (combat_info == null)
            {
                return(hpDamage);
            }
            ImpactInfo impactinfo = sender.GetSkillStateInfo().GetImpactInfoById(impactId);

            if (impactinfo == null || impactinfo.ConfigData.ExtraParams.Count < 1)
            {
                return(hpDamage);
            }
            int    triggerCount = 0;
            string effect       = "";
            string mountPoint   = "";

            try
            {
                if (impactinfo.ConfigData.ExtraParams.Count > 4)
                {
                    triggerCount = int.Parse(impactinfo.ConfigData.ExtraParams[0]);
                    effect       = impactinfo.ConfigData.ExtraParams[2];
                    mountPoint   = impactinfo.ConfigData.ExtraParams[3];
                    if (combat_info.MultiHitCount != 0 && combat_info.MultiHitCount % triggerCount == 0)
                    {
                        AppendDamage(sender, obj, impactinfo, hpDamage);
                        AppendImpact(sender, obj, impactinfo);
                    }
                    if (!String.IsNullOrEmpty(effect) && !String.IsNullOrEmpty(mountPoint))
                    {
                        EventImpactLogicEffect(obj, effect, mountPoint, 2.0f);
                    }
                }
            }
            catch (Exception ex)
            {
                LogSystem.Error("parse append damage param error:\n" + ex.Message + "\n" + ex.StackTrace);
            }
            return(hpDamage);
        }
Esempio n. 3
0
        private void UpdateKillAddCritical(CharacterInfo sender)
        {
            KillAddCritical     attr        = sender.TalentManager.GetTalentAttribute(AttributeId.kKillAddCritical) as KillAddCritical;
            CombatStatisticInfo combat_info = sender.GetCombatStatisticInfo();

            if (attr != null && combat_info != null)
            {
                attr.OnKill(combat_info.LastHitCountId);
            }
        }
        public override int RefixHpDamage(CharacterInfo obj, int impactId, int hpDamage, int senderId, ref bool isCritical, int impactOwnerId)
        {
            if (obj == null)
            {
                return(hpDamage);
            }
            if (senderId != impactOwnerId)
            {
                return(hpDamage);
            }
            UserInfo sender = obj.SceneContext.GetCharacterInfoById(senderId) as UserInfo;

            if (sender == null)
            {
                return(hpDamage);
            }
            CombatStatisticInfo combat_info = sender.GetCombatStatisticInfo();

            if (combat_info == null)
            {
                return(hpDamage);
            }
            ImpactInfo impactinfo = sender.GetSkillStateInfo().GetImpactInfoById(impactId);

            if (impactinfo == null || impactinfo.ConfigData.ExtraParams.Count < 1)
            {
                return(hpDamage);
            }
            int criticalCount = 0;

            try
            {
                criticalCount = int.Parse(impactinfo.ConfigData.ExtraParams[0]);
                if (combat_info.MultiHitCount != 0 && combat_info.MultiHitCount % criticalCount == 0)
                {
                    if (!isCritical)
                    {
                        hpDamage   = (int)(hpDamage * sender.GetActualProperty().CriticalPow);
                        isCritical = true;
                    }
                }
            }
            catch (Exception ex)
            {
                LogSystem.Error("parse HitCriticalTrigger param error:\n" + ex.Message);
            }
            return(hpDamage);
        }
        public override int RefixHpDamage(CharacterInfo obj, int impactId, int hpDamage, int senderId, ref bool isCritical, int impactOnwerId)
        {
            //LogSystem.Debug("---in hit recover");
            if (obj == null)
            {
                return(hpDamage);
            }
            if (senderId != impactOnwerId)
            {
                return(hpDamage);
            }
            UserInfo sender = obj.SceneContext.GetCharacterInfoById(senderId) as UserInfo;

            if (sender == null)
            {
                return(hpDamage);
            }
            CombatStatisticInfo combat_info = sender.GetCombatStatisticInfo();

            if (combat_info == null)
            {
                return(hpDamage);
            }
            ImpactInfo impactinfo = sender.GetSkillStateInfo().GetImpactInfoById(impactId);

            if (impactinfo == null || impactinfo.ConfigData.ExtraParams.Count < 1)
            {
                return(hpDamage);
            }
            int triggerCount = 0;

            try
            {
                triggerCount = int.Parse(impactinfo.ConfigData.ExtraParams[0]);
                if (combat_info.MultiHitCount != 0 && combat_info.MultiHitCount % triggerCount == 0)
                {
                    Recover(sender, impactinfo, combat_info.MultiHitCount, combat_info.LastHitTime);
                }
            }
            catch (Exception ex)
            {
                LogSystem.Error("parse HitRcover count param error:\n" + ex.Message);
            }
            return(hpDamage);
        }
Esempio n. 6
0
        private bool AdjustCritical(CharacterInfo sender, out float critical)
        {
            critical = sender.GetActualProperty().Critical;
            KillAddCritical     attr        = sender.TalentManager.GetTalentAttribute(AttributeId.kKillAddCritical) as KillAddCritical;
            CombatStatisticInfo combat_info = sender.GetCombatStatisticInfo();

            if (attr != null && combat_info != null)
            {
                attr.OnHit(combat_info.LastHitCountId);
                if (attr.IsCriticalHit(combat_info.LastHitCountId))
                {
                    float new_critical = critical + attr.CriticalAdd;
                    new_critical = new_critical > 1 ? 1 : new_critical;
                    sender.GetActualProperty().SetCritical(Operate_Type.OT_Absolute, new_critical);
                    //LogSystem.Error("----critical: set critical = {0}", new_critical);
                }
                return(true);
            }
            return(false);
        }
Esempio n. 7
0
        public void OnGfxHitTarget(int id, int impactId, int targetId, int hitCount,
                                   int skillId, int duration, float x,
                                   float y, float z, float dir, long hit_count_id)
        {
            CharacterInfo sender               = WorldSystem.Instance.GetCharacterById(id);
            CharacterInfo target               = WorldSystem.Instance.GetCharacterById(targetId);
            UserInfo      playerSelf           = WorldSystem.Instance.GetPlayerSelf();
            bool          hitCountChanged      = false;
            bool          playerHitCountChange = false;
            long          curTime              = TimeUtility.GetLocalMilliseconds();

            UpdateHitTalent(sender, hit_count_id);
            // 攻击
            if (hitCount > 0)
            {
                CombatStatisticInfo senderCombatInfo = sender.GetCombatStatisticInfo();
                int last_count = senderCombatInfo.MultiHitCount;
                if (IsImpactHaveDamage(impactId))
                {
                    hitCountChanged = senderCombatInfo.UpdateMultiHitCount(hit_count_id, hitCount, curTime);
                }
                if (id == WorldSystem.Instance.PlayerSelfId && null != playerSelf)
                {
                    if (senderCombatInfo.MultiHitCount >= 1 && last_count != senderCombatInfo.MultiHitCount)
                    {
                        GfxSystem.PublishGfxEvent("ge_hitcount", "ui", senderCombatInfo.MultiHitCount);
                        playerHitCountChange = hitCountChanged;
                    }
                }
                CombatStatisticInfo targetCombatInfo = target.GetCombatStatisticInfo();
                targetCombatInfo.HitCount += hitCount;
                if (targetId == WorldSystem.Instance.PlayerSelfId && null != playerSelf)
                {
                    if (WorldSystem.Instance.IsELiteScene())
                    {
                        RoleInfo      roleInfo = LobbyClient.Instance.CurrentRole;
                        SceneResource curScene = WorldSystem.Instance.GetCurScene();
                        if (null != roleInfo && null != curScene && roleInfo.GetSceneInfo(WorldSystem.Instance.GetCurSceneId()) == 2)
                        { //当前在挑战3星通关
                            GfxSystem.PublishGfxEvent("ge_pve_fightinfo", "ui", 0, targetCombatInfo.HitCount, curScene.SceneConfig.m_CompletedHitCount, 0);
                        }
                        playerHitCountChange = true;
                    }
                }
            }
            if (playerHitCountChange && null != playerSelf && (WorldSystem.Instance.IsPvpScene() || WorldSystem.Instance.IsMultiPveScene()))
            {
                CombatStatisticInfo combatInfo = playerSelf.GetCombatStatisticInfo();
                ArkCrossEngineMessage.Msg_CR_HitCountChanged msg = new ArkCrossEngineMessage.Msg_CR_HitCountChanged();
                msg.max_multi_hit_count = combatInfo.MaxMultiHitCount;
                msg.hit_count           = combatInfo.HitCount;
                Network.NetworkSystem.Instance.SendMessage(msg);
            }
            if (null != sender && null != target)
            {
                int hit_count = 0;
                hit_count = sender.GetCombatStatisticInfo().MultiHitCount;
                OnGfxStartImpact(sender.GetId(), impactId, target.GetId(), skillId, duration, new Vector3(x, y, z), dir,
                                 hit_count);
            }
        }