Exemplo n.º 1
0
 public void read(MemoryStream msdata)
 {
     seq     = proto_util.readUByte(msdata);
     skillId = proto_util.readUInt(msdata);
     type    = proto_util.readUByte(msdata);
     actId   = proto_util.readUInt(msdata);
     PDamage.readLoop(msdata, damage);
 }
Exemplo n.º 2
0
        private PDamage GetSkillPDamage(BaseRoleVo enemyVo, ActionDisplay enemyDisplay, uint cutHp, bool isDodge,
                                        bool isCrit)
        {
            var pdamage = new PDamage
            {
                id        = enemyVo.Id,
                type      = (byte)GetSynType(enemyDisplay.Type),
                x         = 0,
                y         = 0,
                dmg       = cutHp,
                hp        = enemyVo.CurHp,
                dmgType   = (byte)GetDamageType(isDodge, isCrit),
                stateType = 0
            };

            return(pdamage);
        }
Exemplo n.º 3
0
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray        rayOrigin = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;

            if (Physics.Raycast(rayOrigin, out hitInfo))
            {
                PDamage obj = hitInfo.collider.GetComponent <PDamage>();

                if (obj != null)
                {
                    obj.Damage(500);
                }
            }
        }
    }
 public void read(MemoryStream msdata)
 {
     PDamage.readLoop(msdata, damage);
 }
Exemplo n.º 5
0
 /**
  * 技能s伤害同步,客户端发起(暂时)
  */
 public static void write_13_12(MemoryStream msdata, uint skillId, List <PDamage> damage)
 {
     proto_util.writeUInt(msdata, skillId);
     PDamage.writeLoop(msdata, damage);
 }
Exemplo n.º 6
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);
        }
Exemplo n.º 7
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);
        }