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); }
/// <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); }
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); }
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; }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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; } } } }
/// <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; } } } }