Esempio n. 1
0
        void damage(NetFrame.UserToken token, DamageDTO value)
        {
            int           userID = getUserID(token);
            AbsFightModel atkModel;
            int           skillLevel = 0;

            //判断攻击者
            if (value.userId >= 0)
            {
                if (value.userId != userID)
                {
                    return;
                }
                atkModel = getPlayer(userID);
                if (value.skill > 0)
                {
                    skillLevel = (atkModel as FightPlayerModel).SkillLevel(value.skill);
                    if (skillLevel == -1)
                    {
                        return;
                    }
                }
            }
            else
            {
                atkModel = getPlayer(userID);
            }
            //TODO
            //获取技能算法
            //循环获取目标数据 和攻击者数据 进行伤害计算 得出伤害数值
            if (!SkillProcessMap.has(value.skill))
            {
                return;
            }
            ISkill       skill   = SkillProcessMap.get(value.skill);
            List <int[]> damages = new List <int[]>();

            foreach (int[] item in value.target)
            {
                AbsFightModel target = getPlayer(item[0]);
                skill.damage(skillLevel, ref atkModel, ref target, ref damages);
                //Console.WriteLine("计算伤害值");
                if (target.hp == 0)
                {
                    switch (target.type)
                    {
                    case ModelType.HUMAN:
                        if (target.id > 0)
                        {
                            //击杀英雄
                            //启动定时任务 指定时间之后发送英雄复活信息 并且将英雄数据设置为满状态
                        }
                        else
                        {
                            //击杀小兵
                            //移除小兵数据
                        }
                        break;

                    case ModelType.BUILD:
                        //打破了建筑 给钱
                        break;
                    }
                }
            }
            value.target = damages.ToArray();
            brocast(FightProtocol.DAMAGE_BRO, value);
        }
Esempio n. 2
0
        /// <summary>
        /// 计算伤害、存储结果、并向客户端发送消息
        /// </summary>
        /// <param name="token"></param>
        /// <param name="damageDTO"></param>
        private void Damage(UserToken token, DamageDTO damageDTO)
        {
            int userId = GetUserId(token);
            AbsFightInstance atkInstance;
            int skillLevel = 0;

            //判断攻击者是玩家英雄 还是小兵
            if (damageDTO.userId >= 0)//是英雄
            {
                if (damageDTO.userId != userId)
                {
                    return;
                }
                atkInstance = instances[userId];
                if (damageDTO.skill > 0)
                {
                    skillLevel = (atkInstance as HeroInstance).SkillLevel(damageDTO.skill);
                    if (skillLevel == -1)
                    {
                        return;
                    }
                    else
                    {
                    }
                }
            }
            else//是兵或者建筑
            {
                //TODO:
                atkInstance = instances[userId];
            }

            if (!SkillData.SkillModels.ContainsKey(damageDTO.skill))
            {
                return;
            }

            //1.获取技能方法
            ISkill       skill   = SkillProcessMap.Get(damageDTO.skill);
            List <int[]> damages = new List <int[]>();

            //2.根据技能定义,获取目标数据和攻击者数据,计算伤害值
            foreach (int[] item in damageDTO.targetDamages)
            {
                AbsFightInstance target = instances[item[0]];
                //计算伤害值并存储
                skill.Damage(skillLevel, ref atkInstance, ref target, ref damages);
                if (target.hp == 0)
                {
                    switch (target.fightModel.category)
                    {
                    case (byte)ModelType.Hero:
                        //击杀英雄
                        //奖励玩家
                        //启动定时任务 指定时间之后发送英雄复活信息 并且将英雄数据设置为满状态


                        break;

                    case (byte)ModelType.Creature:
                        //发送消息
                        //TODO 给钱、经验
                        //移除生物数据

                        break;

                    case (byte)ModelType.Building:
                        //摧毁建筑 给钱,通知进攻树变更

                        break;
                    }
                }
            }
            damageDTO.targetDamages = damages.ToArray();
            brocast(FightProtocol.DAMAGE_BRO, damageDTO);
        }
