示例#1
0
        private void TryTriggerSkills(GameClient client, long nowTicks, SkillTriggerTypes type)
        {
            //LogManager.WriteLog(LogTypes.Error, string.Format("-------------------petSkill begin ---------- 触发类型={0}", type.ToString()));
            lock (mutex)
            {
                foreach (var data in passiveSkillList.Values)
                {
                    if (data.triggerType == (int)type)
                    {
                        //触发间隔
                        long spanTicks;
                        bool b = _spanTimeDict.TryGetValue(data.skillId, out spanTicks);
                        //LogManager.WriteLog(LogTypes.Error, string.Format("-------------------petSkill --1-- {0} spanTime={1} nowTime={2} span={3}", data.skillId,spanTicks, nowTicks, spanTicks - nowTicks));
                        if (b && spanTicks > nowTicks)
                        {
                            continue;
                        }

                        //先判断触发概率
                        int rnd = Global.GetRandomNumber(0, 100);
                        //LogManager.WriteLog(LogTypes.Error, string.Format("-------------------petSkill --2-- {0} 概率={1} 随机数={2} 触发={3}", data.skillId, data.triggerRate, rnd, rnd - data.triggerRate < 0));
                        if (rnd >= data.triggerRate)
                        {
                            continue;
                        }

                        //技能cd时间
                        long coolDownTicks;
                        b = coolDownDict.TryGetValue(data.skillId, out coolDownTicks);
                        //if (coolDownDict.TryGetValue(data.skillId, out coolDownTicks) && coolDownTicks > nowTicks) continue;
                        //LogManager.WriteLog(LogTypes.Error, string.Format("-------------------petSkill --3-- {0} coolTime={1} nowTime={2} cd={3}", data.skillId, coolDownTicks, nowTicks, coolDownTicks - nowTicks));
                        if (b && coolDownTicks > nowTicks)
                        {
                            continue;
                        }


                        coolDownDict[data.skillId]  = nowTicks + data.coolDown * 1000;
                        _spanTimeDict[data.skillId] = nowTicks + data.triggerCD * 1000;

                        //LogManager.WriteLog(LogTypes.Error, string.Format("-------------------petSkill --4-- {0} coolTime={1} spanTime={2}", data.skillId, data.coolDown, data.triggerCD));
                        int posX = client.ClientData.PosX;
                        int posY = client.ClientData.PosY;
                        SpriteAttack.AddDelayMagic(client, client.ClientData.RoleID, posX, posY, posX, posY, data.skillId);
                        EventLogManager.AddRoleSkillEvent(client, SkillLogTypes.PassiveSkillTrigger, LogRecordType.IntValue2, data.skillId, data.skillLevel, data.triggerRate, rnd, data.coolDown);
                    }
                }
            }

            //LogManager.WriteLog(LogTypes.Error, string.Format("-------------------petSkill end ----------"));
        }
示例#2
0
 private void TryTriggerSkills(GameClient client, long nowTicks, SkillTriggerTypes type)
 {
     lock (this.mutex)
     {
         foreach (PassiveSkillData data in this.passiveSkillList.Values)
         {
             if (data.triggerType == (int)type)
             {
                 long spanTicks;
                 bool b = this._spanTimeDict.TryGetValue(data.skillId, out spanTicks);
                 if (!b || spanTicks <= nowTicks)
                 {
                     int rnd = Global.GetRandomNumber(0, 100);
                     if (rnd < data.triggerRate)
                     {
                         long coolDownTicks;
                         b = this.coolDownDict.TryGetValue(data.skillId, out coolDownTicks);
                         if (!b || coolDownTicks <= nowTicks)
                         {
                             this.coolDownDict[data.skillId]  = nowTicks + (long)(data.coolDown * 1000);
                             this._spanTimeDict[data.skillId] = nowTicks + (long)(data.triggerCD * 1000);
                             int posX = client.ClientData.PosX;
                             int posY = client.ClientData.PosY;
                             SpriteAttack.AddDelayMagic(client, client.ClientData.RoleID, posX, posY, posX, posY, data.skillId);
                             EventLogManager.AddRoleSkillEvent(client, SkillLogTypes.PassiveSkillTrigger, LogRecordType.IntValue2, new object[]
                             {
                                 data.skillId,
                                 data.skillLevel,
                                 data.triggerRate,
                                 rnd,
                                 data.coolDown
                             });
                         }
                     }
                 }
             }
         }
     }
 }
