public void Add(BattleUnit owner, SkillBuffTableItem buffRes, SkillRandEventTableItem randEventResource, /*const*/ ref AttackerAttr buffCreaterAttr) { BattleUnitRandEvent item = new BattleUnitRandEvent(buffRes, randEventResource); item.LoadScript(owner, ref buffCreaterAttr); mContainer[(int)randEventResource.triggerType].Add(item); }
public BattleUnitRandEvent(SkillBuffTableItem buffRes, SkillRandEventTableItem resource) { fromBuffRes = buffRes; cdMilliseconds = 0; randEventResource = resource; }
/// <summary> /// 当triggerType指定的事件发生时, 检查randEventContainer列表, 触发随机事件. /// </summary> /// <param name="theOther">触发事件的单位.</param> /// <param name="eventOwner">为随机事件的拥有者.</param> /// <remarks>randevent的技能效果不由任何技能发起(只可以得知该随机事件是如何被注册的)</remarks> public static void ApplyRandEvent( BattleUnit theOther, BattleUnit eventOwner, BattleUnitRandEventContainer randEventContainer, RandEventTriggerType triggerType, RandEventArg triggerArg ) { List <uint> buffNeed2Remove = new List <uint>(); List <BattleUnitRandEvent> typedContainer = randEventContainer[triggerType]; //LinkedListNode<BattleUnitRandEvent> currentNode = typedContainer.First; // SkillScript可能产生新的randevent加入容器中, 导致容器改变, 因此不能通过foreach遍历. // 获取当前指定类型的容器中的元素个数, 只遍历当前的元素(新的randevent通过AddLast加入到容器中, 因此不会被遍历到). for (int i = typedContainer.Count - 1; i >= 0; --i) { BattleUnitRandEvent randEvent = typedContainer[i]; SkillRandEventTableItem randEventRes = randEvent.randEventResource; // 检查CD. if (randEvent.cdMilliseconds != 0) { continue; } // 检查概率. if (!SkillUtilities.Random100(randEventRes.probability)) { continue; } SkillClientBehaviour.AddEffect2Object(eventOwner, randEventRes._3DEffectID, randEventRes._3DEffectBindpoint); if (randEvent.mScript != null && !randEvent.mScript.RunScript(triggerArg)) { buffNeed2Remove.Add((uint)randEvent.fromBuffRes.resID); } randEvent.cdMilliseconds = randEventRes.cdMilliseconds; } // for (int count = typedContainer.Count; count != 0; --count, currentNode = currentNode.Next) // { // // } for (int i = 0; i < buffNeed2Remove.Count; ++i) { eventOwner.RemoveSkillBuffByResID(buffNeed2Remove[i]); } /* foreach (uint id in buffNeed2Remove)*/ }
private bool checkSkillRandEvent() { DataType myName = DataType.DATA_SKILL_RAND_EVENT; IDictionaryEnumerator itr = DataManager.RandEventTable.GetEnumerator(); while (itr.MoveNext()) { SkillRandEventTableItem item = itr.Value as SkillRandEventTableItem; if (!checkParam(item.triggerType < RandEventTriggerType.Count, myName, item.resID, "触发类型")) { return(false); } if (item._3DEffectID != uint.MaxValue && !checkLink(myName, item.resID, DataType.DATA_EFFECT, item._3DEffectID)) { return(false); } if (!checkParam(item.triggerScript == SkillScriptDef.Invalid || item.triggerScript < SkillScriptDef.Count, myName, item.resID, "脚本ID")) { return(false); } SkillScript script = SkillScriptFactory.Instance.Allocate(item.triggerScript, null); if (!checkParam(script.ScriptTriggerType == item.triggerType, myName, item.resID, "触发类型", "脚本的触发类型和随机事件的触发类型不一致")) { return(false); } } // foreach (int key in DataManager.RandEventTable.Keys) // { // SkillRandEventTableItem item = DataManager.RandEventTable[key] as SkillRandEventTableItem; // if (!checkParam(item.triggerType < RandEventTriggerType.Count, myName, key, "触发类型")) // return false; // // if (item._3DEffectID != uint.MaxValue && !checkLink(myName, key, DataType.DATA_EFFECT, item._3DEffectID)) // return false; // // if (!checkParam(item.triggerScript == SkillScriptDef.Invalid || item.triggerScript < SkillScriptDef.Count, // myName, key, "脚本ID")) // return false; // // SkillScript script = SkillScriptFactory.Instance.Allocate(item.triggerScript, null); // // if (!checkParam(script.ScriptTriggerType == item.triggerType, myName, key, "触发类型", "脚本的触发类型和随机事件的触发类型不一致")) // return false; // } return(true); }
/// <summary> /// 添加randEventResourceID指定的skillrandevent资源. /// </summary> /// <param name="randEventResourceID"></param> public static ErrorCode AddRandEvent(BattleUnit owner, BattleUnitRandEventContainer randEventContainer, SkillBuffTableItem buffRes, AttackerAttr buffCreaterAttr ) { if (buffRes.randEvent == uint.MaxValue) { return(ErrorCode.Succeeded); } SkillRandEventTableItem randEventRes = DataManager.RandEventTable[buffRes.randEvent] as SkillRandEventTableItem; randEventContainer.Add(owner, buffRes, randEventRes, ref buffCreaterAttr); return(ErrorCode.Succeeded); }
public void Remove(SkillBuffTableItem buffRes, SkillEffectStopReason stopReason) { SkillRandEventTableItem randEventRes = DataManager.RandEventTable[buffRes.randEvent] as SkillRandEventTableItem; if (randEventRes == null) { return; } List <BattleUnitRandEvent> typedContainer = mContainer[(int)randEventRes.triggerType]; BattleUnitRandEvent node = typedContainer.Find(x => (x.fromBuffRes.resID == buffRes.resID && x.randEventResource.resID == randEventRes.resID)); if (node != null) { node.StopScript(stopReason); typedContainer.Remove(node); } }