Esempio n. 3
0
        private void damage(UserToken token, DamageDTO value)
        {
            AbsFightModel  atkPlayer  = null;
            int            userId     = getUserId(token);
            int            skillLevel = 0;
            int            atkTeam    = 0;
            FightModelType atkType;

            if (value.id > 0)
            {
                if (value.id != userId)
                {
                    return;
                }
                atkPlayer = getPlayer(userId);
                if (value.skill > 0)
                {
                    skillLevel = (atkPlayer as FightPlayerModel).skillLevel(value.skill);
                    if (skillLevel == -1)
                    {
                        return;
                    }
                }
                atkTeam = getPlayerTeam(userId);
                atkType = FightModelType.HUMAN;
            }
            else
            {
                //TODO 如果ID小于0的话 则为炮塔或者小兵 需要判断目标是否为用户
                if (value.id >= -20)
                {
                    atkType = FightModelType.BUILD;
                }
                else
                {
                    atkType = FightModelType.HUMAN;
                }
            }

            if (!SkillProcessMap.has(value.skill))
            {
                return;
            }



            ISkill       skill   = SkillProcessMap.get(value.skill);
            List <int[]> damages = new List <int[]>();

            foreach (int[] item in value.targetDamage)
            {
                AbsFightModel  beatk  = null;
                int            beTeam = 0;
                FightModelType beatkType;
                if (item[0] > 0)
                {
                    beatk     = getPlayer(item[0]);
                    beTeam    = getPlayerTeam(item[0]);
                    beatkType = FightModelType.HUMAN;
                }
                else
                {
                    if (item[0] >= -20)
                    {
                        if (item[0] >= -10)
                        {
                            beatk  = teamOneBuildMap[item[0]];
                            beTeam = 1;
                        }
                        else
                        {
                            beatk  = teamTwoBuildMap[item[0]];
                            beTeam = 2;
                        }
                        beatkType = FightModelType.BUILD;
                    }
                    else
                    {
                        //TODO这里是小兵了

                        beatkType = FightModelType.HUMAN;
                    }
                }
                skill.damage(skillLevel, ref atkPlayer, ref beatk, atkType, beatkType, atkTeam == beTeam, ref damages);
                if (beatk.hp == 0)
                {
                    if (beatk.id > 0)
                    {
                        //说明是英雄 给予击杀者奖金
                    }
                    else if (beatk.id < -20)
                    {
                        //说明是小兵 给予周围辅助 辅助金
                    }
                    else
                    {
                        //说明是炮台 判断是否拥有复活能力 给予全体奖金
                    }
                }
            }
            DamageDTO dto = new DamageDTO();

            dto.id           = value.id;
            dto.skill        = value.skill;
            dto.targetDamage = damages.ToArray();
            brocast(FightProtocol.DAMAGE_BRO, dto);
        }
Esempio n. 4
0
        private void Damage(UserToken token, DamageDTO value)
        {
            int           userId = GetUserId(token);
            AbsFightModel atkModel;
            int           skillLevel = 0;

            //判断攻击者是玩家英雄 还是小兵
            if (value.UserID >= 0)
            {
                if (value.UserID != userId)
                {
                    return;
                }
                atkModel = GetPlayer(userId);
                if (value.Skill > 0)
                {
                    skillLevel = (atkModel as FightPlayerModel).SkillLevel(value.Skill);
                    if (skillLevel == -1)
                    {
                        return;
                    }
                }
            }
            else
            {
                //TODO:
                atkModel = GetPlayer(userId);
            }
            //获取技能算法
            //循环获取目标数据 和攻击者数据 进行伤害计算 得出伤害数值
            if (!SkillProcessMap.Has(value.Skill))
            {
                return;
            }
            ISkill       skill   = SkillProcessMap.Get(value.Skill);
            List <int[]> damages = new List <int[]>();

            foreach (int[] item in value.Targets)
            {
                AbsFightModel target = GetPlayer(item[0]);
                skill.Damage(skillLevel, ref atkModel, ref target, ref damages);
                if (target.Hp == 0)
                {
                    switch (target.Type)
                    {
                    case ModelType.HUMAN:
                        if (target.Id > 0)
                        {
                            //击杀英雄
                            //启动定时任务 指定时间之后发送英雄复活信息 并且将英雄数据设置为满状态
                        }
                        else
                        {
                            //击杀小兵
                            //移除小兵数据
                        }
                        break;

                    case ModelType.BUILD:
                        //打破了建筑 给钱

                        break;
                    }
                }
            }
            value.Targets = damages.ToArray();
            Brocast(FightProtocol.DAMAGE_BRO, value);
        }