Пример #1
0
        FightPlayerModel create(SelectModel model)
        {
            FightPlayerModel player = new FightPlayerModel();

            player.id     = model.userId;
            player.heroId = model.heroId;
            player.name   = getUser(model.userId).name;
            player.exp    = 0;
            player.level  = 1;
            player.free   = 1;
            player.money  = 0;

            player.equs = new int[6];
            //TODO 剩余数据 需要脚本载入
            HeroDataModel data = HeroData.heroMap[model.heroId];

            player.hp     = data.hpBase;
            player.maxHp  = data.hpBase;
            player.atk    = data.atkBase;
            player.def    = data.defBase;
            player.aspeed = data.aspeed;
            player.speed  = data.speed;
            player.range  = data.range;
            player.skills = initSkill(data.skills);
            return(player);
        }
Пример #2
0
        /// <summary>
        /// 创建英雄单位
        /// </summary>
        /// <param name="model"></param>
        /// <param name="team"></param>
        /// <returns></returns>
        FightPlayerModel create(SelectModel model, int team)
        {
            FightPlayerModel player = new FightPlayerModel();

            player.id   = model.userID;
            player.code = model.hero;
            player.type = ModelType.HUMAN;
            player.name = getUserName(model.userID);

            player.exp   = 0;
            player.level = 1;
            player.free  = 1;
            player.money = 0;
            player.team  = team;
            //从配置表里 去出对应的英雄数据
            HeroDataModel data = HeroData.heroMap[model.hero];

            player.hp       = data.hpBase;
            player.maxHp    = data.hpBase;
            player.atk      = data.atkBase;
            player.def      = data.defBase;
            player.aSpeed   = data.aSpeed;
            player.speed    = data.speed;
            player.aRange   = data.range;
            player.eyeRange = data.eyeRange;
            player.skills   = initSkill(data.skills);
            player.equs     = new int[3];


            return(player);
        }
Пример #3
0
        private FightPlayerModel Create(SelectModel model, int team)
        {
            FightPlayerModel player = new FightPlayerModel();

            player.Id        = model.UserID;
            player.Code      = model.Hero;
            player.Name      = GetUser(model.UserID).Name;
            player.Exp       = 0;
            player.Level     = 1;
            player.FreePoint = 1;
            player.Mongy     = 0;
            player.Type      = ModelType.HUMAN;
            //从配置表里取出对应的英雄数据,然后计算
            HeroDataModel data = HeroData.heroMap[model.Hero];

            player.Hp        = data.HpBase;
            player.HpMax     = data.HpBase;
            player.Atk       = data.AtkBase;
            player.Def       = data.DefBase;
            player.MoveSpeed = data.MoveSpeed;
            player.AtkSpeed  = data.AtkSpeed;
            player.AtkRange  = data.AtkRange;
            player.EyeRange  = data.EyeRange;
            player.Skills    = InitSkill(data.Skills);
            player.Team      = team;

            player.Equs = new int[3];


            return(player);
        }
Пример #4
0
 public void InitView(HeroDataModel heroDataModel)
 {
     //保存ID
     this.heroID = heroDataModel.ID;
     //获取头像和声音
     heroAudioClip = ResourcesManager.Instance.GetAsset(Paths.RES_SOUND_SelectHero + heroDataModel.Name) as AudioClip;
     headSprite    = ResourcesManager.Instance.GetAsset(Paths.RES_UIHeroHead + heroDataModel.Name) as Sprite;
     //更新头像
     headImage.sprite = headSprite;
 }
Пример #5
0
        /// <summary>
        /// 获取英雄数据
        /// </summary>
        /// <param name="heroId"></param>
        /// <returns></returns>
        private HeroModel getHeroModel(SelectModel model, int team)
        {
            //先从静态配置表里面 获取到 英雄的数据
            HeroDataModel data = HeroData.GetHeroData(model.heroId);
            //英雄数据创建
            HeroModel hero = new HeroModel(model.playerId, data.TypeId, team, data.Hp, data.baseAttack, data.baseDefense, data.AttackDistance, data.Name, data.Mp, getSkillModel(data.SkillIds));

            hero.ModelType = ModelType.HERO;
            return(hero);
        }
