Exemple #1
0
        /// <summary>
        /// 建立更新控制端
        /// </summary>
        /// <param name="code"></param>
        private void builtUpdateControler(BaseCommunication sender, Code code)
        {
            BaseControler controler = sender as BaseControler;

            if (controler != null)
            {
                PortCode readyCode = code as PortCode;
                if (readyCode != null)
                {
                    if (serverupdateControler == null)
                    {
                        serverupdateControler = new FileControler(controler.ServerAddress, readyCode.Port);
                    }
                    if (serverupdateControler != null)
                    {
                        serverupdateControler.CloseConnections();
                        Thread.Sleep(500);
                        serverupdateControler                 = new FileControler(controler.ServerAddress, readyCode.Port);
                        serverupdateControler.SourceFile      = updatedFile;
                        serverupdateControler.DestinationFile = ICanSeeYou.Common.IO.GetName(updatedFile);
                        serverupdateControler.IsDownload      = false;//上传更新文件
                        serverupdateControler.Open();
                    }
                }
            }
        }
Exemple #2
0
 /// <summary>
 /// 设置抓取物体; 速率会下降0.5, 并将bctroller放到自己对象下,使得可以和一起移动;
 /// </summary>
 /// <param name="bctroller"></param>
 public void SetGraspController(BaseControler bctroller)
 {
     if (bctroller != null)
     {
         bctroller.MoveController.StopMove();
         _grapParent = bctroller.gameObject.transform.parent;
         bctroller.gameObject.transform.parent = GoBase.transform;
         if (bctroller is ActionControler)
         {
             (bctroller as ActionControler).CanMove         = false;
             (bctroller as ActionControler).CanChangeStatus = false;
         }
     }
     else
     {
         if (_grapController != null)
         {
             if (_grapController is ActionControler)
             {
                 _grapController.gameObject.transform.parent          = _grapParent;
                 (_grapController as ActionControler).CanMove         = true;
                 (_grapController as ActionControler).CanChangeStatus = true;
             }
         }
     }
     _grapController = bctroller;
 }
Exemple #3
0
        /// <summary>
        /// 添加一个控制端
        /// </summary>
        /// <param name="serverAddress">服务端地址</param>
        /// <param name="insertIntoTreeNode">是否添加到树形列表中</param>
        /// <returns>树形控件的结点数 与 已经连接的服务端数 是否匹配</returns>
        private bool InsertControler(System.Net.IPAddress serverAddress, bool insertIntoTreeNode)
        {
            DisplayMessage("正在连接" + serverAddress + "...");
            //最大重试次数10
            BaseControler mainControler = new BaseControler(serverAddress, Constant.Port_Main, 10);

            mainControler.Execute = new ExecuteCodeEvent(mainExecuteCode);
            // mainControler.MaxTimes = Constant.MaxTimes;
            mainControler.Connecting();
            if (mainControler.HaveConnected)
            {
                DisplayMessage("连接" + serverAddress + "成功!");
                currentControler = mainControler;
                curServerIP      = mainControler.ServerAddress;
                //是否添加到树形列表中
                if (insertIntoTreeNode)
                {
                    try
                    {
                        trv_HostView.Invoke(new TreeViewAddEvent(TreeViewAddNode), new object[] { serverAddress });
                    }
                    catch
                    {
                        return(false);
                    }
                }
            }
            else
            {
                DisplayMessage("连接" + serverAddress + "不成功!");
            }
            return(true);
        }
Exemple #4
0
 public IEnumerator ThrowDisplay(BaseDisplay throwDisplay, BaseControler hostController, int dire = 0, Action throwComplete = null)
 {
     if (throwDisplay != null)
     {
         //Debug.Log("开始投掷*******************************");
         MoveControllerBase  mcb = throwDisplay.Controller.MoveController;
         StatuControllerBase scb = throwDisplay.Controller.StatuController;
         float f = 0.0f;
         if (mcb != null)
         {
             if (throwDisplay is MonsterDisplay)
             {
                 f = 2 / ((throwDisplay as MonsterDisplay).BoxCollider2D.size.x);
                 (mcb as MonsterMoveController).StartY = throwDisplay.Controller.transform.position.y - 0.1f;
                 yield return(StartCoroutine((mcb as MonsterMoveController).MoveByParabola(0.68f * f, 4.0f * f, 32.0f * f, dire)));
             }
             else if (throwDisplay is PlayerDisplay)
             {
                 yield return(StartCoroutine((throwDisplay.Controller.StatuController as PlayerStatuController).MoveByParabola(throwDisplay.Controller.Me.GoBase, SpeedConst.PlayerHurtBackMoveSpeed, 6.0f, 30.0f)));
             }
             //Debug.Log("结束投掷****************结束***************");
         }
     }
     if (throwComplete != null)
     {
         throwComplete();
     }
 }
