public void Init(int id, AbsRoleModel userDto) { this.id = id; state = AnimState.Idle; list = null; UserDto = userDto; speed = userDto.speed; }
void GetValue(UserToken token, int userid, int skill, ref AbsRoleModel att, ref AbsRoleModel target, ref List <int[]> damages) { int attValue = att.attack; int attArmour = att.armour; int attCrit = att.crit; int targetDef = target.def; int targetExeCrit = target.exemptCrit; //if (userid >= 0)//攻击者为真人 //{ // UserDTO userDto = (UserDTO)att; // for (int i = 0; i < userDto.equips.Length; i++) // { // if (userDto.equips[i] > 0)//获取拥有的装备,加上装备的属性 // { // InventoryItemDTO itemDto= inventoryBiz.GetItem(userDto.equips[i]); // if (itemDto != null) // { // attValue += itemDto.attack; // attArmour += itemDto.armour; // attCrit += itemDto.crit; // } // } // } //} //if (target.id >= 0)//被攻击者为真人 //{ // UserDTO targetDto = (UserDTO)target; // for (int i = 0; i < targetDto.equips.Length; i++) // { // if (targetDto.equips[i] > 0)//获取拥有的装备,加上装备的属性 // { // InventoryItemDTO itemDto = inventoryBiz.GetItem(targetDto.equips[i]); // targetDef += itemDto.def; // targetExeCrit += itemDto.exemptCrit; // } // } //} if (skill > 0)//若此伤害为技能伤害 { List <SkillDTO> skillDtos = skillBiz.GetSkillList(token); for (int i = 0; i < skillDtos.Count; i++) { if (skillDtos[i].id == skill)//获取对应的技能伤害加成 { attValue = (int)(attValue * ((float)skillDtos[i].applyValue / 100)); break; } } } int value = (attValue - (targetDef - attArmour > 0 ? targetDef - attArmour : 0)); int crit = 0;//是否暴击,0为没有,1为有触发暴击 Random random = new Random(DateTime.Now.Millisecond); if (random.Next(1, 100) < (attCrit - targetExeCrit > 0 ? attCrit - targetExeCrit : 0)) { value *= 2; crit = 1; } target.hp -= value; if (target.id >= 0)//被攻击者为真人则更新被攻击者数据 { USER user = userCache.GetUserById(target.id); user.Hp = target.hp; } damages.Add(new[] { target.id, value, target.hp <= 0 ? 0 : 1, crit });//0为被攻击者id,1为收到伤害的值,2被攻击者是否死亡,3是否触发暴击 }
void Damage(UserToken token, DamageDTO damageDto) { int userId = userCache.GetUserId(token); AbsRoleModel attRoleModel = GetRoleModel(userId);; damageDto.userid = userId; List <int[]> damages = new List <int[]>(); for (int i = 0; i < damageDto.targets.Length; i++) { AbsRoleModel targetRoleModel = GetRoleModel(damageDto.targets[i][0]); GetValue(token, userId, damageDto.skill, ref attRoleModel, ref targetRoleModel, ref damages); if (targetRoleModel.hp <= 0) { string kill = ""; ExecutorPool.Instance.Executor(delegate { // ReSharper disable once ReturnValueOfPureMethodIsNotUsed if (random.Next(0, 11) > 4) { int index = random.Next(0, inventorys.Length - 1); InventoryItemDTO itemDto = inventoryBiz.AddInventory(token, inventorys[index]); Write(token, Protocol.Inventory, GetArea(), InventoryProtocol.AddInventory_SRES, itemDto); kill = "并且获得斩杀奖励【" + itemDto.inventory.name + "】,别的小伙伴请继续努力!"; } });//随机掉物品 targetRoleModel.hp = 0; TalkDTO talkDto = new TalkDTO(); talkDto.userid = -1; talkDto.talkType = TalkType.System; talkDto.userName = "******"; talkDto.text = attRoleModel.name + "杀死了" + targetRoleModel.name + "!" + kill; Brocast(MapProtocol.Talk_BRO, talkDto);//广播信息 UserDTO attUserDto = attRoleModel as UserDTO; USER attUser = userCache.GetUserById(targetRoleModel.id); if (attUserDto != null) { attUser.Money += attUser.Level * 100; attUserDto.money += attUserDto.level * 100; attUserDto.exp += 30 * (targetRoleModel.level / attUserDto.level) + attUserDto.level * 5; attUser.Exp += 30 * (targetRoleModel.level / attUserDto.level) + attUserDto.level * 5; int total_exp = 100 + attUser.Level * 30; while (attUser.Exp >= total_exp) { // 升级 attUser.Level++; attUserDto.level++; attUser.Exp -= total_exp; attUserDto.exp = attUser.Exp; attUser.Hp += attUser.Level * 50; attUser.MaxHp += attUser.Level * 50; attUser.Mp += attUser.Level * 25; attUser.MaxMp += attUser.Level * 25; attUserDto.hp += attUserDto.level * 50; attUserDto.maxHp += attUserDto.level * 50; attUserDto.mp += attUserDto.level * 25; attUserDto.maxMp += attUserDto.level * 25; total_exp = 100 + attUser.Level * 30; } Brocast(MapProtocol.Killraward_BRO, attUserDto);//广播杀人 } if (targetRoleModel.id >= 0) { // 开启计时任务复活 int timeEventId = ScheduleUtil.Instance.Schedule(delegate { UserDTO userDto = targetRoleModel as UserDTO; userDto.hp = (int)(userDto.maxHp * 0.5f); userDto.mp = (int)(userDto.maxMp * 0.5f); USER user = userCache.GetUserById(targetRoleModel.id); user.Hp = (int)(user.MaxHp * 0.5); user.Mp = (int)(user.MaxMp * 0.5); Brocast(MapProtocol.Revive_BRO, targetRoleModel.id); }, 10);//10秒后复活玩家 } else { //TODO 击杀NPC移除NPC数据 } } } damageDto.targets = damages.ToArray(); Brocast(MapProtocol.Damage_BRO, damageDto); }