Пример #6
0
        /// <summary>
        /// 获取英雄数据
        /// </summary>
        /// <param name="selectModel"></param>
        /// <param name="teamID"></param>
        /// <returns></returns>
        private HeroModel GetHeroModel(SelectModel selectModel, int teamID)
        {
            //先从静态配置表里面 获取到英雄的数据
            HeroDataModel heroDataModel = HeroData.GetHeroDataModel(selectModel.HeroID);
            //构建英雄数据
            HeroModel heroModel = new HeroModel(selectModel.PlayerID, heroDataModel.ID, teamID, heroDataModel.Name,
                                                heroDataModel.HP, heroDataModel.BaseAttack, heroDataModel.BaseDefense, heroDataModel.AttackDistance,
                                                heroDataModel.MP, heroDataModel.SkillID);

            return(heroModel);
        }
Пример #7
0
    /// <summary>
    /// 初始化视图
    /// </summary>
    public void InitView(HeroDataModel hero)
    {
        //保存ID
        this.HeroId   = hero.TypeId;
        this.heroName = hero.Name;
        //加载音效文件
        ResourcesManager.Instance.Load(Paths.RES_SOUND_SELECT + hero.Name, typeof(AudioClip), this);
        ResourcesManager.Instance.Load(Paths.RES_SOUND_UI + "Select", typeof(AudioClip), this);
        //更新图片
        string assetName = Paths.RES_HEAD + HeroData.GetHeroData(hero.TypeId).Name;

        ResourcesManager.Instance.Load(assetName, typeof(Sprite), this);
    }
Пример #8
0
    /// <summary>
    /// 初始化视图
    /// </summary>
    public void InitView(HeroDataModel hero)
    {
        //保存Id
        this.heroId = hero.TypeId;
        //加载音效
        this.heroName = hero.Name;
        string soundPath = Paths.RES_SOUND_SELECT + heroName;

        ResourceManager.Instance.Load(soundPath, typeof(AudioClip), this);
        //更新头像
        string path = Paths.RES_HEAD + heroName;

        ResourceManager.Instance.Load(path, typeof(Sprite), this);

        ResourceManager.Instance.Load(Paths.RES_SOUND_UI + "Select", typeof(AudioClip), this);
    }
