protected bool mIsInNotifyEnterTrigger = false; //< 标记是否进入触发处理,防止递归调用aa protected void NotifyEnterTrigger(sdBehaviourTrigger kCurrentBehaviourTrigger) { if (mIsInNotifyEnterTrigger) { return; } mIsInNotifyEnterTrigger = true; bool bIsAllTriggered = true; foreach (sdBehaviourTrigger kBehaviourTrigger in mBehaviourTriggerList) { if (kBehaviourTrigger.IsEnterTrigger) { if (!kBehaviourTrigger.IsTriggered) { bIsAllTriggered = false; break; } } } bool bReachMaxCount = (mMaxUseCount > 0) && (mUseCount >= mMaxUseCount); if (bIsAllTriggered && !bReachMaxCount) { ++mUseCount; EnterBehaviourEvent(); } mIsInNotifyEnterTrigger = false; }
protected bool mIsInNotifyLeaveTrigger = false; //< 标记是否进入触发处理,防止递归调用aa protected void NotifyLeaverTrigger(sdBehaviourTrigger kCurrentBehaviourTrigger) { if (mIsInNotifyLeaveTrigger) { return; } mIsInNotifyLeaveTrigger = true; bool bIsAllTriggered = true; foreach (sdBehaviourTrigger kBehaviourTrigger in mBehaviourTriggerList) { if (kBehaviourTrigger.IsLeaveTrigger) { if (!kBehaviourTrigger.IsTriggered) { bIsAllTriggered = false; break; } } } if (!bIsAllTriggered) { LeaveBehaviourEvent(); } mIsInNotifyLeaveTrigger = false; }
// 添加触发条件aa public void AddBehaviourTrigger(sdBehaviourTrigger kBehaviourTrigger) { kBehaviourTrigger.ParentBehaviourEvent = this; kBehaviourTrigger.NotifyEnterTrigger += NotifyEnterTrigger; kBehaviourTrigger.NotifyLeaveTrigger += NotifyLeaverTrigger; mBehaviourTriggerList.Add(kBehaviourTrigger); }
// 加载事件aa protected sdBehaviourEvent LoadBehaviourEvent(XmlNode kXmlNode) { XmlElement kXmlElement = (XmlElement)kXmlNode; if (kXmlElement.Name != "AIEvent") { return(null); } sdBehaviourEvent kBehaviourEvent = new sdBehaviourEvent(); kBehaviourEvent.ID = int.Parse(kXmlElement.GetAttribute("id")); kBehaviourEvent.MaxUseCount = int.Parse(kXmlElement.GetAttribute("maxtickcount")); XmlNodeList kXmlChildNodeList = kXmlNode.ChildNodes; foreach (XmlNode kXmlChildNode in kXmlChildNodeList) { XmlElement kXmlChildElement = (XmlElement)kXmlChildNode; if (kXmlChildElement.Name == "AITrigger") { sdBehaviourTrigger kBehaviourTrigger = LoadBehaviourTrigger(kXmlChildNode); if (kBehaviourTrigger != null) { kBehaviourEvent.AddBehaviourTrigger(kBehaviourTrigger); } } else if (kXmlChildElement.Name == "AIAction") { sdBehaviourAction kBehaviourAction = LoadBehaviourAction(kXmlChildNode); if (kBehaviourAction != null) { kBehaviourEvent.AddBehaviourAction(kBehaviourAction); } } else if (kXmlChildElement.Name == "AIState") { sdBehaviourState kBehaviourState = LoadBehaviourState(kXmlChildNode); if (kBehaviourState != null) { kBehaviourEvent.AddBehaviourState(kBehaviourState); } } } return(kBehaviourEvent); }
// 加载触发aa protected sdBehaviourTrigger LoadBehaviourTrigger(XmlNode kXmlNode) { XmlElement kXmlElement = (XmlElement)kXmlNode; if (kXmlElement.Name != "AITrigger") { return(null); } sdBehaviourTrigger kBehaviourTrigger = null; int iID = int.Parse(kXmlElement.GetAttribute("id")); int iUsage = int.Parse(kXmlElement.GetAttribute("usage")); if (iID == (int)EBehaviourTriggerType.enBTT_LiveState) { kBehaviourTrigger = new sdLiveBehaviourTriggerState(); kBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; } else if (iID == (int)EBehaviourTriggerType.enBTT_BattleState) { kBehaviourTrigger = new sdBattleBehaviourTriggerState(); kBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; } else if (iID == (int)EBehaviourTriggerType.enBTT_HPState) { sdHPBehaviourTriggerState kHPBehaviourTriggerState = new sdHPBehaviourTriggerState(); kHPBehaviourTriggerState.BTUType = (EBehaviourTriggerUsageType)iUsage; kHPBehaviourTriggerState.MinConditionPercent = int.Parse(kXmlElement.GetAttribute("param1")) / 10000.0f; kHPBehaviourTriggerState.MaxConditionPercent = int.Parse(kXmlElement.GetAttribute("param2")) / 10000.0f; kBehaviourTrigger = kHPBehaviourTriggerState; } else if (iID == (int)EBehaviourTriggerType.enBTT_IdleState) { kBehaviourTrigger = new sdIdleBehaviourTriggerState(); kBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; } else if (iID == (int)EBehaviourTriggerType.enBTT_TimeState) { sdTimeBehaviourTriggerState kTimeBehaviourTriggerState = new sdTimeBehaviourTriggerState(); kTimeBehaviourTriggerState.BTUType = (EBehaviourTriggerUsageType)iUsage; kTimeBehaviourTriggerState.DelayTime = int.Parse(kXmlElement.GetAttribute("param1")) / 1000.0f; kTimeBehaviourTriggerState.IntervalTime = int.Parse(kXmlElement.GetAttribute("param2")) / 1000.0f; kTimeBehaviourTriggerState.ElapseTime = int.Parse(kXmlElement.GetAttribute("param3")) / 1000.0f; kBehaviourTrigger = kTimeBehaviourTriggerState; } else if (iID == (int)EBehaviourTriggerType.enBTT_Summoned) { kBehaviourTrigger = new sdSummonedBehaviourTrigger(); kBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; } else if (iID == (int)EBehaviourTriggerType.enBTT_Killed) { kBehaviourTrigger = new sdKilledBehaviourTrigger(); kBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; } else if (iID == (int)EBehaviourTriggerType.enBTT_ChangeTarget) { kBehaviourTrigger = new sdChangeTargetBehaviourTrigger(); kBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; } else if (iID == (int)EBehaviourTriggerType.enBTT_HP) { sdHPBehaviourTrigger kHPBehaviourTrigger = new sdHPBehaviourTrigger(); kHPBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; kHPBehaviourTrigger.BHPBTCType = (EHPBehaviourTriggerCompareType)(int.Parse(kXmlElement.GetAttribute("param1"))); kHPBehaviourTrigger.ConditionPercent = int.Parse(kXmlElement.GetAttribute("param2")) / 10000.0f; kBehaviourTrigger = kHPBehaviourTrigger; } else if (iID == (int)EBehaviourTriggerType.enBTT_HurtHP) { sdHurtHPBehaviourTrigger kHurtHPBehaviourTrigger = new sdHurtHPBehaviourTrigger(); kHurtHPBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; kHurtHPBehaviourTrigger.ConditionPercent = int.Parse(kXmlElement.GetAttribute("param1")) / 10000.0f; kBehaviourTrigger = kHurtHPBehaviourTrigger; } else if (iID == (int)EBehaviourTriggerType.enBTT_AccumHurtHP) { sdAccumHurtHPBehaviourTrigger kAccumHurtHPBehaviourTrigger = new sdAccumHurtHPBehaviourTrigger(); kAccumHurtHPBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; kAccumHurtHPBehaviourTrigger.ConditionPercent = int.Parse(kXmlElement.GetAttribute("param1")) / 10000.0f; kBehaviourTrigger = kAccumHurtHPBehaviourTrigger; } else if (iID == (int)EBehaviourTriggerType.enBTT_Buff) { sdBuffBehaviourTrigger kBuffBehaviourTrigger = new sdBuffBehaviourTrigger(); kBuffBehaviourTrigger.BTUType = (EBehaviourTriggerUsageType)iUsage; kBuffBehaviourTrigger.BuffState = (HeaderProto.ECreatureActionState)(int.Parse(kXmlElement.GetAttribute("param1"))); kBehaviourTrigger = kBuffBehaviourTrigger; } return(kBehaviourTrigger); }