/// <summary> /// 执行技能 /// </summary> /// <param name="skill"></param> /// <param name="targetID"></param> private void DoSkill(ClientSkill skill, int targetID, Vector3 position) { proto.UseSkill useSkill = new proto.UseSkill(); useSkill.skillid = skill.ID; useSkill.unitid = this.ID; useSkill.partid = skill.ControlPart.Id; useSkill.skillstage = Def.SkillStage.Casting; useSkill.posx = (int)(position.x * 10000); useSkill.posy = (int)(position.y * 10000); useSkill.posz = (int)(position.z * 10000); FightMessageCache.Instance.AddMessage(useSkill); var targetList = TargetSelector.FindSkillTarget(this, skill, targetID, position); for (int i = 0; i < targetList.Count; ++i) { ShipEntity target = targetList[i]; proto.PartFireInfo fireInfo = new proto.PartFireInfo(); fireInfo.targetid = target.ID; fireInfo.delayframe = skill.Prop.continued_time; if (skill.Prop.missle_vel > 0) { float distance = Vector3.Distance(this.Ship.Position, target.Ship.Position); fireInfo.delayframe = Mathf.CeilToInt(distance / (skill.Prop.missle_vel * FightServiceDef.SPEED_SCALAR)); } useSkill.add_fireinfolist(fireInfo); // 给目标发一条被技能打击的消息 MessageDispatcher.Instance.DispatchMessage(TelegramType.UnderSkillAttack, this.ID, target.ID, fireInfo.delayframe, skill.Prop.effect_val, skill.Prop.skill_effect_type); } }
/// <summary> /// 战斗回调 /// </summary> /// <param name="obj"></param> private void BattleSys_EventOnFightFrameInfo(proto.S2CFightFrameInfo obj) { if (UserStatusPanel.Instance != null) { UserStatusPanel.Instance.ShowTime(obj.fighttick / 1000); } for (int i = 0; i < obj.underattacklist_size(); i++) { proto.UnderAttackInfo underAttackInfo = obj.underattacklist(i); TeamDisplay display = GetTeamDisplay(underAttackInfo.unitid); display.ModifyHp(underAttackInfo); } for (int i = 0; i < obj.behaviorsequences_size(); i++) { proto.UnitBehavior unit = obj.behaviorsequences(i); TeamDisplay display = GetTeamDisplay(unit.unitid); if (unit.breakaway) { display.BreakAway(); continue; } if (unit.has_position()) { display.Move(((float)unit.position.posx) / 10000f, ((float)unit.position.posz) / 10000f, unit.position.movetype); } // 部件开火信息表 for (int eventIndex = 0; eventIndex < unit.partfireevent_size(); eventIndex++) { proto.PartFireEvent fireEvent = unit.partfireevent(eventIndex); if (fireEvent == null) { Debug.LogError("PartFireEvent is null"); continue; } display.ShipFire(fireEvent); } } for (int i = 0; i < obj.useskill_size(); i++) { proto.UseSkill skill = obj.useskill(i); if (skill.skillstage == Def.SkillStage.Sing && EventOnSkillSing != null) { EventOnSkillSing(skill.skillid); } else if (skill.skillstage == Def.SkillStage.Casting && EventOnSkillTrigger != null) { EventOnSkillTrigger(skill.skillid); } TeamDisplay display = GetTeamDisplay(skill.unitid); display.UseSkill(skill); } }
/// <summary> /// 施放技能 /// </summary> /// <param name="skill"></param> /// <param name="spell"></param> public void UseSkill(proto.UseSkill skill) { proto.SkillReference skillReference = GlobalConfig.GetSkillReference(skill.skillid); if (skillReference == null) { Debug.Log("cant find skill reference:" + skill.skillid); return; } if (skill.skillstage == Def.SkillStage.Sing) { SingSkill(GetSkill(skill.partid)); } else if (skill.skillstage == Def.SkillStage.Casting) { StartCoroutine(CastSkill(skill)); } }
/// <summary> /// 技能引导 /// </summary> /// <param name="msg"></param> private void OnSkillLead(Telegram msg) { ClientSkill skill = this.Ship.SkillDic[msg.Val1]; skill.StartCoolDown(); proto.UseSkill useSkill = new proto.UseSkill(); useSkill.unitid = this.ID; useSkill.skillid = skill.ID; useSkill.partid = skill.ControlPart.Id; useSkill.skillstage = Def.SkillStage.Sing; useSkill.posx = (int)(msg.Val3 * 10000); useSkill.posy = (int)(msg.Val4 * 10000); useSkill.posz = (int)(msg.Val5 * 10000); FightMessageCache.Instance.AddMessage(useSkill); // 再给自己发一条技能触发的延时消息 MessageDispatcher.Instance.DispatchMessage(TelegramType.SkillTrigger, this.ID, this.ID, skill.Prop.skill_lead_time, msg.Val1, msg.Val2, msg.Val3, msg.Val4, msg.Val5); }
public void UseSkill(proto.UseSkill skill) { if (ShipList_.Count < 1) { Debug.Log("there is no ship can use skill"); return; } // 编队必定不能使用技能 if (ShipList_.Count > 1) { Debug.Log("skill can not used by team"); return; } if (ShipList_[0] == null) { Debug.Log("no ship to use skill"); return; } ShipList_[0].UseSkill(skill); }
private IEnumerator CastSkill(proto.UseSkill useSkill) { Skill skill = GetSkill(useSkill.partid); if (skill == null) { Debug.Log("skill is null"); yield break; } ShowCast(skill); ClientSkill clientSkill = BattleSys.GetCommanderShip().GetSkillById(useSkill.skillid); // 范围攻击,只生成一个子弹 if (skill.partType == SpellType.AOE) { List <BulletTarget> targetList = new List <BulletTarget>(); for (int i = 0; i < useSkill.fireinfolist_size(); i++) { proto.PartFireInfo info = useSkill.fireinfolist(i); TeamDisplay target = BattleSceneDisplayManager.Instance.GetTeamDisplay(info.targetid); if (target == null) { continue; } BulletTarget bulletTarget = new BulletTarget(); bulletTarget.delayFrame = info.delayframe; bulletTarget.Target = target; targetList.Add(bulletTarget); } ClientParts parts = Team_.GetPartsByID(skill.partID); float x = (float)useSkill.posx / 10000f; float y = (float)useSkill.posy / 10000f; float z = (float)useSkill.posz / 10000f; Vector3 position = new Vector3(x, y, z); ShowBullet(parts, targetList, skill.partType, skill.attackPoint, skill.bulletPath, skill.hitEffect, position, clientSkill); } // 个体攻击,每个对象都生成子弹 else { for (int i = 0; i < useSkill.fireinfolist_size(); i++) { proto.PartFireInfo info = useSkill.fireinfolist(i); TeamDisplay target = BattleSceneDisplayManager.Instance.GetTeamDisplay(info.targetid); if (target == null) { continue; } List <BulletTarget> targetList = new List <BulletTarget>(); BulletTarget bulletTarget = new BulletTarget(); bulletTarget.delayFrame = info.delayframe; bulletTarget.Target = target; targetList.Add(bulletTarget); ClientParts parts = Team_.GetPartsByID(skill.partID); ShowBullet(parts, targetList, skill.partType, skill.attackPoint, skill.bulletPath, skill.hitEffect, Vector3.zero, clientSkill); } } yield return(new WaitForSeconds(1.2f)); for (int i = 0; i < SingEffectList_.Count; i++) { if (SingEffectList_[i] == null) { continue; } Destroy(SingEffectList_[i]); } SingEffectList_.Clear(); }