Пример #9
0
        /// <summary>
        /// 计算伤害
        /// </summary>
        private void onDamage(MobaClient client, int attackId, int skillId, int[] targetId)
        {
            //1.获取房间模型
            int       playerid = playerCache.GetId(client);
            FightRoom room     = fightCache.GetRoom(playerid);
            //2.判断是谁攻击 谁被攻击
            //攻击者的数据模型
            DogModel attackModel = null;

            if (attackId >= 0)
            {
                //攻击者的ID大于等于0 就是英雄攻击
                attackModel = room.GetHeroModel(attackId);
            }
            else if (attackId <= -10 && attackId >= -30)
            {
                //ID为-10~-30 防御塔攻击
                attackModel = room.GetBuildModel(attackId);
            }
            else if (attackId <= -1000)
            {
                //小兵攻击
                attackModel = room.GetDogModel(attackId);
            }
            //被攻击者的数据模型
            DogModel[] targetModels = new DogModel[targetId.Length];
            for (int i = 0; i < targetId.Length; i++)
            {
                if (targetId[i] >= 0)
                {
                    //被攻击者的ID大于等于0 就是英雄被攻击
                    targetModels[i] = room.GetHeroModel(targetId[i]);
                }
                else if (targetId[i] <= -10 && targetId[i] >= -30)
                {
                    //ID为-10~-30 防御塔被攻击
                    targetModels[i] = room.GetBuildModel(targetId[i]);
                }
                else if (targetId[i] <= -1000)
                {
                    //小兵被攻击
                    targetModels[i] = room.GetDogModel(targetId[i]);
                }
            }
            //3.根据技能ID判断出 是 普通攻击 还是特殊技能
            //4.根据伤害表 根据技能id获取ISKILL 调用damage 计算伤害
            ISkill             skill   = null;
            List <DamageModel> damages = null;

            //获取skill
            skill = DamageData.GetSkill(skillId);
            //计算出伤害
            damages = skill.Damage(skillId, 0, attackModel, targetModels);
            //6.给房间内的客户端广播数据模型
            room.Brocast(OpCode.FightCode, OpFight.Damage, 0, "有伤害产生", null, JsonMapper.ToJson(damages.ToArray()));
            //结算
            foreach (DogModel item in targetModels)
            {
                if (item.CurrHp <= 0)
                {
                    switch (item.ModelType)
                    {
                    case ModelType.DOG:
                        #region 小兵
                        //如果是英雄攻击导致死亡 那么就给奖励
                        if (attackModel.Id >= 0)
                        {
                            //加钱
                            ((HeroModel)attackModel).Money += 20;
                            //加经验
                            ((HeroModel)attackModel).Exp += 20;
                            //检测是否升级
                            if (((HeroModel)attackModel).Exp > ((HeroModel)attackModel).Level * 100)
                            {
                                //升级
                                ((HeroModel)attackModel).Level++;
                                ((HeroModel)attackModel).Points++;
                                //重置经验值
                                ((HeroModel)attackModel).Exp = 0;
                                HeroDataModel data = HeroData.GetHeroData(attackModel.Id);
                                //英雄成长属性 增加
                                ((HeroModel)attackModel).Attack  += data.GrowAttack;
                                ((HeroModel)attackModel).Defense += data.GrowDefense;
                                ((HeroModel)attackModel).MaxHp   += data.GrowHp;
                                ((HeroModel)attackModel).MaxMp   += data.GrowMp;
                            }
                            //给客户端发送 这个数据模型 attackModel 客户端更新
                            room.Brocast(OpCode.FightCode, OpFight.UpdateModel, 0, "更新数据模型", null,
                                         JsonMapper.ToJson((HeroModel)attackModel));
                        }
                        //移除小兵
                        room.RemoveDog(item);
                        #endregion
                        break;

                    case ModelType.BUILD:
                        #region 建筑
                        //判断是不是英雄击杀
                        if (attackModel.Id >= 0)
                        {
                            //加钱
                            ((HeroModel)attackModel).Money += 150;
                            //给客户端发attackModel
                            room.Brocast(OpCode.FightCode, OpFight.UpdateModel, 0, "更新数据模型", null, JsonMapper.ToJson((HeroModel)attackModel));
                        }
                        //检测防御塔是否可重生
                        if (((BuildModel)item).Rebirth)
                        {
                            //开启一个定时任务 在指定的事件之后复活
                            room.StartSchedule(DateTime.UtcNow.AddSeconds((double)((BuildModel)item).RebirthTime),
                                               () =>
                            {
                                //满状态
                                ((BuildModel)item).CurrHp = ((BuildModel)item).MaxHp;
                                //给客户端发送一个复活的消息 参数 item
                                room.Brocast(OpCode.FightCode, OpFight.Resurge, 1, "有模型复活", null, JsonMapper.ToJson((BuildModel)item));
                            });
                        }
                        //不重生 直接移除数据模型
                        else
                        {
                            room.RemoveBuild((BuildModel)item);
                        }
                        //游戏结束的判断
                        if (item.Id == -10)
                        {
                            onGameOver(room, 2);
                        }
                        else if (item.Id == -20)
                        {
                            onGameOver(room, 1);
                        }
                        #endregion
                        break;

                    case ModelType.HERO:
                        #region 英雄

                        //发奖励
                        if (attackModel.Id >= 0)
                        {
                            //加杀人数
                            ((HeroModel)attackModel).Kill++;
                            //加钱
                            ((HeroModel)attackModel).Money += 300;
                            //加经验
                            ((HeroModel)attackModel).Exp += 50;
                            //检测是否升级
                            if (((HeroModel)attackModel).Exp > ((HeroModel)attackModel).Level * 100)
                            {
                                //升级
                                ((HeroModel)attackModel).Level++;
                                ((HeroModel)attackModel).Points++;
                                //重置经验值
                                ((HeroModel)attackModel).Exp = 0;
                                HeroDataModel data = HeroData.GetHeroData(attackModel.Id);
                                //英雄成长属性 增加
                                ((HeroModel)attackModel).Attack  += data.GrowAttack;
                                ((HeroModel)attackModel).Defense += data.GrowDefense;
                                ((HeroModel)attackModel).MaxHp   += data.GrowHp;
                                ((HeroModel)attackModel).MaxMp   += data.GrowMp;
                            }
                            //给客户端发送 这个数据模型 attackModel 客户端更新
                            room.Brocast(OpCode.FightCode, OpFight.UpdateModel, 0, "更新数据模型", null, JsonMapper.ToJson((HeroModel)attackModel));
                        }
                        //目标英雄死亡
                        //加死亡数
                        ((HeroModel)item).Dead++;
                        //开启一个定时任务 在指定的事件之后复活
                        room.StartSchedule(DateTime.UtcNow.AddSeconds(((HeroModel)attackModel).Level * 5),
                                           () =>
                        {
                            //满状态
                            ((HeroModel)item).CurrHp = ((HeroModel)item).MaxHp;
                            //给客户端发送一个复活的消息 参数 item
                            room.Brocast(OpCode.FightCode, OpFight.Resurge, 0, "有模型复活", null, JsonMapper.ToJson((HeroModel)item));
                        });


                        #endregion
                        break;

                    default:
                        break;
                    }
                }
            }
        }