Exemple #5
0
        /// <summary>
        /// 获取对方信息(IP和主机名)
        /// </summary>
        /// <param name="sender"></param>
        private void GetServerMessage(BaseCommunication sender)
        {
            BaseControler controler = sender as BaseControler;

            if (controler != null)
            {
                BaseCode code = new BaseCode();
                code.Head = CodeHead.HOST_MESSAGE;
                controler.SendCode(code);
            }
        }
Exemple #6
0
 /// <summary>
 /// 关闭当前控制端
 /// </summary>
 public void CloseCurrentControler()
 {
     if (currentControler != null)
     {
         currentControler.CloseConnections();
     }
     if (mainControlerThread != null && mainControlerThread.IsAlive)
     {
         mainControlerThread.Abort();
     }
     currentControler = null;
 }
Exemple #7
0
 public void SetGraspedController(BaseControler bctroller)
 {
     if (bctroller != null)
     {
         bctroller.Me.GetMeVoByType <BaseRoleVo>().RateMoveSpeed = 0.5f;
     }
     else
     {
         if (_graspedController != null)
         {
             _graspedController.Me.GetMeVoByType <BaseRoleVo>().RateMoveSpeed = 1f;
         }
     }
     _graspedController = bctroller;
 }
Exemple #8
0
        /// <summary>
        /// 建立文件控制端
        /// </summary>
        /// <param name="code"></param>
        private void builtFileControler(BaseCommunication sender, Code code)
        {
            BaseControler controler = sender as BaseControler;

            if (controler != null)
            {
                PortCode readyCode = code as PortCode;
                if (readyCode != null)
                {
                    if (fileControler != null)
                    {
                        fileControler.CloseConnections();
                    }
                    fileControler         = new FileControler(controler.ServerAddress, readyCode.Port);
                    fileControler.Refrush = new RefrushEvent(UpdateExplorerView);
                }
            }
        }
Exemple #9
0
        /// <summary>
        /// 建立屏幕接收端
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="code"></param>
        private void builtScreenControler(BaseCommunication sender, Code code)
        {
            BaseControler controler = sender as BaseControler;

            if (controler != null)
            {
                PortCode readyCode = code as PortCode;
                if (readyCode != null)
                {
                    if (screenControler != null)
                    {
                        screenControler.CloseConnections();
                    }
                    screenControler             = new ScreenControler(controler.ServerAddress, readyCode.Port);
                    screenControler.pic_Screen  = pic_Screen;
                    screenControler.lbl_Message = lbl_Message;
                }
            }
        }
Exemple #10
0
 /// <summary>
 /// 在当前场景中获取有对应tag的角色的部位;
 /// 注意:确保tag已经在编辑器中声明,不然会报错;
 /// </summary>
 /// <param name="_hostId"></param>
 /// <param name="_partBoneTag"></param>
 /// <returns></returns>
 public static GameObject GetPartBonesByHostAndTag(string _hostId, string _partBoneTag)
 {
     GameObject[] gos = GameObject.FindGameObjectsWithTag(_partBoneTag);
     if (gos != null && gos.Length > 0)
     {
         BaseControler tmpBaseController = null;
         foreach (GameObject tmpGo in gos)
         {
             tmpBaseController = tmpGo.transform.root.GetComponent <BaseControler>();
             if (tmpBaseController != null)
             {
                 if (tmpBaseController.Me.GetVo().Id.ToString() == _hostId)
                 {
                     return(tmpGo);
                 }
             }
         }
     }
     return(null);
 }
