internal int SummonMonster(MonsterToSummon summon) { NpcMonster npcMonster = ServerManager.GetNpcMonster(summon.VNum); if (npcMonster != null) { short mapX = summon.SpawnCell.X; short mapY = summon.SpawnCell.Y; if (mapX == 0 && mapY == 0) { MapCell cell = Map.GetRandomPosition(); if (cell != null) { mapX = cell.X; mapY = cell.Y; } } MapMonster mapMonster = new MapMonster { MonsterVNum = npcMonster.NpcMonsterVNum, MapX = mapX, MapY = mapY, Position = 2, MapId = Map.MapId, IsMoving = summon.IsMoving, MapMonsterId = GetNextMonsterId(), ShouldRespawn = false, OnNoticeEvents = summon.NoticingEvents, UseSkillOnDamage = summon.UseSkillOnDamage, OnSpawnEvents = summon.SpawnEvents, IsTarget = summon.IsTarget, Target = summon.Target, IsBonus = summon.IsBonus, IsBoss = summon.IsBoss, NoticeRange = summon.NoticeRange, Owner = summon.Owner, AliveTime = summon.AliveTime, AliveTimeMp = summon.AliveTimeMp, BaseMaxHp = summon.MaxHp, BaseMaxMp = summon.MaxMp }; if (summon.HasDelay > 0) { AddDelayedMonster(mapMonster); } Observable.Timer(TimeSpan.FromSeconds(summon.HasDelay)) .Subscribe(o => { mapMonster.Initialize(this); mapMonster.BattleEntity.OnDeathEvents.AddRange(summon.DeathEvents); mapMonster.IsHostile = summon.IsHostile; AddMonster(mapMonster); Broadcast(mapMonster.GenerateIn()); RemoveDelayedMonster(mapMonster); if (summon.AfterSpawnEvents.Any()) { summon.AfterSpawnEvents.ForEach(e => EventHelper.Instance.RunEvent(e, monster: mapMonster)); } if (summon.IsMeteorite) { OnMeteoriteEvents(summon, mapMonster); } }); return(mapMonster.MapMonsterId); } return(default);