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;
    }
Example #3
0
    /// <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)*/
    }
Example #4
0
    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);
    }
Example #5
0
    /// <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);
        }
    }