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