Exemple #11
0
 /// <summary>
 /// 添加抓取投掷;
 /// </summary>
 /// <param name="grapDisplay">被抓取者</param>
 /// <param name="hostController">抓取者</param>
 /// <param name="setTag">PlayConstant中的部位字符串</param>
 /// <param name="autoIfNoTag">如果setTag的部位为null,那么使用display的位置</param>
 public void AddGrapDispaly(BaseDisplay grapDisplay, BaseControler hostController, string setTag, bool autoIfNoTag = true, bool autoThrow = true, Action throwComplete = null)
 {
     if (grapDisplay != null)
     {
         GameObject partGo = PlayUtils.GetPartBonesByHostAndTag(hostController.Me.GetVo().Id.ToString(), setTag);
         Vector3    tmpPos;
         //判断部件位置;
         if (partGo != null)
         {
             tmpPos = partGo.transform.position;
         }
         else
         {
             tmpPos = hostController.Me.Controller.transform.position;
         }
         PlayUtils.MakeAFaceToB(hostController.Me, grapDisplay);
         grapDisplay.Pos(tmpPos);
         if (autoThrow)
         {
             StartCoroutine(ThrowDisplay(grapDisplay, hostController, Directions.GetOpposite(hostController.Me.CurFaceDire), throwComplete));
         }
     }
 }
Exemple #12
0
 /**移到怪物附近结束**/
 private void moveEndBack(BaseControler controler)
 {
     Log.info(this, "-moveEndBack() 移到怪物跟前结束!");
     autoWalk();
 }
Exemple #13
0
        /// <summary>
        ///     怪物攻击受击目标检测(只对自己的客户端检测)
        /// </summary>
        /// <param name="atker">攻击者</param>
        /// <param name="skillVo">技能VO</param>
        /// <param name="effectPos">施法点,怪物位置或远程施法点</param>
        /// <param name="ownerPos">施法点,怪物位置或远程施法点</param>
        /// <param name="dir">施法方向</param>
        /// <param name="monsterVo">怪物VO</param>
        /// <param name="isSend">是否同步给服务器</param>
        public bool MonsterCheckInjured2D(BaseControler atker, SysSkillBaseVo skillVo, Vector3 effectPos, Vector3 ownerPos, int dir,
                                          MonsterVo monsterVo, int index,
                                          bool isSend = false)
        {
            if (AppMap.Instance.me == null || AppMap.Instance.me.GetVo().CurHp <= 0)
            {
                return(false);
            }
            if (monsterVo.CurHp <= 0)
            {
                return(false);                      //如果检测时当前怪物的血量已经为0,则玩家忽略当前怪物的攻击
            }
            var meVo = AppMap.Instance.me.GetMeVoByType <PlayerVo>();

            if (MeVo.instance.mapId == MapTypeConst.WORLD_BOSS)
            {
                if (AppMap.Instance.me.Controller.transform.position.x > 7)
                {
                    meVo.CurHp = 0;
                    var attackVo = new ActionVo();
                    attackVo.ActionType = Actions.DEATH;
                    meControler.AttackController.AddAttackList(attackVo, true);
                    return(true);
                }
                return(false);
            }

            Vector3       target             = AppMap.Instance.me.Controller.transform.position; //敌方位置
            bool          isDodge            = false;                                            //是否闪避
            bool          isCrit             = false;                                            //是否暴击
            bool          isParry            = false;                                            //是否格挡
            BoxCollider2D myBoxCollider2D    = (meControler.Me as ActionDisplay).BoxCollider2D;
            BoxCollider2D enemyBoxCollider2D = AppMap.Instance.me.BoxCollider2D;

            if (IsSkillCovered(skillVo, effectPos, ownerPos, target, dir, myBoxCollider2D, enemyBoxCollider2D))
            {
                if (!isSend)
                {
                    int  damageVal;
                    uint damageType;
                    uint stateType;
                    if (meVo != null &&
                        (meVo.IsUnbeatable || AppMap.Instance.me.Controller.StatuController.CurrentStatu == Status.ROLL))
                    {
                        return(false); //无敌状态不播放受击
                    }
                    ActionVo attackVo = GetSkillActionVo(skillVo, effectPos, dir, AppMap.Instance.me, index);
                    //怪物的伤害计算
                    GameFormula.CalcDamage(monsterVo, meVo, skillVo, out damageVal, out damageType, out stateType);
                    switch (damageType)
                    {
                    case GameConst.DAMAGE_TYPE_MISS:
                        isDodge = true;
                        break;

                    case GameConst.DAMAGE_TYPE_CRIT:
                        isCrit = true;
                        break;
                    }
                    if (!isDodge)//命中后,攻击者产生力反馈,受击者处理受击逻辑
                    {
                        atker.AttackController.ForceFeedBack(attackVo);
                        meControler.BeAttackedController.BeAttacked(attackVo);
                    }
                    int cutHp = damageVal; //伤害值
                    if (MeVo.instance.mapId == MapTypeConst.FirstFightMap &&
                        (meVo.CurHp < meVo.Hp * 0.3f || meVo.CurHp <= (uint)cutHp))
                    {
                        cutHp   = 0;
                        isDodge = true;
                    }
                    else
                    {
                        if (meVo.CurHp <= (uint)cutHp)
                        {
                            meVo.CurHp          = 0;
                            attackVo            = new ActionVo();
                            attackVo.ActionType = Actions.DEATH;
                            meControler.AttackController.AddAttackList(attackVo, true);
                        }
                        else
                        {
                            meVo.CurHp -= (uint)cutHp;
                        }
                    }
                    PlayerAiController.AddHudView(isDodge, isCrit, isParry, cutHp, (int)meVo.CurHp, Color.yellow);
                    //冒血直接冒
                    //攻击后重置受击抵抗属性
                    monsterVo.HurtResist = (uint)monsterVo.MonsterVO.hurt_resist;
                    return(true);
                }
            }
            monsterVo.HurtResist = (uint)monsterVo.MonsterVO.hurt_resist;
            return(false);
        }
