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