private void SetMainCitySkillInfo() { List <DataTransfer> lst1 = new List <DataTransfer>(); List <RoleInfoSkill> lst2 = Global.Instance.CurRoleInfo.SkillList; for (int i = 0; i < lst2.Count; i++) { DataTransfer dt = new DataTransfer(); dt.SetData(ConstDefine.RoleInfoSlotsNO, lst2[i].SlotsNO); dt.SetData(ConstDefine.RoleInfoSkillID, lst2[i].SkillId); SkillEntity skill = SkillDBModel.Instance.Get(lst2[i].SkillId); if (skill != null) { dt.SetData(ConstDefine.RoleInfoSkillPic, skill.SkillPic); } SkillLevelEntity levelEntity = SkillLevelDBModel.Instance.GetEnityBySkillIdAndSkillLevel(lst2[i].SkillId, lst2[i].SKillLevel); if (levelEntity != null) { dt.SetData(ConstDefine.RoleInfoSkillCDTime, levelEntity.SkillCDTime); } lst1.Add(dt); } UIMainCitySkillView.Instance.SetUI(lst1); UIMainCitySkillView.Instance.OnClickSkillButton = ClickSkillButton; }
public IEnumerator ToHurt(RoleTransferAttackInfo attackInfo) { if (m_StateMachine == null) { yield break; } SkillEntity skillEntity = SkillDBModel.Instance.Get(attackInfo.SkillId); SkillLevelEntity skillLevelEntity = SkillLevelDBModel.Instance.GetSkillLevelBySkillIdAndLevel(attackInfo.SkillId, attackInfo.SkillLevel); if (skillEntity == null || skillLevelEntity == null) { yield break; } yield return(new WaitForSeconds(skillEntity.ShowHurtEffectDelaySecond)); //减血 //m_Role.HeadBar.BloodTextAni(attackInfo.HurtValue); m_Role.CurRoleInfo.CurrentHP -= attackInfo.HurtValue; if (m_Role.CurRoleInfo.CurrentHP < 0) { m_Role.CurRoleInfo.CurrentHP = 0; m_Role.ToDie(); if (OnHurt != null) { OnHurt(); } yield break; } if (OnHurt != null) { OnHurt(); } //播放受伤特效 int fontSize = 1; Color color = Color.red; if (attackInfo.IsCri) { fontSize = 2; color = Color.yellow; } if (!m_Role.IsRigibody) { //m_StateMachine.ChangeState(RoleStateType.Hurt); } }
/// <summary> /// 服务器端计算伤害 /// </summary> /// <param name="currRole"></param> /// <param name="enemy"></param> /// <param name="skillId"></param> /// <param name="skillLevel"></param> /// <param name="isCri"></param> /// <param name="hurtValue"></param> private void CalculateHurtValue(Role currRole, Role enemy, int skillId, int skillLevel, ref bool isCri, ref int hurtValue) { if (currRole == null || enemy == null) { return; } SkillEntity skillEntity = DataTableManager.Instance.SkillDBModel.Get(skillId); SkillLevelEntity skillLevelEntity = DataTableManager.Instance.SkillLevelDBModel.GetEntityBySkillIdAndLevel(skillId, skillLevel); if (skillEntity == null) { return; } //计算伤害 //1.攻击数值 = 攻击方的综合战斗力 * (技能的伤害倍率 * 0.01f) //float attackValue = currRole.Fighting * (skillLevelEntity.HurtValueRate * 0.01f); ////2.基础伤害 = 攻击数值 * 攻击数值 / (攻击数值 + 被攻击方的防御) //float baseHurt = attackValue * attackValue / (attackValue + enemy.Defense); ////3.暴击概率 = 0.05f + (攻击方暴击/(攻击方暴击+防御方抗性)) * 0.1f; //float cri = 0.05f + (currRole.Cri / (currRole.Cri + enemy.Res)) * 0.1f; //暴击概率 = 暴击概率>0.5f?0.5f:暴击概率 //cri = cri > 0.5f ? 0.5f : cri; ////4.是否暴击 = 0-1的随机数 < =暴击概率 //isCri = new Random().NextDouble() <= cri; ////5.暴击伤害倍率 = 有暴击?1.5f :1f; //float criHrut = isCri ? 1.5f : 1f; //6.随机数 = 0.9f-1.1f之间 int random = new Random().Next(9000, 11000); float frandom = random * 0.0001f; //7.最终伤害 = 基础伤害 * 暴击伤害倍率 * 随机数 //hurtValue = (int)Math.Round(baseHurt * criHrut * frandom); hurtValue = hurtValue < 1 ? 1 : hurtValue; }
public IEnumerator ToHurt(RoleTransferAttackInfo attackInfo) { if (m_RoleFSMMgr == null) { yield break; } SkillEntity skillEntity = SkillDBModel.Instance.Get(attackInfo.SkillId); SkillLevelEntity skillLevelEntity = SkillLevelDBModel.Instance.GetEnityBySkillIdAndSkillLevel(attackInfo.SkillId, attackInfo.SkillLevel); if (skillEntity == null || skillLevelEntity == null) { yield break; } yield return(new WaitForSeconds(skillEntity.ShowHurtEffectDelaySecond)); //¼õѪ m_RoleFSMMgr.CurRoleCtrl.CurRoleInfo.CurrentHP -= attackInfo.HurtValue; if (OnHurt != null) { OnHurt(); } if (m_RoleFSMMgr.CurRoleCtrl.CurRoleInfo.CurrentHP < 0) { m_RoleFSMMgr.CurRoleCtrl.CurRoleInfo.CurrentHP = 0; m_RoleFSMMgr.CurRoleCtrl.ToDie(); yield break; } //²¥·ÅÊÜÉËÌØЧ int fontSize = 1; Color color = Color.red; if (attackInfo.IsCri) { fontSize = 2; color = Color.yellow; } UISceneCtrl.Instance.CurrentUIScene.HUD.NewText("- " + attackInfo.HurtValue.ToString(), m_RoleFSMMgr.CurRoleCtrl.transform, color, fontSize, 15f, -1f, 2.2f, UnityEngine.Random.Range(0, 2) == 1 ? bl_Guidance.LeftDown : bl_Guidance.RightDown); if (!m_RoleFSMMgr.CurRoleCtrl.IsRigibody) { m_RoleFSMMgr.ChangeState(RoleState.Hurt); } }
/// <summary> /// 当前角色使用技能 /// </summary> /// <param name="role"></param> /// <param name="buffer"></param> private void OnWorldMapCurrRoleUseSkill(Role role, byte[] buffer) { m_BeAttackItemList.Clear(); m_DieRoleList.Clear(); WorldMap_CurrRoleUseSkillProto proto = WorldMap_CurrRoleUseSkillProto.GetProto(role.SocketReceiveMS, buffer); int attackRoleId = role.RoleId; //攻击者ID int skillId = proto.SkillId; //使用的技能编号 int skillLevel = proto.SkillLevel; //使用的技能等级 float rolePosX = proto.RolePosX; float rolePosY = proto.RolePosY; float rolePosZ = proto.RolePosZ; float roleYAngle = proto.RoleYAngle; int beAttackCount = proto.BeAttackCount; //被攻击者数量 for (int i = 0; i < beAttackCount; i++) { int beAttackRoleId = proto.ItemList[i].BeAttackRoleId; //被攻击者编号 bool isCri = false; //是否暴击 int hurtValue = 0; //伤害值 Role attackRole = RoleMgr.Instance.GetRole(attackRoleId); //攻击者 //攻击者的MP要减少 SkillLevelEntity skillLevelEntity = DataTableManager.Instance.SkillLevelDBModel.GetEntityBySkillIdAndLevel(skillId, skillLevel); attackRole.CurrMP -= skillLevelEntity.SpendMP; attackRole.CurrMP = attackRole.CurrMP < 0 ? 0 : attackRole.CurrMP; Role beAttackRole = RoleMgr.Instance.GetRole(beAttackRoleId); //被攻击者 //服务器端计算伤害 CalculateHurtValue(attackRole, beAttackRole, skillId, skillLevel, ref isCri, ref hurtValue); WorldMap_OtherRoleUseSkillProto.BeAttackItem item = new WorldMap_OtherRoleUseSkillProto.BeAttackItem(); item.BeAttackRoleId = beAttackRoleId; //被攻击者id item.IsCri = (byte)(isCri ? 1 : 0); //是否暴击 item.ReduceHp = hurtValue; //伤害 beAttackRole.CurrHP -= hurtValue; //服务器端的被攻击者 减少血量 if (beAttackRole.CurrHP <= 0) { //说明角色已经死亡 beAttackRole.CurrHP = 0; m_DieRoleList.Add(beAttackRoleId); } m_BeAttackItemList.Add(item); } //要把受伤消息 发给同场景的玩家 玩家A 要能看到 B和C在战斗 即便A只是旁观者 //================告诉同场景的玩家 给他们发消息 包括使用技能的玩家 被攻击者 和 旁观者 { List <Role> lst = GetRoleList(role.LastInWorldMapId); if (lst != null && lst.Count > 0) { for (int i = 0; i < lst.Count; i++) { SendOtherRoleUseSkill(lst[i], attackRoleId, skillId, skillLevel, rolePosX, rolePosY, rolePosZ, roleYAngle, m_BeAttackItemList); } } } //=========================== //要把死亡消息 发给同场景的玩家 玩家A 要能看到 B和C在战斗 即便A只是旁观者 { List <Role> lst = GetRoleList(role.LastInWorldMapId); if (lst != null && lst.Count > 0) { for (int i = 0; i < lst.Count; i++) { SendOtherRoleDie(lst[i], attackRoleId, m_DieRoleList); } } } }
private RoleTransferAttackInfo CalculationHurtValue(AttackType attackType, RoleCtrl enemy, SkillEntity skillEntity, SkillLevelEntity skillLevelEntity) { RoleTransferAttackInfo attackInfo = new RoleTransferAttackInfo(); attackInfo.AttackRoleID = m_Role.CurRoleInfo.RoleId; attackInfo.BeAttaclRoleID = enemy.CurRoleInfo.RoleId; attackInfo.IsCri = false; float damage = 0; if (attackType == AttackType.PhyAttack) { damage = m_Role.CurRoleInfo.PhyAtk - enemy.CurRoleInfo.PhyDef; } else { attackInfo.SkillId = skillEntity.Id; attackInfo.SkillLevel = skillLevelEntity.Level; //物理系攻击 if (skillEntity.SkillType == 0) { damage = m_Role.CurRoleInfo.PhyAtk * skillLevelEntity.HurtValueRate - enemy.CurRoleInfo.PhyDef; } else { //魔法系攻击 damage = m_Role.CurRoleInfo.MgicAtk * skillLevelEntity.HurtValueRate - enemy.CurRoleInfo.MgicDef; } damage /= 10; bool isCri = Random.Range(1, 101) < m_Role.CurRoleInfo.Cri; attackInfo.IsCri = isCri; if (isCri) { damage *= m_Role.CurRoleInfo.CriValue; } if (damage <= 0) { damage = 1; } } attackInfo.HurtValue = (int)damage; return(attackInfo); }
public bool ToAttackBySkillId(AttackType attackType, int skillId) { if (m_Role.StateMachine.CurrentRoleStateType == RoleStateType.Die) { return(false); } if (m_EnemyList == null) { m_EnemyList = new List <RoleCtrl>(); } m_Role.StateMachine.IsNormalAtk = false; m_EnemyList.Clear(); m_AttackPosList.Clear(); if (m_Role.CurRoleType == RoleType.Hero || m_Role.CurRoleType == RoleType.Monster) { SkillLevelEntity sklillLevleEntity = null; SkillEntity skillEntity = null; if (attackType == AttackType.PhyAttack) { m_Role.StateMachine.IsNormalAtk = true; } else { skillEntity = SkillDBModel.Instance.Get(skillId); m_Role.StateMachine.SkillIndex = 0; if (skillEntity == null) { return(false); } if (m_Role.LockEnemy != null && m_Role.CurRoleType == RoleType.Monster) { //这里重新做,暂时只打锁定目标 //TODO sklillLevleEntity = SkillLevelDBModel.Instance.GetSkillLevelBySkillIdAndLevel(skillEntity.Id, 1); m_EnemyList.Add(m_Role.LockEnemy); } else if (m_Role.CurRoleType == RoleType.Hero) { int skillLevel = ((HeroInfo)m_Role.CurRoleInfo).GetSkillLevel(skillEntity.Id); sklillLevleEntity = SkillLevelDBModel.Instance.GetSkillLevelBySkillIdAndLevel(skillEntity.Id, skillLevel); SearchEnemys(m_Role.AttackOrigin, skillEntity.AttackArea, skillEntity.AttackRange); } } m_Role.StateMachine.ChangeState(RoleStateType.Attack); for (int i = 0; i < m_EnemyList.Count; i++) { RoleTransferAttackInfo info = CalculationHurtValue(attackType, m_EnemyList[i], skillEntity, sklillLevleEntity); m_EnemyList[i].ToHurt(info); } //生成攻击特效 if (!string.IsNullOrEmpty(skillEntity.AttackEffect)) { GameObject go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.Effect, "RoleEffect/" + skillEntity.AttackEffect, isCache: true); go.transform.SetParent(m_Role.transform); go.transform.localPosition = Vector3.zero; AttackEffectBase effect = go.GetComponent <AttackEffectBase>(); effect.Init(m_Role, "RoleEffect/" + skillEntity.AttackEffect, m_EnemyList, m_AttackPosList); } } return(false); }
public bool ToAttackBySkillId(AttackType attackType, int skillId) { if (m_RoleFSMMgr == null || m_RoleCtrl.IsRigibody) { if (attackType == AttackType.SkillAttack) { m_FollowSkillId = skillId; } return(false); } m_FollowSkillId = -1; #region //只有主角和怪参与数值计算 if (m_RoleCtrl.CurRoleType == RoleType.MainPlayer || m_RoleCtrl.CurRoleType == RoleType.Monster) { SkillEntity skillEntity = SkillDBModel.Instance.Get(skillId); if (skillEntity == null) { return(false); } int skillLevel = 1; if (m_RoleCtrl.CurRoleType == RoleType.MainPlayer) { skillLevel = ((RoleInfoMainPlayer)m_RoleCtrl.CurRoleInfo).GetSkillLevel(skillId); } SkillLevelEntity skillLevelEnity = SkillLevelDBModel.Instance.GetEnityBySkillIdAndSkillLevel(skillId, skillLevel); //主角 if (m_RoleCtrl.CurRoleType == RoleType.MainPlayer) { if (skillLevelEnity.SpendMP > m_RoleCtrl.CurRoleInfo.CurrentMP) { return(false); } m_RoleCtrl.CurRoleInfo.CurrentMP -= skillLevelEnity.SpendMP; if (m_RoleCtrl.CurRoleInfo.CurrentMP < 0) { m_RoleCtrl.CurRoleInfo.CurrentMP = 0; } if (m_RoleCtrl.OnMPChange != null) { m_RoleCtrl.OnMPChange(ValueChangeType.Reduce); } } //暂时 只有玩家才寻找敌人 m_EnemyList.Clear(); if (m_RoleCtrl.CurRoleType == RoleType.MainPlayer) { int attackTargetCount = skillEntity.AttackTargetCount; if (attackTargetCount == 1) { //单体攻击 if (m_RoleCtrl.LockEnemy != null) { //有锁定敌人 m_EnemyList.Add(m_RoleCtrl.LockEnemy); } else { //没有锁定敌人 SearchAndSortEnemys(skillEntity.AreaAttackRadius); bool isFind = false; for (int i = 0; i < m_SearchEnemyList.Count; i++) { RoleCtrl lockEnemy = m_SearchEnemyList[i].GetComponent <RoleCtrl>(); if (lockEnemy.CurRoleType == RoleType.MainPlayer || lockEnemy.FSM.CurrentRoleStateEnum == RoleState.Die) { continue; } m_EnemyList.Add(lockEnemy); m_RoleCtrl.LockEnemy = lockEnemy; break; } if (!isFind) { //找不到敌人 return(false); } } } else { //群体攻击 int needCount = attackTargetCount; if (m_RoleCtrl.LockEnemy != null) { //有锁定敌人 m_EnemyList.Add(m_RoleCtrl.LockEnemy); needCount--; SearchAndSortEnemys(skillEntity.AreaAttackRadius); //循环加入搜索到的敌人 for (int i = 0; i < m_SearchEnemyList.Count; i++) { RoleCtrl lockEnemy = m_SearchEnemyList[i].GetComponent <RoleCtrl>(); if (lockEnemy.CurRoleInfo.RoleId == m_RoleCtrl.LockEnemy.CurRoleInfo.RoleId || lockEnemy.CurRoleType == RoleType.MainPlayer || lockEnemy.FSM.CurrentRoleStateEnum == RoleState.Die) { continue; } if (i + 1 > needCount) { break; } m_EnemyList.Add(lockEnemy); } } else { //没有锁定敌人 SearchAndSortEnemys(skillEntity.AreaAttackRadius); if (m_SearchEnemyList.Count > 0) { for (int i = 0; i < m_SearchEnemyList.Count; i++) { if (i + 1 > needCount) { break; } RoleCtrl lockEnemy = m_SearchEnemyList[i].GetComponent <RoleCtrl>(); if (lockEnemy.CurRoleType == RoleType.MainPlayer || lockEnemy.FSM.CurrentRoleStateEnum == RoleState.Die) { continue; } if (i == 0) { m_RoleCtrl.LockEnemy = lockEnemy; } m_EnemyList.Add(lockEnemy); } } else { return(false); } } } } else { m_EnemyList.Add(m_RoleCtrl.LockEnemy); } for (int i = 0; i < m_EnemyList.Count; i++) { RoleTransferAttackInfo t = CalculationHurtValue(m_EnemyList[i], skillEntity, skillLevelEnity); if (t == null) { return(false); } m_EnemyList[i].ToHurt(t); } } #endregion #region 动画相关 if (m_StateAttak == null) { m_StateAttak = (RoleStateAttack)m_RoleFSMMgr.GetState(RoleState.Attack); if (m_StateAttak == null) { return(false); } } m_RoleFSMMgr.CurRoleCtrl.CurAttackInfo = GetAttackInfoBySkillId(attackType, skillId); m_StateAttak.AnimatorCondition = (attackType == AttackType.PhyAttack ? ToAnimatorCondition.ToPhyAttack.ToString() : ToAnimatorCondition.ToSkillAttack.ToString()); m_StateAttak.AnimatorConditionValue = m_RoleFSMMgr.CurRoleCtrl.CurAttackInfo.Index; KeyValuePair <string, int> stateValue = GetAnimatorName(attackType, m_RoleFSMMgr.CurRoleCtrl.CurAttackInfo.Index); m_StateAttak.CurAnimatorName = stateValue.Key; m_StateAttak.CurrentStateValue = stateValue.Value; m_RoleFSMMgr.ChangeState(RoleState.Attack); #endregion return(true); }
private RoleTransferAttackInfo CalculationHurtValue(RoleCtrl enemy, SkillEntity skillEntity, SkillLevelEntity skillLevelEntity) { if (enemy == null || skillEntity == null || skillLevelEntity == null) { return(null); } RoleTransferAttackInfo t = new RoleTransferAttackInfo(); t.AttackRoleID = m_RoleCtrl.CurRoleInfo.RoleId; t.AttackRolePos = m_RoleCtrl.transform.position; t.BeAttaclRoleID = enemy.CurRoleInfo.RoleId; t.SkillId = skillEntity.Id; t.SkillLevel = skillLevelEntity.Level; t.IsAbnormal = skillEntity.AbnormalState == 1; //计算伤害 //1.攻击数值=攻击方的综合战斗力*(技能的伤害倍率*0.01f) float attackValue = m_RoleCtrl.CurRoleInfo.Fighting * (skillLevelEntity.HurtValueRate * 0.01f); //2.基础伤害=g攻击数值*攻击数值/(攻击数值+被攻击方的防御) float baseHurt = attackValue * attackValue / (attackValue * enemy.CurRoleInfo.Defense); //3.暴击概率=0.05f+(攻击方的暴击/(攻击方的暴击+防御方的抗性))*0.1f float cri = 0.05f + (m_RoleCtrl.CurRoleInfo.Cri / (m_RoleCtrl.CurRoleInfo.Cri / (float)enemy.CurRoleInfo.Res)) * 0.1f; cri = cri > 0.5f ? 0.5f : cri; //4.是否暴击=0-1随机数<=随机数 bool isCri = Random.Range(0f, 1f) <= cri; //5.暴击伤害倍率=有暴击?1.5f:1f float criHurt = isCri ? 1.5f : 1f; //6.随机数 0.9f-1.1f float random = Random.Range(0.9f, 1.1f); //7.最终伤害 =基础伤害*暴击伤害倍率*随机数 int hurtValue = (int)(baseHurt * criHurt * random); hurtValue = hurtValue < 1 ? 1 : hurtValue; t.IsCri = isCri; t.HurtValue = hurtValue; return(t); }