Exemple #14
0
        /// <summary>
        ///     主角伤害检测
        /// </summary>
        /// <param name="atker">攻击者</param>
        /// <param name="skillVo">技能Vo</param>
        /// <param name="playerVo"></param>
        /// <param name="skillType">技能类型</param>
        /// <param name="effectPos">技能特效位置</param>
        /// <param name="ownerPos">技能施放者位置</param>
        /// <param name="dir">技能施放方向</param>
        /// <param name="enemyDisplays">敌人列表</param>
        /// <param name="isBullet">是否是子弹技能</param>
        /// <param name="checkedTime"></param>
        /// <param name="index">索引</param>
        /// <param name="needSyn">是否需要同步伤害</param>
        /// <returns></returns>
        public bool CheckPlayerInjured2D(BaseControler atker, SysSkillBaseVo skillVo, PlayerVo playerVo, Vector3 effectPos,
                                         Vector3 ownerPos, int dir,
                                         IList <ActionDisplay> enemyDisplays, bool isBullet, int checkedTime, int index = 0, bool needSyn = false)
        {
            bool result = false;

            if (playerVo.CurHp == 0)
            {
                return(false);
            }
            foreach (ActionDisplay enemyDisplay in enemyDisplays)
            {
                var enemyVo = enemyDisplay.GetMeVoByType <BaseRoleVo>(); //怪物vo
                if (enemyDisplay.Controller == null || enemyVo.CurHp == 0)
                {
                    continue;
                }
                Vector3       target             = enemyDisplay.Controller.transform.position; //敌方位置
                BoxCollider2D myBoxCollider2D    = (meControler.Me as ActionDisplay).BoxCollider2D;
                BoxCollider2D enemyBoxCollider2D = enemyDisplay.BoxCollider2D;
                if (IsSkillCovered(skillVo, effectPos, ownerPos, target, dir, myBoxCollider2D, enemyBoxCollider2D))
                {
                    result = true;
                    ActionVo attackVo = GetSkillActionVo(skillVo, effectPos, dir, enemyDisplay, index, checkedTime,
                                                         enemyVo.MoveRatio);
                    //attackVo.HurtEffectIndex = index;
                    attackVo.HurtType = Actions.HurtNormal;
                    enemyDisplay.Controller.BeAttackedController.BeAttacked(attackVo);
                    meControler.AttackController.ForceFeedBack(attackVo);
                    if (!needSyn)
                    {
                        int  damageVal;
                        uint damageType;
                        uint stateType;
                        //攻击伤害计算
                        GameFormula.CalcDamage(playerVo, enemyVo, skillVo, out damageVal, out damageType, out stateType);
                        var        cutHp   = (uint)damageVal; //伤害值
                        bool       isDodge = false;           //是否闪避
                        bool       isCrit  = false;           //是否暴击
                        const bool isParry = false;           //是否格挡
                        switch (damageType)
                        {
                        case GameConst.DAMAGE_TYPE_MISS:
                            isDodge = true;
                            break;

                        case GameConst.DAMAGE_TYPE_CRIT:
                            isCrit = true;
                            break;
                        }
                        if (enemyVo.CurHp <= cutHp)
                        {
                            attackVo.HurtType = Actions.HurtFly;
                            enemyDisplay.Controller.BeAttackedController.BeAttacked(attackVo);
                            if (!needSyn)
                            {
                                enemyVo.CurHp = 0;
                                enemyDisplay.Controller.DisposeHudView();
                                attackVo            = new ActionVo();
                                attackVo.ActionType = Actions.DEATH;
                                enemyDisplay.Controller.AttackController.AddAttackList(attackVo, true);
                            }
                        }
                        else //Miss也播放受击效果,所以这里是>=0
                        {
                            enemyVo.lastHp = enemyVo.CurHp;
                            if (AppMap.Instance.mapParser.MapId != MapTypeConst.WORLD_BOSS)
                            {
                                enemyVo.CurHp -= cutHp;
                            }
                        }
                        enemyDisplay.Controller.AiController.AddHudView(isDodge, isCrit, isParry, (int)cutHp,
                                                                        (int)enemyVo.CurHp, ColorConst.Blood);
                    }
                }
            }
            return(result);
        }