Пример #10
0
        /// <summary>
        /// 响应伤害请求
        /// </summary>
        /// <param name="request"></param>
        private void OnDamage(MobaClient client, int attackId, int skillId, int[] targetIds)
        {
            //1、获取房间
            int       playerId = playerCache.GetId(client);
            FightRoom room     = fightCache.GetRoom(playerId, client);
            //2、谁攻击谁
            DogModel attackModel = null;

            if (attackId >= 0)
            {
                //英雄攻击
                attackModel = room.GetHeroModel(attackId);
            }
            else if (attackId <= -100 && attackId > -300)
            {
                //防御塔的攻击
                attackModel = room.GetBuildModel(attackId);
            }
            else if (attackId <= -1000)
            {
                //小兵的攻击
            }

            DogModel[] targetModels = new DogModel[targetIds.Length];
            for (int i = 0; i < targetIds.Length; i++)
            {
                int targetId = targetIds[i];
                if (targetId >= 0)
                {
                    //英雄攻击
                    targetModels[i] = room.GetHeroModel(targetId);
                }
                else if (targetId <= -100 && targetId > -300)
                {
                    //防御塔的攻击
                    targetModels[i] = room.GetBuildModel(targetId);
                }
                else if (targetId <= -1000)
                {
                    //小兵的攻击
                    targetModels[i] = room.GetDogModel(targetId);
                }
            }

            //3、根据技能id 普通攻击 特殊技能
            ISkill             skill   = null;
            List <DamageModel> damages = null;

            if (skillId == 1)
            {
                //普通攻击
                skill = DamageData.GetSkill(skillId);
                //4、根据技能id获取damage计算伤害
                damages = skill.Damage(skillId, 0, attackModel, targetModels);
                //5、检测死亡 给钱 给经验
            }
            else
            {
                //特殊技能
                skill = DamageData.GetSkill(skillId);
                //4、根据技能id获取damage计算伤害
                HeroModel  hero       = attackModel as HeroModel;
                SkillModel skillModel = hero.GetSkillModel(skillId);
                damages = skill.Damage(skillId, skillModel.Level, attackModel, targetModels);
                //5、检测死亡 给钱 给经验
            }

            //6、给房间内的客户端广播数据模型
            room.Brocast(OpCode.FightCode, OpFight.Damage, 0, "有伤害产生", null, JsonMapper.ToJson(damages.ToArray()));

            //结算
            foreach (DogModel item in targetModels)
            {
                if (item.CurrHp == 0)
                {
                    switch (item.ModelType)
                    {
                    case ModelType.HERO:

                        #region 英雄
                        if (attackModel.Id >= 0)
                        {
                            ((HeroModel)attackModel).Kill++;
                            ((HeroModel)attackModel).AddProprity(300, 50);
                            if (((HeroModel)attackModel).Exp > ((HeroModel)attackModel).Level * 100)
                            {
                                ((HeroModel)attackModel).Level++;
                                ((HeroModel)attackModel).SkillPoints++;
                                ((HeroModel)attackModel).Exp = 0;

                                HeroDataModel data = HeroData.GetHeroData(attackModel.Id);
                                ((HeroModel)attackModel).Attack  += data.GrowAttack;
                                ((HeroModel)attackModel).Defense += data.GrowDefens;
                                ((HeroModel)attackModel).MaxHp   += data.GrowHp;
                                ((HeroModel)attackModel).MaxMp   += data.GrowMp;
                            }
                            //给客户端发送数据模型 attackModel
                            room.Brocast(OpCode.FightCode, OpFight.UpdateModel, 0, "更新数据模型", null, JsonMapper.ToJson(attackModel as HeroModel));
                        }

                        //目标英雄死亡
                        ((HeroModel)item).Dead++;
                        //开启定时任务 复活
                        room.StartSchedule(DateTime.UtcNow.AddSeconds(
                                               (double)((HeroModel)item).Level * 5),
                                           () =>
                        {
                            ((HeroModel)item).CurrHp = ((HeroModel)item).MaxHp;
                            //给客户端发送复活消息
                            room.Brocast(OpCode.FightCode, OpFight.Resurge, 0, "有模型复活了", null, JsonMapper.ToJson(item as HeroModel));
                        });
                        #endregion
                        break;

                    case ModelType.BUILD:
                        #region 建筑
                        //判断是否英雄击杀
                        if (attackModel.Id >= 0)
                        {
                            ((HeroModel)attackModel).AddProprity(150, 0);
                            //给客户端发送数据模型 attackModel
                            room.Brocast(OpCode.FightCode, OpFight.UpdateModel, 0, "更新数据模型", null, JsonMapper.ToJson(attackModel as HeroModel));
                        }
                        //防御塔是否可以重生
                        if (((BuildModel)item).ReBirth)
                        {
                            //开启定时任务 复活塔
                            room.StartSchedule(DateTime.UtcNow.AddSeconds(
                                                   (double)(((BuildModel)item).ReBirthTime)),
                                               () =>
                            {
                                ((BuildModel)item).CurrHp = ((BuildModel)item).MaxHp;
                                //给客户端发送复活消息
                                room.Brocast(OpCode.FightCode, OpFight.Resurge, 1, "有模型复活了", null, JsonMapper.ToJson(item as BuildModel));
                            });
                        }
                        else
                        {
                            room.RemoveBuild((BuildModel)item);
                        }
                        //游戏结束判断
                        if (item.Id == -100)
                        {
                            //队伍2赢了
                            OnGameOver(room, 2);
                        }
                        else if (item.Id == -200)
                        {
                            //队伍1赢了
                            OnGameOver(room, 1);
                        }
                        #endregion
                        break;

                    case ModelType.DOG:
                        #region 小兵
                        //英雄攻击
                        if (attackModel.Id >= 0)
                        {
                            ((HeroModel)attackModel).AddProprity(20, 10);
                            if (((HeroModel)attackModel).Exp > ((HeroModel)attackModel).Level * 100)
                            {
                                ((HeroModel)attackModel).Level++;
                                ((HeroModel)attackModel).SkillPoints++;
                                ((HeroModel)attackModel).Exp = 0;

                                HeroDataModel data = HeroData.GetHeroData(attackModel.Id);
                                ((HeroModel)attackModel).Attack  += data.GrowAttack;
                                ((HeroModel)attackModel).Defense += data.GrowDefens;
                                ((HeroModel)attackModel).MaxHp   += data.GrowHp;
                                ((HeroModel)attackModel).MaxMp   += data.GrowMp;
                            }
                            //给客户端发送数据模型 attackModel
                            room.Brocast(OpCode.FightCode, OpFight.UpdateModel, 0, "更新数据模型", null, JsonMapper.ToJson(attackModel as HeroModel));
                        }
                        //移除小兵
                        room.RemoveDog(item);
                        #endregion
                        break;

                    default:
                        break;
                    }
                }
            }
        }