示例#3
0
        /// <summary>
        /// 帧更新(FSM调用)
        /// </summary>
        /// <param name="now"></param>
        public void onUpdate(long ticks)
        {
            if (ticks < benginCombatTime)
            {
                return;
            }

            //“我”已经死亡就不能继续战斗了
            if (owner.VLife <= 0)
            {
                owner.MyMagicsManyTimeDmageQueue.Clear();

                //切换到死亡状态
                FSM.switchState(AIState.DEAD);
                return;
            }

            // 冻结状态 [XSea 2015/6/17]
            if (owner.IsMonsterDongJie())
            {
                return;
            }

            //执行多段攻击的操作 触发伤害
            if (GameManager.FlagManyAttackOp)
            {
                SpriteAttack.ExecMagicsManyTimeDmageQueueEx(owner);
            }
            else
            {
                SpriteAttack.ExecMagicsManyTimeDmageQueue(owner);
            }

            //如果目标无效,则返回
            if (null == target)
            {
                FSM.switchState(AIState.RETURN);
                return;
            }

            //如果目标死亡,切换到脱战状态
            if (target.ClientData.CurrentLifeV <= 0)
            {
                FSM.switchState(AIState.RETURN);
                return;
            }

            //打击帧模拟
            if (castSimulateEndTime > 0)
            {
                if (ticks > castSimulateEndTime)
                {
                    castSimulateEndTime = 0;

                    int _direction = 0;

                    if (this.testAttackDistance(out _direction))
                    {
                        owner.Direction = _direction;

                        //只伤害计算 并未触发
                        if (GameManager.FlagManyAttack)
                        {
                            SpriteAttack.ProcessAttackByJingJiRobot(owner, target, skillId);
                        }
                        else
                        {
                            SpriteAttack.ProcessAttackByJingJiRobot(owner, target, skillId, 0);
                        }
                    }
                }
            }

            //吟唱模拟
            if (simulateEndTime > 0)
            {
                //吟唱模拟结束,在下一帧继续进行进攻
                if (ticks >= simulateEndTime)
                {
                    simulateEndTime = 0;

                    // 获取上一个技能是否有二段技能 [XSea 2015/6/13]
                    int nNextSkillID = Global.GetNextSkillID(skillId);
                    // 如果没有二段技能
                    if (nNextSkillID <= 0)
                    {
                        if (isCombatCD)
                        {
                            changeAction(GActions.Stand);

                            skillSpellCDTime = ticks + 500;
                        }
                    }
                }
                //模拟没有结束,继续吟唱
                return;
            }

            if (skillSpellCDTime > 0 && ticks < skillSpellCDTime)
            {
                return;
            }
            else if (skillSpellCDTime > 0 && ticks >= skillSpellCDTime)
            {
                skillSpellCDTime = 0;
                return;
            }

            if (isUseFiveComboSkill)
            {
                selectFiveComboSkill();
            }
            else
            {
                bool isFiveCombo; // 是否为普攻五连击

                //选择可用的技能
                selectSkill(out isFiveCombo);
                if (skillId == -1)
                {
                    return;
                }

                if (isFiveCombo)
                {
                    isCombatCD          = false;
                    isUseFiveComboSkill = true;
                    return;
                }
                else
                {
                    isCombatCD = true;
                }
            }

            int direction = 0;

            //距离不够,向目标移动帧速度单位距离
            if (!testAttackDistance(out direction))
            {
                moveTo(ticks);
                return;
            }
            else
            {
                if (owner.Action == GActions.Run)
                {
                    owner.Direction = (int)Global.GetDirectionByAspect((int)target.CurrentPos.X, (int)target.CurrentPos.Y, (int)owner.CurrentPos.X, (int)owner.CurrentPos.Y);
                    changeAction(GActions.Stand);
                }
            }

            //实施攻击 通知客户端播动作
            attack(direction);
        }
示例#4
0
 public void onUpdate(long ticks)
 {
     if (ticks >= this.benginCombatTime)
     {
         if (this.owner.VLife <= 0.0)
         {
             this.owner.MyMagicsManyTimeDmageQueue.Clear();
             this.FSM.switchState(AIState.DEAD);
         }
         else if (!this.owner.IsMonsterDongJie())
         {
             SpriteAttack.ExecMagicsManyTimeDmageQueueEx(this.owner);
             if (null == this.target)
             {
                 this.FSM.switchState(AIState.RETURN);
             }
             else if (this.target.ClientData.CurrentLifeV <= 0)
             {
                 this.FSM.switchState(AIState.RETURN);
             }
             else
             {
                 if (this.castSimulateEndTime > 0L)
                 {
                     if (ticks > this.castSimulateEndTime)
                     {
                         this.castSimulateEndTime = 0L;
                         int _direction = 0;
                         if (this.testAttackDistance(out _direction))
                         {
                             this.owner.Direction = (double)_direction;
                             SpriteAttack.ProcessAttackByJingJiRobot(this.owner, this.target, this.skillId, -1, 1.0);
                         }
                     }
                 }
                 if (this.simulateEndTime > 0L)
                 {
                     if (ticks >= this.simulateEndTime)
                     {
                         this.simulateEndTime = 0L;
                         int nNextSkillID = Global.GetNextSkillID(this.skillId);
                         if (nNextSkillID <= 0)
                         {
                             if (this.isCombatCD)
                             {
                                 this.changeAction(GActions.Stand);
                                 this.skillSpellCDTime = ticks + 500L;
                             }
                         }
                     }
                 }
                 else if (this.skillSpellCDTime <= 0L || ticks >= this.skillSpellCDTime)
                 {
                     if (this.skillSpellCDTime > 0L && ticks >= this.skillSpellCDTime)
                     {
                         this.skillSpellCDTime = 0L;
                     }
                     else
                     {
                         if (this.isUseFiveComboSkill)
                         {
                             this.selectFiveComboSkill();
                         }
                         else
                         {
                             bool isFiveCombo;
                             this.selectSkill(out isFiveCombo);
                             if (this.skillId == -1)
                             {
                                 return;
                             }
                             if (isFiveCombo)
                             {
                                 this.isCombatCD          = false;
                                 this.isUseFiveComboSkill = true;
                                 return;
                             }
                             this.isCombatCD = true;
                         }
                         int direction = 0;
                         if (!this.testAttackDistance(out direction))
                         {
                             this.moveTo(ticks);
                         }
                         else
                         {
                             if (this.owner.Action == GActions.Run)
                             {
                                 this.owner.Direction = (double)((int)Global.GetDirectionByAspect((int)this.target.CurrentPos.X, (int)this.target.CurrentPos.Y, (int)this.owner.CurrentPos.X, (int)this.owner.CurrentPos.Y));
                                 this.changeAction(GActions.Stand);
                             }
                             this.attack(direction);
                         }
                     }
                 }
             }
         }
     }
 }