Ejemplo n.º 1
0
        public void processEvent(EventObject eventObject)
        {
            //System.Diagnostics.Debug.WriteLine(string.Format("Boss AI Event Listener, EventType={0}", (EventTypes)eventObject.getEventType()));

            List <BossAIItem> bossAIItemList        = null;
            Monster           monster               = null;
            GameClient        gameClient            = null;
            List <BossAIItem> allDeadBossAIItemList = null;

            List <BossAIItem> execBossAIItemList = new List <BossAIItem>();

            if (eventObject.getEventType() == (int)EventTypes.MonsterBirthOn)
            {
                monster = (eventObject as MonsterBirthOnEventObject).getMonster();
                int AIID = monster.MonsterInfo.AIID;

                if (AIID > 0)
                {
                    bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, (int)BossAITriggerTypes.BirthOn);
                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (!monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    continue; //如果不能执行,则跳过
                                }


                                monster.RecBossAI(bossAIItemList[i]);
                                execBossAIItemList.Add(bossAIItemList[i]);
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == (int)EventTypes.MonsterDead)
            {
                monster    = (eventObject as MonsterDeadEventObject).getMonster();
                gameClient = (eventObject as MonsterDeadEventObject).getAttacker();

                int AIID = monster.MonsterInfo.AIID;

                if (AIID > 0)
                {
                    bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, (int)BossAITriggerTypes.Dead);

                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (!monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    continue; //如果不能执行
                                }

                                monster.RecBossAI(bossAIItemList[i]);
                                execBossAIItemList.Add(bossAIItemList[i]);
                            }
                        }
                    }

                    allDeadBossAIItemList = BossAICachingMgr.FindCachingItem(AIID, (int)BossAITriggerTypes.DeadAll);
                    if (null != allDeadBossAIItemList)
                    {
                        for (int i = 0; i < allDeadBossAIItemList.Count; i++)
                        {
                            if (!monster.CanExecBossAI(allDeadBossAIItemList[i]))
                            {
                                continue; //如果不能执行
                            }

                            bool       toContinue    = false;
                            List <int> monsterIDList = (allDeadBossAIItemList[i].Condition as AllDeadCondition).MonsterIDList;
                            for (int j = 0; j < monsterIDList.Count; j++)
                            {
                                List <object> findMonsters = GameManager.MonsterMgr.FindMonsterByExtensionID(monster.CurrentCopyMapID, monsterIDList[j]);
                                if (findMonsters.Count > 0)
                                {
                                    toContinue = true;
                                    break;
                                }
                            }

                            if (toContinue)
                            {
                                continue;
                            }

                            monster.RecBossAI(allDeadBossAIItemList[i]);
                            execBossAIItemList.Add(allDeadBossAIItemList[i]);
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == (int)EventTypes.MonsterInjured)
            {
                monster    = (eventObject as MonsterInjuredEventObject).getMonster();
                gameClient = (eventObject as MonsterInjuredEventObject).getAttacker();

                int AIID = monster.MonsterInfo.AIID;

                if (AIID > 0)
                {
                    bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, (int)BossAITriggerTypes.Injured);

                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (!monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    continue; //如果不能执行
                                }

                                monster.RecBossAI(bossAIItemList[i]);
                                execBossAIItemList.Add(bossAIItemList[i]);
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == (int)EventTypes.MonsterAttacked)
            {
                monster = (eventObject as MonsterAttackedEventObject).getMonster();

                int AIID = monster.MonsterInfo.AIID;

                if (AIID > 0)
                {
                    bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, (int)BossAITriggerTypes.Attacked);

                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (!monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    continue; //如果不能执行
                                }

                                monster.RecBossAI(bossAIItemList[i]);
                                execBossAIItemList.Add(bossAIItemList[i]);
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == (int)EventTypes.MonsterBlooadChanged)
            {
                monster = (eventObject as MonsterBlooadChangedEventObject).getMonster();
                int AIID = monster.MonsterInfo.AIID;

                if (AIID > 0)
                {
                    bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, (int)BossAITriggerTypes.BloodChanged);

                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (!monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    continue; //如果不能执行
                                }

                                double currentLifeVPercent = monster.VLife / monster.MonsterInfo.VLifeMax;
                                bool   canExecActions      = (currentLifeVPercent >= (bossAIItemList[i].Condition as BloodChangedCondition).MinLifePercent && currentLifeVPercent <= (bossAIItemList[i].Condition as BloodChangedCondition).MaxLifePercent);

                                if (canExecActions)
                                {
                                    monster.RecBossAI(bossAIItemList[i]);
                                    execBossAIItemList.Add(bossAIItemList[i]);
                                }
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == (int)EventTypes.MonsterLivingTime)
            {
                monster = (eventObject as MonsterLivingTimeEventObject).getMonster();
                int AIID = monster.MonsterInfo.AIID;

                if (AIID > 0)
                {
                    bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, (int)BossAITriggerTypes.LivingTime);

                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (!monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    continue; //如果不能执行
                                }

                                bool canExecActions = monster.GetMonsterLivingTicks() >= ((bossAIItemList[i].Condition as LivingTimeCondition).LivingMinutes * 60 * 1000);
                                if (canExecActions)
                                {
                                    monster.RecBossAI(bossAIItemList[i]);
                                    execBossAIItemList.Add(bossAIItemList[i]);
                                }
                            }
                        }
                    }
                }
            }

            if (null != execBossAIItemList)
            {
                for (int i = 0; i < execBossAIItemList.Count; i++)
                {
                    BossAIItem             bossAIItem          = execBossAIItemList[i];
                    List <MagicActionItem> magicActionItemList = null;
                    if (GameManager.SystemMagicActionMgr.BossAIActionsDict.TryGetValue(bossAIItem.ID, out magicActionItemList) && null != magicActionItemList)
                    {
                        for (int j = 0; j < magicActionItemList.Count; j++)
                        {
                            MagicAction.ProcessAction(monster, gameClient, magicActionItemList[j].MagicActionID, magicActionItemList[j].MagicActionParams);

                            //向地图中的用户广播特殊提示信息
                            if (!string.IsNullOrEmpty(bossAIItem.Desc))
                            {
                                GameManager.ClientMgr.BroadSpecialHintText(monster.CurrentMapCode, monster.CurrentCopyMapID, bossAIItem.Desc);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void processEvent(EventObject eventObject)
        {
            Monster           monster            = null;
            GameClient        gameClient         = null;
            List <BossAIItem> execBossAIItemList = new List <BossAIItem>();

            if (eventObject.getEventType() == 16)
            {
                monster = (eventObject as MonsterBirthOnEventObject).getMonster();
                int AIID = monster.MonsterInfo.AIID;
                if (AIID > 0)
                {
                    List <BossAIItem> bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, 0);
                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    monster.RecBossAI(bossAIItemList[i]);
                                    execBossAIItemList.Add(bossAIItemList[i]);
                                }
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == 11)
            {
                monster    = (eventObject as MonsterDeadEventObject).getMonster();
                gameClient = (eventObject as MonsterDeadEventObject).getAttacker();
                int AIID = monster.MonsterInfo.AIID;
                if (AIID > 0)
                {
                    List <BossAIItem> bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, 3);
                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    monster.RecBossAI(bossAIItemList[i]);
                                    execBossAIItemList.Add(bossAIItemList[i]);
                                }
                            }
                        }
                    }
                    List <BossAIItem> allDeadBossAIItemList = BossAICachingMgr.FindCachingItem(AIID, 5);
                    if (null != allDeadBossAIItemList)
                    {
                        for (int i = 0; i < allDeadBossAIItemList.Count; i++)
                        {
                            if (monster.CanExecBossAI(allDeadBossAIItemList[i]))
                            {
                                bool       toContinue    = false;
                                List <int> monsterIDList = (allDeadBossAIItemList[i].Condition as AllDeadCondition).MonsterIDList;
                                for (int j = 0; j < monsterIDList.Count; j++)
                                {
                                    List <object> findMonsters = GameManager.MonsterMgr.FindMonsterByExtensionID(monster.CurrentCopyMapID, monsterIDList[j]);
                                    if (findMonsters.Count > 0)
                                    {
                                        toContinue = true;
                                        break;
                                    }
                                }
                                if (!toContinue)
                                {
                                    monster.RecBossAI(allDeadBossAIItemList[i]);
                                    execBossAIItemList.Add(allDeadBossAIItemList[i]);
                                }
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == 17)
            {
                monster    = (eventObject as MonsterInjuredEventObject).getMonster();
                gameClient = (eventObject as MonsterInjuredEventObject).getAttacker();
                int AIID = monster.MonsterInfo.AIID;
                if (AIID > 0)
                {
                    List <BossAIItem> bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, 2);
                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    monster.RecBossAI(bossAIItemList[i]);
                                    execBossAIItemList.Add(bossAIItemList[i]);
                                }
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == 19)
            {
                monster = (eventObject as MonsterAttackedEventObject).getMonster();
                int AIID = monster.MonsterInfo.AIID;
                if (AIID > 0)
                {
                    List <BossAIItem> bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, 4);
                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    monster.RecBossAI(bossAIItemList[i]);
                                    execBossAIItemList.Add(bossAIItemList[i]);
                                }
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == 18)
            {
                monster = (eventObject as MonsterBlooadChangedEventObject).getMonster();
                int AIID = monster.MonsterInfo.AIID;
                if (AIID > 0)
                {
                    List <BossAIItem> bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, 1);
                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    double currentLifeVPercent = monster.VLife / monster.MonsterInfo.VLifeMax;
                                    bool   canExecActions      = currentLifeVPercent >= (bossAIItemList[i].Condition as BloodChangedCondition).MinLifePercent && currentLifeVPercent <= (bossAIItemList[i].Condition as BloodChangedCondition).MaxLifePercent;
                                    if (canExecActions)
                                    {
                                        monster.RecBossAI(bossAIItemList[i]);
                                        execBossAIItemList.Add(bossAIItemList[i]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else if (eventObject.getEventType() == 20)
            {
                monster = (eventObject as MonsterLivingTimeEventObject).getMonster();
                int AIID = monster.MonsterInfo.AIID;
                if (AIID > 0)
                {
                    List <BossAIItem> bossAIItemList = BossAICachingMgr.FindCachingItem(AIID, 6);
                    if (null != bossAIItemList)
                    {
                        lock (monster.TriggerMutex)
                        {
                            for (int i = 0; i < bossAIItemList.Count; i++)
                            {
                                if (monster.CanExecBossAI(bossAIItemList[i]))
                                {
                                    bool canExecActions = monster.GetMonsterLivingTicks() >= (bossAIItemList[i].Condition as LivingTimeCondition).LivingMinutes * 60L * 1000L;
                                    if (canExecActions)
                                    {
                                        monster.RecBossAI(bossAIItemList[i]);
                                        execBossAIItemList.Add(bossAIItemList[i]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (null != execBossAIItemList)
            {
                for (int i = 0; i < execBossAIItemList.Count; i++)
                {
                    BossAIItem             bossAIItem          = execBossAIItemList[i];
                    List <MagicActionItem> magicActionItemList = null;
                    if (GameManager.SystemMagicActionMgr.BossAIActionsDict.TryGetValue(bossAIItem.ID, out magicActionItemList) && null != magicActionItemList)
                    {
                        for (int j = 0; j < magicActionItemList.Count; j++)
                        {
                            MagicAction.ProcessAction(monster, gameClient, magicActionItemList[j].MagicActionID, magicActionItemList[j].MagicActionParams, -1, -1, 0, 1, -1, 0, 0, -1, 0, false, false, 1.0, 1, 0.0);
                            if (!string.IsNullOrEmpty(bossAIItem.Desc))
                            {
                                GameManager.ClientMgr.BroadSpecialHintText(monster.CurrentMapCode, monster.CurrentCopyMapID, bossAIItem.Desc);
                            }
                        }
                    }
                }
            }
        }