예제 #1
0
    /// <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);
        }
    }
예제 #2
0
    /// <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);
        }
    }
예제 #3
0
파일: ShipDisplay.cs 프로젝트: LynnPi/OF
 /// <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));
     }
 }
예제 #4
0
    /// <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);
    }
예제 #5
0
파일: TeamDisplay.cs 프로젝트: LynnPi/OF
 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);
 }
예제 #6
0
파일: ShipDisplay.cs 프로젝트: LynnPi/OF
    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();
    }