Пример #1
0
 private void OnWinnersDetermined(Fight fight, FightTeam winners, FightTeam losers, bool draw)
 {
     fight.WinnersDetermined -= new Fight.FightWinnersDelegate(this.OnWinnersDetermined);
     if (!draw && (winners is FightPlayerTeam && losers is FightMonsterTeam))
     {
         MonsterGroup group = ((MonsterFighter)losers.Leader).Monster.Group;
         if (!this.m_groupsSpawn.ContainsKey(group))
         {
             DungeonSpawningPool.logger.Error <int, int>("Group {0} (Map {1}) has ended his fight but is not register in the pool", group.Id, base.Map.Id);
         }
         else
         {
             MonsterDungeonSpawn monsterDungeonSpawn = this.m_groupsSpawn[group];
             if (monsterDungeonSpawn.TeleportEvent)
             {
                 ObjectPosition teleportPosition = monsterDungeonSpawn.GetTeleportPosition();
                 foreach (CharacterFighter current in winners.GetAllFighters <CharacterFighter>())
                 {
                     current.Character.NextMap   = teleportPosition.Map;
                     current.Character.Cell      = teleportPosition.Cell;
                     current.Character.Direction = teleportPosition.Direction;
                     this.m_groupsSpawn.Remove(group);
                 }
             }
         }
     }
 }
Пример #2
0
        public MonsterDungeonSpawn Map(MonsterDungeonSpawn spawn, MonsterDungeonSpawnEntity dummy)
        {
            MonsterDungeonSpawn result;

            if (spawn == null)
            {
                result = this.m_current;
            }
            else
            {
                if (this.m_current != null && this.m_current.Id == spawn.Id)
                {
                    this.m_current.GroupMonsters.Add(dummy);
                    result = null;
                }
                else
                {
                    MonsterDungeonSpawn current = this.m_current;
                    this.m_current = spawn;
                    this.m_current.GroupMonsters.Add(dummy);
                    result = current;
                }
            }
            return(result);
        }
Пример #3
0
 public void AddSpawn(MonsterDungeonSpawn spawn)
 {
     lock (m_locker)
     {
         m_spawns.Add(spawn);
         m_spawnsQueue.Enqueue(spawn);
     }
 }
Пример #4
0
 public void RemoveSpawn(MonsterDungeonSpawn spawn)
 {
     lock (this.m_locker)
     {
         this.m_spawns.Remove(spawn);
         System.Collections.Generic.List <MonsterDungeonSpawn> list = this.m_spawnsQueue.ToList <MonsterDungeonSpawn>();
         if (list.Remove(spawn))
         {
             this.m_spawnsQueue = new Queue <MonsterDungeonSpawn>(list);
         }
     }
 }
Пример #5
0
        public void RemoveSpawn(MonsterDungeonSpawn spawn)
        {
            lock (m_locker)
            {
                m_spawns.Remove(spawn);

                var asList = m_spawnsQueue.ToList();
                if (asList.Remove(spawn))
                {
                    m_spawnsQueue = new Queue <MonsterDungeonSpawn>(asList);
                }
            }
        }
Пример #6
0
        protected override MonsterGroup DequeueNextGroupToSpawn()
        {
            MonsterGroup result;

            if (!base.Map.CanSpawnMonsters())
            {
                base.StopAutoSpawn();
                result = null;
            }
            else
            {
                lock (this.m_locker)
                {
                    if (this.m_spawnsQueue.Count == 0)
                    {
                        DungeonSpawningPool.logger.Error("SpawningPool Map = {0} try to spawn a monser group but m_groupsToSpawn is empty", base.Map.Id);
                        result = null;
                    }
                    else
                    {
                        MonsterDungeonSpawn monsterDungeonSpawn = this.m_spawnsQueue.Dequeue();
                        MonsterGroup        monsterGroup        = new MonsterGroup(base.Map.GetNextContextualId(), new ObjectPosition(base.Map, base.Map.GetRandomFreeCell(false), base.Map.GetRandomDirection()));
                        foreach (MonsterDungeonSpawnEntity current in monsterDungeonSpawn.GroupMonsters)
                        {
                            var monster = current.GenerateMonster(ref monsterGroup);
                            if (monster != null)
                            {
                                monsterGroup.AddMonster(monster);
                            }
                        }
                        if (monsterGroup.GetMonsters().Count() == 0)
                        {
                            DungeonSpawningPool.logger.Error("SpawningPool Map = {0} try to spawn a monser group but MonsterGroup is empty", base.Map.Id);
                            result = null;
                        }
                        else
                        {
                            this.m_groupsSpawn.Add(monsterGroup, monsterDungeonSpawn);
                            result = monsterGroup;
                        }
                    }
                }
            }
            return(result);
        }
Пример #7
0
 protected override void OnGroupUnSpawned(MonsterGroup monster)
 {
     lock (this.m_locker)
     {
         if (!this.m_groupsSpawn.ContainsKey(monster))
         {
             DungeonSpawningPool.logger.Error <int, int>("Group {0} (Map {1}) was not bind to a dungeon spawn", monster.Id, base.Map.Id);
         }
         else
         {
             MonsterDungeonSpawn item = this.m_groupsSpawn[monster];
             if (this.m_spawns.Contains(item))
             {
                 this.m_spawnsQueue.Enqueue(item);
             }
         }
     }
     base.OnGroupUnSpawned(monster);
 }
Пример #8
0
        public override void ExecuteAdd(TriggerBase trigger)
        {
            Map map;

            if (!trigger.IsArgumentDefined("map"))
            {
                if (trigger is GameTrigger)
                {
                    map = (trigger as GameTrigger).Character.Map;
                }
                else
                {
                    trigger.ReplyError("No map defined");
                    return;
                }
            }
            else
            {
                map = trigger.Get <Map>("map");
            }

            var monsterTemplate = trigger.Get <MonsterTemplate>("monster");
            var grade           = MonsterManager.Instance.GetMonsterGrade(monsterTemplate.Id, trigger.Get <int>("grade"));

            if (grade == null)
            {
                trigger.ReplyError("Monster grade {0}({1}) not found", monsterTemplate.Name, trigger.Get <int>("grade"));
                return;
            }

            var pool = map.SpawningPools.OfType <DungeonSpawningPool>().FirstOrDefault();

            if (pool == null)
            {
                pool = new DungeonSpawningPool(map);
                map.AddSpawningPool(pool);
            }

            var minPartyMembers = trigger.Get <int>("minmembers");


            WorldServer.Instance.IOTaskPool.AddMessage(() =>
            {
                var group = pool.Spawns.FirstOrDefault();

                if (group == null)
                {
                    group = new MonsterDungeonSpawn()
                    {
                        Map = map
                    };
                    WorldServer.Instance.DBAccessor.Database.Insert(group);
                }

                var record = new MonsterDungeonSpawnEntity(group, grade, minPartyMembers);

                WorldServer.Instance.DBAccessor.Database.Insert(record);

                group.GroupMonsters.Add(record);
                if (group.GroupMonsters.Count == 1)
                {
                    pool.AddSpawn(group);
                }
                map.Area.ExecuteInContext(pool.StartAutoSpawn);
            });
        }