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