Esempio n. 1
0
 public void Init(int id, AbsRoleModel userDto)
 {
     this.id = id;
     state   = AnimState.Idle;
     list    = null;
     UserDto = userDto;
     speed   = userDto.speed;
 }
Esempio n. 2
0
        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是否触发暴击
        }
Esempio n. 3
0
        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);
        }