private void ReadXml() { skill_a3Data.itemId = XMLMgr.instance.GetSXML("skill.skill_learn_item_id", "").getUint("item_id"); List <SXML> sXMLList = XMLMgr.instance.GetSXMLList("skill.skill", ""); bool flag = sXMLList != null; if (flag) { foreach (SXML current in sXMLList) { skill_a3Data skill_a3Data = new skill_a3Data(); skill_a3Data.skill_id = current.getInt("id"); skill_a3Data.carr = current.getInt("carr"); skill_a3Data.skill_name = current.getString("name"); skill_a3Data.action_tm = current.getFloat("action_tm"); skill_a3Data.des = current.getString("descr1"); skill_a3Data.open_zhuan = current.getInt("open_zhuan"); skill_a3Data.open_lvl = current.getInt("open_lvl"); skill_a3Data.xml = current; skill_a3Data.item_num = current.getInt("item_num"); skill_a3Data.targetNum = current.getInt("target_num"); skill_a3Data.range = current.getInt("range"); skill_a3Data.skillType = current.getInt("skill_type"); skill_a3Data.skillType2 = current.getInt("skill_type2"); skill_a3Data.max_lvl = current.GetNodeList("skill_att", "").Count; skill_a3Data.eff_last = current.getFloat("eff_last"); this.skilldic[skill_a3Data.skill_id] = skill_a3Data; bool flag2 = skill_a3Data.skill_id != 1; if (flag2) { this.skilllst.Add(skill_a3Data); } } } }
public StateMachine() { this.IsPause = false; this.currentState = null; this.previousState = null; this.globalState = null; this.proxyState = null; skill_a3Data skill_a3Data = null; int key; switch (ModelBase <PlayerModel> .getInstance().profession) { case 2: case 4: IL_6A: key = 2001; goto IL_82; case 3: key = 3001; goto IL_82; case 5: key = 5001; goto IL_82; } goto IL_6A; IL_82: ModelBase <Skill_a3Model> .getInstance().skilldic.TryGetValue(key, out skill_a3Data); StateAttack.MinRange = (float)skill_a3Data.range / 53.333f; }
void ReadXml() { skill_a3Data.itemId = XMLMgr.instance.GetSXML("skill.skill_learn_item_id").getUint("item_id"); List <SXML> xml = XMLMgr.instance.GetSXMLList("skill.skill"); if (xml != null) { foreach (SXML x in xml) { skill_a3Data skillinfo = new skill_a3Data(); skillinfo.skill_id = x.getInt("id"); skillinfo.carr = x.getInt("carr"); skillinfo.skill_name = x.getString("name"); skillinfo.action_tm = x.getFloat("action_tm"); skillinfo.des = x.getString("descr1"); skillinfo.open_zhuan = x.getInt("open_zhuan"); skillinfo.open_lvl = x.getInt("open_lvl"); skillinfo.xml = x; skillinfo.item_num = x.getInt("item_num"); skillinfo.targetNum = x.getInt("target_num"); skillinfo.range = x.getInt("range"); skillinfo.skillType = x.getInt("skill_type"); skillinfo.skillType2 = x.getInt("skill_type2"); skillinfo.max_lvl = x.GetNodeList("skill_att").Count; skillinfo.eff_last = x.getFloat("eff_last"); skilldic[skillinfo.skill_id] = skillinfo; if (skillinfo.skill_id != 1) { skilllst.Add(skillinfo); } } } }
public override void Execute(float delta_time) { timer += delta_time; if (timer < 0.1f) { return; } timer -= 1.0f; if (TargetLost || Vector3.Distance(startPos, SelfRole._inst.m_curModel.position) > StateInit.Instance.PKDistance || Enemy.isDead) {//!--超出追击距离,返回最近的挂机点 Vector3 backpt = StateInit.Instance.GetNearestWayPoint(); StateAutoMoveToPos.Instance.pos = backpt; StateAutoMoveToPos.Instance.stopdistance = 2.0f; SelfRole.fsm.ChangeState(StateAutoMoveToPos.Instance); return; } //!--获取可以使用的技能,并检查攻击距离 int skid = StateInit.Instance.GetSkillCanUse(); skill_a3Data skdata = null; Skill_a3Model.getInstance().skilldic.TryGetValue(skid, out skdata); float range = skdata.range / GameConstant.PIXEL_TRANS_UNITYPOS; TargetLost = Enemy.m_curModel == null; float enemyDis = Vector3.Distance(Enemy.m_curModel.position, SelfRole._inst.m_curModel.position); if (enemyDis > range) { SelfRole._inst.m_moveAgent.destination = Enemy.m_curModel.position; SelfRole._inst.m_moveAgent.stoppingDistance = range - 0.125f; SelfRole._inst.m_curAni.SetBool(EnumAni.ANI_RUN, true); } else { SelfRole._inst.m_moveAgent.Stop(); SelfRole._inst.m_curAni.SetBool(EnumAni.ANI_RUN, false); SelfRole._inst.TurnToRole(Enemy, true); bool ret = a1_gamejoy.inst_skillbar.playSkillById(skid); if (ret == true && StateInit.Instance.PreferedSkill == skid) { StateInit.Instance.PreferedSkill = -1; } } }
public override void Execute(float delta_time) { this.timer += delta_time; bool flag = this.timer < 0.1f; if (!flag) { this.timer -= 1f; bool flag2 = this.TargetLost || Vector3.Distance(this.startPos, SelfRole._inst.m_curModel.position) > StateInit.Instance.PKDistance || this.Enemy.isDead; if (flag2) { Vector3 nearestWayPoint = StateInit.Instance.GetNearestWayPoint(); StateAutoMoveToPos.Instance.pos = nearestWayPoint; StateAutoMoveToPos.Instance.stopdistance = 2f; SelfRole.fsm.ChangeState(StateAutoMoveToPos.Instance); } else { int skillCanUse = StateInit.Instance.GetSkillCanUse(); skill_a3Data skill_a3Data = null; ModelBase <Skill_a3Model> .getInstance().skilldic.TryGetValue(skillCanUse, out skill_a3Data); float num = (float)skill_a3Data.range / 53.333f; this.TargetLost = (this.Enemy.m_curModel == null); float num2 = Vector3.Distance(this.Enemy.m_curModel.position, SelfRole._inst.m_curModel.position); bool flag3 = num2 > num; if (flag3) { SelfRole._inst.m_moveAgent.destination = this.Enemy.m_curModel.position; SelfRole._inst.m_moveAgent.stoppingDistance = num - 0.125f; SelfRole._inst.m_curAni.SetBool(EnumAni.ANI_RUN, true); } else { SelfRole._inst.m_moveAgent.Stop(); SelfRole._inst.m_curAni.SetBool(EnumAni.ANI_RUN, false); SelfRole._inst.TurnToRole(this.Enemy, true); bool flag4 = skillbar.instance.playSkillById(skillCanUse, false); bool flag5 = flag4 && StateInit.Instance.PreferedSkill == skillCanUse; if (flag5) { StateInit.Instance.PreferedSkill = -1; } } } } }
// --<自动战斗> 玩家是否正在返回途中 //private bool isReturning; public StateMachine() { IsPause = false; currentState = null; previousState = null; globalState = null; proxyState = null; skill_a3Data skdata = null; int skid = -1; switch (PlayerModel.getInstance().profession) { default: case 2: skid = 2001; break; case 3: skid = 3001; break; case 5: skid = 5001; break; } Skill_a3Model.getInstance().skilldic.TryGetValue(skid, out skdata); StateAttack.MinRange = skdata.range / GameConstant.PIXEL_TRANS_UNITYPOS; }
public bool CheckSkillLevelupAvailable() { int num = 0; List <int> list = new List <int>(this.skilldic.Keys); for (int i = 0; i < list.Count; i++) { bool flag = this.skilldic[list[i]].now_lv <= 0; if (!flag) { bool flag2 = this.skilldic[list[i]].now_lv < this.skilldic[list[i]].max_lvl; if (flag2) { num = Mathf.Max(num, this.skilldic[list[i]].max_lvl - this.skilldic[list[i]].now_lv); } } } int num2 = Mathf.Min(this.GetCheckCount(10), num); bool result; for (int j = 0; j < list.Count; j++) { int num3 = 0; int num4 = 0; bool flag3 = false; int k; for (k = 0; k < num2; k++) { skill_a3Data expr_10B = this.skilldic[list[j]]; bool flag4 = ((expr_10B != null) ? expr_10B.xml : null) == null || this.skilldic[list[j]].xml.m_dAtttr.ContainsKey("normal_skill"); if (flag4) { break; } bool flag5 = ModelBase <PlayerModel> .getInstance().profession == this.skilldic[list[j]].carr; if (flag5) { bool flag6 = this.skilldic[list[j]].now_lv <= 0; if (flag6) { break; } bool flag7 = this.skilldic[list[j]].now_lv + k < this.skilldic[list[j]].max_lvl; if (!flag7) { break; } int @int = this.skilldic[list[j]].xml.GetNode("skill_att", "skill_lv==" + (this.skilldic[list[j]].now_lv + 1 + k)).getInt("open_zhuan"); bool flag8 = (ulong)ModelBase <PlayerModel> .getInstance().up_lvl >= (ulong)((long)@int); if (!flag8) { break; } int int2 = this.skilldic[list[j]].xml.GetNode("skill_att", "skill_lv==" + (this.skilldic[list[j]].now_lv + 1 + k)).getInt("open_lvl"); bool flag9 = (ulong)ModelBase <PlayerModel> .getInstance().lvl >= (ulong)((long)int2); if (!flag9) { break; } num3 += this.skilldic[list[j]].xml.GetNode("skill_att", "skill_lv==" + (this.skilldic[list[j]].now_lv + 1 + k)).getInt("money"); num4 += this.skilldic[list[j]].xml.GetNode("skill_att", "skill_lv==" + (this.skilldic[list[j]].now_lv + 1 + k)).getInt("item_num"); flag3 = (ModelBase <a3_BagModel> .getInstance().getItemNumByTpid(skill_a3Data.itemId) >= num4 && (ulong)ModelBase <PlayerModel> .getInstance().money >= (ulong)((long)num3)); } } bool flag10 = k == num2 & flag3; if (flag10) { result = true; return(result); } } result = false; return(result); }
public int GetSkillCanUse() { bool flag = this.PreferedSkill != -1; int result; if (flag) { long curServerTimeStampMS = muNetCleint.instance.CurServerTimeStampMS; bool flag2 = curServerTimeStampMS - this.releaseTime >= 2000L; if (flag2) { this.PreferedSkill = -1; } else { skill_a3Data skill_a3Data = ModelBase <Skill_a3Model> .getInstance().skilldic[this.PreferedSkill]; bool flag3 = skill_a3Data.mp <= ModelBase <PlayerModel> .getInstance().mp&& skill_a3Data.cdTime <= 0; if (flag3) { result = this.PreferedSkill; return(result); } } } List <int> list = ModelBase <AutoPlayModel> .getInstance().Skills.ToList <int>(); foreach (skill_a3Data current in ModelBase <Skill_a3Model> .getInstance().skilldic.Values) { bool flag4 = current.carr == ModelBase <PlayerModel> .getInstance().profession&& current.skill_id != skillbar.NORNAL_SKILL_ID && current.now_lv != 0 && current.skillType2 == 1 && current.mp <= ModelBase <PlayerModel> .getInstance().mp&& current.cdTime <= 0; if (flag4) { result = current.skill_id; return(result); } } for (int i = 0; i < list.Count; i++) { for (int j = i; j < list.Count; j++) { bool flag5 = ModelBase <Skill_a3Model> .getInstance().skilldic.ContainsKey(list[i]) && ModelBase <Skill_a3Model> .getInstance().skilldic.ContainsKey(list[j]); if (flag5) { bool flag6 = ModelBase <Skill_a3Model> .getInstance().skilldic[list[i]].cd > ModelBase <Skill_a3Model> .getInstance().skilldic[list[j]].cd; if (flag6) { int value = list[i]; list[i] = list[j]; list[j] = value; } } } } for (int k = list.Count - 1; k >= 0; k--) { bool flag7 = list[k] == 0; if (!flag7) { int num = list[k]; skill_a3Data skill_a3Data2 = ModelBase <Skill_a3Model> .getInstance().skilldic[num]; bool flag8 = skill_a3Data2.mp > ModelBase <PlayerModel> .getInstance().mp || skill_a3Data2.cdTime > 0; if (!flag8) { result = num; return(result); } } } result = skillbar.NORNAL_SKILL_ID; return(result); }
public override void Execute(float delta_time) { //exe_action_tm += delta_time; //Debug.LogError(string.Format("当前时间:{0},技能开始时间:{1},时间间隔:{2},技能的执行时间:{3}", muNetCleint.instance.CurServerTimeStamp, exe_action_tm, muNetCleint.instance.CurServerTimeStamp - exe_action_tm, xml_action_tm)); if (muNetCleint.instance.CurServerTimeStamp - exe_action_tm < xml_action_tm || SelfRole._inst.isPlayingSkill) { return; } if (mon > 0) //每击杀[一次](不是一只)怪物,额外触发一次拾取物品 { mon--; if (!PlayerModel.getInstance().havePet || (PlayerModel.getInstance().havePet&& PlayerModel.getInstance().last_time == 0)) { SelfRole.fsm.ChangeState(StatePick.Instance); } return; } if (SelfRole._inst.m_LockRole != null) { if (SelfRole._inst.m_LockRole is CollectRole) { SelfRole._inst.m_LockRole = null; } else if (PlayerModel.getInstance().pk_state == PK_TYPE.PK_PEACE) { if (SelfRole._inst.m_LockRole is ProfessionRole) { SelfRole._inst.m_LockRole = null; } } else if (PlayerModel.getInstance().pk_state == PK_TYPE.PK_TEAM && TeamProxy.getInstance().MyTeamData != null) { if (TeamProxy.getInstance().MyTeamData.itemTeamDataList.Exists((m) => m.cid == SelfRole._inst.m_LockRole.m_unCID)) { SelfRole._inst.m_LockRole = null; } } } //if (SelfRole._inst.m_LockRole is ProfessionRole && // SelfRole._inst.m_ePK_Type == PK_TYPE.PK_PEACE) // 玩家在和平状态下挂机,手动锁定一个玩家时 // SelfRole._inst.m_LockRole = null; if (SelfRole._inst.m_LockRole == null) { if (PlayerModel.getInstance().pk_state != PK_TYPE.PK_PEACE) { BaseRole plr = OtherPlayerMgr._inst.FindNearestEnemyOne(SelfRole._inst.m_curModel.transform.position, selector: EnemySelector, pkState: PlayerModel.getInstance().pk_state); if (plr != null) { SelfRole._inst.m_LockRole = plr; } } if (SelfRole._inst.m_LockRole == null) { //if (SelfRole._inst.m_LockRole != null /* || SelfRole._inst.m_LockRole is MonsterRole*/) SelfRole._inst.m_LockRole = MonsterMgr._inst.FindNearestMonster(SelfRole._inst.m_curModel.transform.position); MonsterRole mon = SelfRole._inst.m_LockRole as MonsterRole; try { if (PlayerModel.getInstance().task_monsterIdOnAttack.Count != 0 && !PlayerModel.getInstance().task_monsterIdOnAttack.ContainsValue(mon.monsterid)) { SelfRole._inst.m_LockRole = null; SelfRole.fsm.ChangeState(StateIdle.Instance); return; } } catch (Exception) // 玩家在"角色接受任务后开始自动战斗"时,猛点空白区域,会引发此异常 // 原因是SelfRole._inst.m_LockRole被强制置为null,导致mon未引用到实例对象 { SelfRole._inst.m_LockRole = null; SelfRole.fsm.ChangeState(StateIdle.Instance); return; } } } BaseRole target = SelfRole._inst.m_LockRole; try { Vector3 targetPosition = SelfRole._inst.m_LockRole.m_curModel.position; } catch (Exception) { SelfRole._inst.m_LockRole = null; SelfRole.fsm.RestartState(this); return; } if (target == null || target.isDead) { StateTimeover += delta_time; if (StateTimeover > 1.5f) { StateTimeover = 0f; SelfRole.fsm.MoveToOri(); return; } SelfRole._inst.m_LockRole = null; //if (BaseRoomItem.instance.dDropItem.Count != 0) // SelfRole.fsm.ChangeState(StatePick.Instance); //else // SelfRole.fsm.RestartState(this); if (BaseRoomItem.instance.dDropItem_own.Count != 0) { if (!PlayerModel.getInstance().havePet || (PlayerModel.getInstance().havePet&& PlayerModel.getInstance().last_time == 0)) { SelfRole.fsm.ChangeState(StatePick.Instance); } } else { SelfRole.fsm.RestartState(this); } return; } StateTimeover = 0; int skid = StateInit.Instance.GetSkillCanUse(); skill_a3Data skdata = null; Skill_a3Model.getInstance().skilldic.TryGetValue(skid, out skdata); float range = skdata.range / GameConstant.PIXEL_TRANS_UNITYPOS; if (skdata.skillType != 0 && Vector3.Distance(target.m_curModel.position, SelfRole._inst.m_curModel.position) > MinRange) { if (range < Vector3.Distance(SelfRole._inst.m_curModel.position, target.m_curModel.position)) { StateAutoMoveToPos.Instance.stopdistance = 2.0f; StateAutoMoveToPos.Instance.pos = SelfRole._inst.m_LockRole.m_curModel.position; SelfRole.fsm.ChangeState(StateAutoMoveToPos.Instance); return; } } SelfRole._inst.TurnToPos(SelfRole._inst.m_LockRole.m_curModel.position); exe_action_tm = muNetCleint.instance.CurServerTimeStamp; switch (skid) { case 2001: case 3001: case 4001: case 5001: xml_action_tm = 0; break; default: xml_action_tm = skdata.action_tm * 0.1f; break; } bool ret = a1_gamejoy.inst_skillbar.playSkillById(skid); if (ret) { if (StateInit.Instance.PreferedSkill == skid) { StateInit.Instance.PreferedSkill = -1; } } else { xml_action_tm = 0f; } }
//!--获取可以使用的技能ID public int GetSkillCanUse() { if (PreferedSkill != -1) { long curtime = muNetCleint.instance.CurServerTimeStampMS; if (curtime - releaseTime >= 2000) { PreferedSkill = -1; } else { skill_a3Data skdata = Skill_a3Model.getInstance().skilldic[PreferedSkill]; if (skdata.mp <= PlayerModel.getInstance().mp&& skdata.cdTime <= 0) { return(PreferedSkill); } } } //List<int> skils=new List<int>(); //foreach (skill_a3Data skillInfo in Skill_a3Model.getInstance().skilllst) { // if (skillInfo.now_lv > 0 && skillInfo.skillType2 == 0) // skils.Add(skillInfo.skill_id); //} List <int> skils = new List <int>(); List <int> allSkils = AutoPlayModel.getInstance().Skills.ToList(); for (int i = 0; i < allSkils.Count; i++) { if (Skill_a3Model.getInstance().skilldic.ContainsKey(allSkils[i])) { if (Skill_a3Model.getInstance().skilldic[allSkils[i]].skillType2 <= 1) { skils.Add(allSkils[i]); } } } int skid = -1; //优先使用buff技能,buff技能不配置在挂机技能组。(现在去掉了) // foreach (skill_a3Data sk in Skill_a3Model.getInstance().skilldic.Values) { // if (sk.carr == PlayerModel.getInstance().profession && // sk.skill_id != a1_gamejoy.NORNAL_SKILL_ID && // sk.now_lv != 0 && // sk.skillType2 == 1 && // sk.mp <= PlayerModel.getInstance().mp && // sk.cdTime <= 0 // ) { // return sk.skill_id; // } //} //选择的技能按cd从长到短排序 for (int i = 0; i < skils.Count; i++) { for (int j = i; j < skils.Count; j++) { //if (Skill_a3Model.getInstance().skilldic.ContainsKey(skils[i]) && Skill_a3Model.getInstance().skilldic.ContainsKey(skils[j])) //{ if (Skill_a3Model.getInstance().skilldic[skils[i]].cd > Skill_a3Model.getInstance().skilldic[skils[j]].cd) { int temp = skils[i]; skils[i] = skils[j]; skils[j] = temp; } //} } } for (int i = skils.Count - 1; i >= 0; i--) { if (skils[i] == 0) { continue; } skid = skils[i]; skill_a3Data skdata = Skill_a3Model.getInstance().skilldic[skid]; if (skdata.mp > PlayerModel.getInstance().mp || skdata.cdTime > 0) { continue; } return(skid); } return(a1_gamejoy.NORNAL_SKILL_ID); }