Exemple #15
0
        /// <summary>
        ///     宠物伤害检测
        /// </summary>
        /// <param name="atker">攻击者</param>
        /// <param name="skillVo">技能Vo</param>
        /// <param name="skillType">技能类型</param>
        /// <param name="excutePos">技能特效位置</param>
        /// <param name="selfPos">技能施放者位置</param>
        /// <param name="dir">技能施放方向</param>
        /// <param name="enemyDisplays">敌人列表</param>
        /// <param name="isBullet">是否是子弹技能</param>
        /// <param name="checkedTime"></param>
        /// <param name="index">攻击序列的序号</param>
        /// <param name="needSyn">是否需要同步伤害</param>
        /// <returns></returns>
        public bool CheckPetInjured2D(BaseControler atker, SysSkillBaseVo skillVo, Vector3 excutePos, Vector3 selfPos, int dir,
                                      IList <ActionDisplay> enemyDisplays, bool isBullet, int checkedTime, int index = 0, bool needSyn = false)
        {
            bool result     = false;
            var  damageList = new List <PDamage>();

            foreach (ActionDisplay enemyDisplay in enemyDisplays)
            {
                var enemyVo = enemyDisplay.GetVo() as BaseRoleVo; //怪物vo
                if (enemyDisplay.Controller == null || enemyVo.CurHp == 0)
                {
                    continue;
                }
                Vector3       target             = enemyDisplay.Controller.transform.position; //敌方位置
                BoxCollider2D myBoxCollider2D    = (meControler.Me as ActionDisplay).BoxCollider2D;
                BoxCollider2D enemyBoxCollider2D = enemyDisplay.BoxCollider2D;
                if (IsSkillCovered(skillVo, excutePos, selfPos, target, dir, myBoxCollider2D, enemyBoxCollider2D))
                {
                    result = true;
                    ActionVo attackVo = GetSkillActionVo(skillVo, excutePos, dir, enemyDisplay, checkedTime);
                    //attackVo.HurtEffectIndex = index;
                    int  damageVal;
                    uint damageType;
                    uint stateType;
                    var  myVo = AppMap.Instance.me.GetVo() as PlayerVo;
                    //攻击伤害计算
                    GameFormula.CalcDamage(myVo, enemyVo, skillVo, out damageVal, out damageType, out stateType);
                    var cutHp = (uint)damageVal;  //伤害值

                    /*if (cutHp < 300)
                     * {
                     *  cutHp = cutHp + 300; //原来是200
                     * }*/
                    if (AppMap.Instance.mapParser.MapId == MapTypeConst.WORLD_BOSS) //如果是世界Boss 副本发送伤害值
                    {
                        Singleton <BossControl> .Instance.Attack(cutHp);
                    }
                    if (AppMap.Instance.mapParser.MapId == MapTypeConst.GoldHit_MAP) //如果是击石成金的副本,计算伤害值,暂时用英雄榜的替换
                    {
                        Singleton <GoldHitControl> .Instance.Attack(cutHp);

                        Singleton <GoldHitMode> .Instance.Monster = target;
                    }
                    bool isDodge = false; //是否闪避
                    bool isCrit  = false; //是否暴击
                    bool isParry = false; //是否格挡
                    switch (damageType)
                    {
                    case GameConst.DAMAGE_TYPE_MISS:
                        isDodge = true;
                        break;

                    case GameConst.DAMAGE_TYPE_CRIT:
                        isCrit = true;
                        break;
                    }
                    if (!isDodge)//命中后攻击者产生力反馈
                    {
                        atker.AttackController.ForceFeedBack(attackVo);
                    }
                    if (enemyVo.CurHp <= cutHp)
                    {
                        uint previousHp = enemyVo.CurHp;
                        attackVo.HurtType = Actions.HurtFly;
                        enemyDisplay.Controller.BeAttackedController.BeAttacked(attackVo);
                        if (needSyn)
                        {
                            PDamage pdamage = GetSkillPDamage(enemyVo, enemyDisplay, cutHp, isDodge, isCrit);
                            damageList.Add(pdamage);
                        }
                        else
                        {
                            enemyVo.CurHp = 0;
                            enemyDisplay.Controller.DisposeHudView();
                            attackVo            = new ActionVo();
                            attackVo.ActionType = Actions.DEATH;
                            enemyDisplay.Controller.AttackController.AddAttackList(attackVo, true);
                            MonsterMgr.Instance.LiveMonsterNumber--;
                            if (MonsterMgr.Instance.LiveMonsterNumber == 0 && MapMode.CUR_MAP_PHASE == 3)
                            {
                                Singleton <MapControl> .Instance.MyCamera.ShowCopyWinEffect();
                            }
                            if (enemyDisplay.Type == DisplayType.MONSTER)
                            {
                                var monsterVo = enemyVo as MonsterVo;
                                if (monsterVo != null && monsterVo.MonsterVO.quality == 3)
                                {
                                    Singleton <BattleMode> .Instance.SetCurrentHp(monsterVo.MonsterVO.name, enemyVo.Hp,
                                                                                  previousHp, enemyVo.CurHp, monsterVo.Level, monsterVo.MonsterVO.quality, monsterVo.MonsterVO.icon,
                                                                                  monsterVo.MonsterVO.hp_count);
                                }
                            }
                        }
                    }
                    else //Miss也播放受击效果,所以这里是>=0
                    {
                        enemyDisplay.Controller.BeAttackedController.BeAttacked(attackVo);
                        if (needSyn)
                        {
                            PDamage pdamage = GetSkillPDamage(enemyVo, enemyDisplay, cutHp, isDodge, isCrit);
                            damageList.Add(pdamage);
                        }
                        else
                        {
                            //不是世界Boss 副本,才扣血 ,世界Boss血量有后端控制
                            uint previousHp = enemyVo.CurHp;
                            enemyVo.lastHp = enemyVo.CurHp;
                            if (AppMap.Instance.mapParser.MapId != MapTypeConst.WORLD_BOSS)
                            {
                                enemyVo.CurHp -= cutHp;
                            }
                            if (enemyDisplay.Type == DisplayType.MONSTER)
                            {
                                var monsterVo = enemyVo as MonsterVo;
                                if (monsterVo != null && monsterVo.MonsterVO.quality == 3)
                                {
                                    Singleton <BattleMode> .Instance.SetCurrentHp(monsterVo.MonsterVO.name, enemyVo.Hp,
                                                                                  previousHp, monsterVo.CurHp, monsterVo.Level, monsterVo.MonsterVO.quality, monsterVo.MonsterVO.icon,
                                                                                  monsterVo.MonsterVO.hp_count);
                                }
                            }
                        }
                    }
                    if (!needSyn)
                    {
                        enemyDisplay.Controller.AiController.AddHudView(isDodge, isCrit, isParry, (int)cutHp,
                                                                        (int)enemyVo.CurHp, ColorConst.Blood);
                    }
                    else
                    {
                        if (damageList.Count > 0)
                        {
                            //向服务端发送主角自己的技能伤害
                            //SkillMode.Instance.SendHeroSkillDamageList(skillVo.unikey, damageList);
                        }
                    }
                }
            }
            return(result);
        }
