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); } } } } }
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); }
public void AddSpawn(MonsterDungeonSpawn spawn) { lock (m_locker) { m_spawns.Add(spawn); m_spawnsQueue.Enqueue(spawn); } }
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); } } }
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); } } }
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); }
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); }
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); }); }