Exemple #16
0
        /// <summary>
        ///     主角伤害检测
        /// </summary>
        /// <param name="atker">攻击者</param>
        /// <param name="skillVo">技能Vo</param>
        /// <param name="skillType">技能类型</param>
        /// <param name="effectPos">技能特效位置</param>
        /// <param name="ownerPos">技能施放者位置</param>
        /// <param name="dir">技能施放方向</param>
        /// <param name="enemyDisplays">敌人列表</param>
        /// <param name="isBullet">是否是子弹技能</param>
        /// <param name="index">攻击序列的序号</param>
        /// <param name="checkedTime"></param>
        /// <param name="needSyn">是否需要同步伤害</param>
        /// <returns></returns>
        public bool CheckMeInjured2D(BaseControler atker, SysSkillBaseVo skillVo, Vector3 effectPos, Vector3 ownerPos, int dir,
                                     IList <ActionDisplay> enemyDisplays, bool isBullet, int index, int checkedTime, bool needSyn = false)
        {
            bool result     = false;
            var  damageList = new List <PDamage>();
            int  damageNum  = 0;

            if (MeVo.instance.CurHp == 0)
            {
                return(false);
            }
            foreach (ActionDisplay enemyDisplay in enemyDisplays)
            {
                var enemyVo = enemyDisplay.GetMeVoByType <BaseRoleVo>(); //怪物vo
                if (enemyDisplay.Controller == null || enemyVo.CurHp == 0)
                {
                    continue;
                }
                Vector3       target             = enemyDisplay.Controller.transform.position; //敌方位置
                BoxCollider2D myBoxCollider2D    = (meControler.Me as ActionDisplay).BoxCollider2D;
                BoxCollider2D enemyBoxCollider2D = enemyDisplay.BoxCollider2D;
                if (IsSkillCovered(skillVo, effectPos, ownerPos, target, dir, myBoxCollider2D, enemyBoxCollider2D))
                {
                    damageNum += 1;
                    result     = true;
                    ActionVo attackVo = GetSkillActionVo(skillVo, effectPos, dir, enemyDisplay, index, checkedTime,
                                                         enemyVo.MoveRatio);
                    //attackVo.HurtEffectIndex = index;
                    attackVo.HurtType = Actions.HurtNormal;
                    int  damageVal;
                    uint damageType;
                    uint stateType;
                    var  myVo = AppMap.Instance.me.GetVo() as PlayerVo;
                    //攻击伤害计算
                    GameFormula.CalcDamage(myVo, enemyVo, skillVo, out damageVal, out damageType, out stateType);
                    var cutHp = (uint)damageVal;                                    //伤害值
                    if (AppMap.Instance.mapParser.MapId == MapTypeConst.WORLD_BOSS) //如果是世界Boss 副本发送伤害值
                    {
                        float attackAddRate = BossMode.Instance.AttackGuwuRate;     //攻击加成
                        cutHp = (uint)Mathf.RoundToInt(cutHp * (1f + attackAddRate));
                        float critRate   = BossMode.Instance.CritGuwuRate;
                        float randomRate = Random.Range(0f, 1f);
                        if (critRate >= randomRate)  //暴击
                        {
                            damageType = GameConst.DAMAGE_TYPE_CRIT;
                            cutHp      = (uint)Mathf.RoundToInt(cutHp * 1.5f);
                        }
                        Singleton <BossControl> .Instance.Attack(cutHp);
                    }
                    if (AppMap.Instance.mapParser.MapId == MapTypeConst.GoldHit_MAP) //如果是击石成金的副本,计算伤害值,暂时用英雄榜的替换
                    {
                        Singleton <GoldHitControl> .Instance.Attack(cutHp);

                        Singleton <GoldHitMode> .Instance.Monster = target;
                    }
                    bool       isDodge = false; //是否闪避
                    bool       isCrit  = false; //是否暴击
                    const bool isParry = false; //是否格挡
                    switch (damageType)
                    {
                    case GameConst.DAMAGE_TYPE_MISS:
                        isDodge = true;
                        break;

                    case GameConst.DAMAGE_TYPE_CRIT:
                        isCrit = true;
                        break;
                    }
                    if (!isDodge)//命中时攻击者产生力反馈
                    {
                        atker.AttackController.ForceFeedBack(attackVo);
                    }
                    if (enemyVo.CurHp <= cutHp)
                    {
                        uint previousHp = enemyVo.CurHp;
                        attackVo.HurtType = Actions.HurtFly;
                        if (!isDodge)
                        {
                            //enemyDisplay.Controller.BeAttackedController.BeAttacked(attackVo);
                        }
                        if (needSyn)
                        {
                            PDamage pdamage = GetSkillPDamage(enemyVo, enemyDisplay, cutHp, isDodge, isCrit);
                            damageList.Add(pdamage);
                        }
                        else
                        {
                            enemyVo.CurHp = 0;
                            enemyDisplay.Controller.DisposeHudView();
                            attackVo            = new ActionVo();
                            attackVo.ActionType = Actions.DEATH;
                            enemyDisplay.Controller.AttackController.AddAttackList(attackVo, true);
                            MonsterMgr.Instance.LiveMonsterNumber--;
                            if (MonsterMgr.Instance.LiveMonsterNumber == 0 && MapMode.CUR_MAP_PHASE == 3)
                            {
                                Singleton <MapControl> .Instance.MyCamera.ShowCopyWinEffect();

                                MeVo.instance.IsUnbeatable = true;
                            }
                            if (enemyDisplay.Type == DisplayType.MONSTER)
                            {
                                var monsterVo = enemyVo as MonsterVo;
                                if (monsterVo != null)
                                {
                                    Singleton <BattleMode> .Instance.SetCurrentHp(monsterVo.MonsterVO.name, enemyVo.Hp,
                                                                                  previousHp, enemyVo.CurHp, monsterVo.Level, monsterVo.MonsterVO.quality, monsterVo.MonsterVO.icon,
                                                                                  monsterVo.MonsterVO.hp_count);
                                }
                            }
                        }
                    }
                    else //Miss也播放受击效果,所以这里是>=0
                    {
                        if (!isDodge)
                        {
                            enemyDisplay.Controller.BeAttackedController.BeAttacked(attackVo);
                        }
                        if (needSyn)
                        {
                            PDamage pdamage = GetSkillPDamage(enemyVo, enemyDisplay, cutHp, isDodge, isCrit);
                            damageList.Add(pdamage);
                        }
                        else
                        {
                            //不是世界Boss 副本,才扣血 ,世界Boss血量有后端控制
                            uint previousHp = enemyVo.CurHp;
                            enemyVo.lastHp = enemyVo.CurHp;
                            if (AppMap.Instance.mapParser.MapId != MapTypeConst.WORLD_BOSS)
                            {
                                enemyVo.CurHp -= cutHp;
                            }
                            if (enemyDisplay.Type == DisplayType.MONSTER)
                            {
                                var monsterVo = enemyVo as MonsterVo;
                                if (monsterVo != null)
                                {
                                    Singleton <BattleMode> .Instance.SetCurrentHp(monsterVo.MonsterVO.name, monsterVo.Hp,
                                                                                  previousHp, monsterVo.CurHp, monsterVo.Level, monsterVo.MonsterVO.quality, monsterVo.MonsterVO.icon,
                                                                                  monsterVo.MonsterVO.hp_count);
                                }
                            }
                        }
                    }
                    if (!needSyn)
                    {
                        enemyDisplay.Controller.AiController.AddHudView(isDodge, isCrit, isParry, (int)cutHp,
                                                                        (int)enemyVo.CurHp, ColorConst.Blood);
                    }
                    else
                    {
                        if (damageList.Count > 0)
                        {
                            //向服务端发送主角自己的技能伤害
                            SkillMode.Instance.SendHeroSkillDamageList(skillVo.unikey, damageList);
                        }
                    }
                }
            }
            if (damageNum > 0)
            {
                if (AppMap.Instance.mapParser.MapId != MapTypeConst.GoldHit_MAP)
                {
                    AppMap.Instance.me.Controller.ContCutMgr.AddAttackNum(damageNum); //连击统计
                }
            }
            return(result);
        }