Beispiel #1
0
        Hireling ReadHirelingData(GameInfo gameInfo)
        {
            var guid = GetPetGuid(gameInfo.Player, (int)PetClass.HIRELING);

            if (guid < 0)
            {
                return(null);
            }

            var unit = UnitByTypeAndGuid(D2UnitType.Monster, guid);

            if (unit == null)
            {
                return(null);
            }

            var hireling = new Hireling();

            hireling.Parse(unit, unitReader, reader, gameInfo);

            // adjust item location for hireling items
            List <Item> hirelingItems = GetEquippedItems(unit).ToList();

            foreach (var item in hirelingItems)
            {
                var itemDesc = unitReader.GetItemDescription(item.Unit);
                item.Location = new ItemLocation
                {
                    X            = (int)item.ItemData.BodyLoc,
                    Y            = 1,
                    Width        = itemDesc.invWidth,
                    Height       = itemDesc.invHeight,
                    Container    = ItemContainer.Hireling,
                    BodyLocation = item.ItemData.BodyLoc,
                };
            }
            hireling.Items  = GetItemInfosByItems(hirelingItems, unit);
            hireling.Skills = ReadSkillInfos(unit, skillReader);
            return(hireling);
        }
Beispiel #2
0
        Hireling ReadHirelingData(GameInfo gameInfo)
        {
            var guid = GetPetGuid(gameInfo.Player, (int)PetClass.HIRELING);

            if (guid < 0)
            {
                return(null);
            }

            var unit = UnitByTypeAndGuid(D2UnitType.Monster, guid);

            if (unit == null)
            {
                return(null);
            }

            var hireling = new Hireling();

            hireling.Parse(unit, unitReader, skillReader, reader, gameInfo);
            hireling.Items = GetItemInfosByItems(GetEquippedItems(unit), unit);
            return(hireling);
        }
Beispiel #3
0
        bool ProcessGameData()
        {
            // Make sure the game is loaded.
            var gameInfo = ReadGameInfo();

            if (gameInfo == null)
            {
                return(false);
            }

            CreateReaders();

            // A brand new character has been started.
            // The extra wasInTitleScreen check prevents DI from splitting
            // when it was started AFTER Diablo 2, but the char is still a new char
            bool isNewChar;

            try
            {
                isNewChar = wasInTitleScreen && Character.DetermineIfNewChar(
                    gameInfo.Player,
                    unitReader,
                    inventoryReader,
                    skillReader
                    );
            } catch (Exception e)
            {
                Logger.Error($"Unable to determine if new char {e.Message}", e);
                return(false);
            }

            byte area;

            try
            {
                area = reader.ReadByte(memory.Area);
            } catch (Exception e)
            {
                Logger.Error($"Unable to read area at {memory.Area}: {e.Message}", e);
                return(false);
            }

            // Make sure game is in a valid state.
            if (!IsValidState(isNewChar, gameInfo, area))
            {
                Logger.Info("Not in valid state");
                return(false);
            }

            Character character;

            try
            {
                character = ReadCharacterData(gameInfo, isNewChar);
            } catch (Exception e)
            {
                Logger.Error($"Error reading character: {e.Message}", e);
                return(false);
            }

            Quests quests;

            try
            {
                quests = ReadQuests(gameInfo);
            } catch (Exception e)
            {
                Logger.Error($"Error reading quests: {e.Message}", e);
                return(false);
            }

            byte inventoryTab;

            try
            {
                inventoryTab = reader.ReadByte(memory.InventoryTab);
            }
            catch (Exception e)
            {
                Logger.Error($"Error reading inventoryTab at {memory.InventoryTab}: {e.Message}", e);
                return(false);
            }

            int playersX;

            try
            {
                playersX = Math.Max(reader.ReadByte(memory.PlayersX), (byte)1);
            }
            catch (Exception e)
            {
                Logger.Error($"Error reading playersX at {memory.PlayersX}: {e.Message}", e);
                return(false);
            }
            // Finished reading all mandatory data


            // TODO: fix bug with not increasing gameCount (maybe use some more info from D2Game obj)
            // Note: gameId can be the same across D2 restarts
            // - launch d2
            // - start game (counter increases)
            // - close d2
            // - launch d2
            // - start game (counter doesnt increase)
            if (gameInfo.GameId != 0 && (lastGameId != gameInfo.GameId))
            {
                gameCount++;
                lastGameId = gameInfo.GameId;
            }


            List <Monster> killedMonsters = null;

            try
            {
                killedMonsters = ReadKilledMonsters(gameInfo);
            }
            catch (Exception e)
            {
                Logger.Error($"Error reading killed monsters: {e.Message}", e);
            }

            Hireling hireling = null;

            try
            {
                hireling = ReadHirelingData(gameInfo);
            } catch (Exception e)
            {
                Logger.Error($"Error reading hireling: {e.Message}", e);
            }

            if (isNewChar)
            {
                charCount++;
                Logger.Info($"A new character was created: {character.Name} (Char {charCount})");
            }

            var g = new Game();

            g.Area         = area;
            g.InventoryTab = inventoryTab;
            g.PlayersX     = playersX;
            g.Difficulty   = (GameDifficulty)gameInfo.Game.Difficulty;
            g.Seed         = gameInfo.Game.InitSeed;
            // todo: maybe improve the check, if needed...
            g.SeedIsArg = reader.ProcessInfo.CommandLineArgs.Contains("-seed");
            g.GameCount = gameCount;
            g.CharCount = charCount;
            g.Quests    = quests;
            g.Character = character;
            g.Hireling  = hireling;
            Game        = g;

            OnDataRead(new DataReadEventArgs(reader.ProcessInfo, Game, killedMonsters));

            return(true);
        }
Beispiel #4
0
        public void Consume(GameClient client, GameMessage message)
        {
            if (message is JoinBNetGameMessage)
            {
                OnJoinGame(client, (JoinBNetGameMessage)message);
            }

            //Остреливаем левый портал
            var FalsePortal = client.Player.World.GetActorBySNO(5648);
            //client.Player.World.Leave(FalsePortal);
            //FalsePortal.Destroy();
            //Тестовая проверка прохождения // Пока только синг.
            var dbQuestProgress = DBSessions.AccountSession.Get <DBProgressToon>(client.Player.Toon.PersistentID);
            var world           = client.Player.World;

            #region Акт 1

            #region Акт 1 Квест 2 - Наследие декарда каина
            if (dbQuestProgress.ActiveQuest == 72095)
            {
                #region Перемотка ко второму квесту
                for (int Rem = 0; Rem < 8; Rem++)
                {
                    world.Game.Quests.Advance(87700);
                }
                #endregion
                var LeahBrains = world.GetActorByDynamicId(72);

                if (LeahBrains != null)
                {
                    Logger.Debug("Вышибаем SNO {0}, мир содершит {1} ", LeahBrains.ActorSNO, world.GetActorsBySNO(3739).Count);
                    world.Leave(LeahBrains);
                    world.Leave(world.GetActorByDynamicId(75));
                }
                if (dbQuestProgress.StepOfQuest == -1 || dbQuestProgress.StepOfQuest == 0 || dbQuestProgress.StepOfQuest == 1 || dbQuestProgress.StepOfQuest == 2)
                {
                    world.Leave(world.GetActorByDynamicId(83));
                    Hireling LeahFriend = new Hireling(world, LeahBrains.ActorSNO.Id, LeahBrains.Tags);
                    var      NewPoint   = new Vector3D(LeahBrains.Position.X, LeahBrains.Position.Y + 5, LeahBrains.Position.Z);
                    LeahFriend.Brain = new MinionBrain(LeahFriend);
                    LeahFriend.Attributes[GameAttribute.Untargetable] = false;
                    LeahFriend.GBHandle.Type = 4;
                    LeahFriend.GBHandle.GBID = 717705071;
                    LeahFriend.Attributes[GameAttribute.Pet_Creator] = client.Player.PlayerIndex;
                    LeahFriend.Attributes[GameAttribute.Pet_Type]    = 0;
                    LeahFriend.Attributes[GameAttribute.Pet_Owner]   = client.Player.PlayerIndex;
                    LeahFriend.Position     = RandomDirection(client.Player.Position, 3f, 8f);
                    LeahFriend.RotationW    = LeahBrains.RotationW;
                    LeahFriend.RotationAxis = LeahBrains.RotationAxis;
                    LeahFriend.EnterWorld(NewPoint);
                    LeahFriend.Attributes[GameAttribute.Level] = 6;
                    client.Player.ActiveHireling = LeahFriend;
                    client.Player.SelectedNPC    = null;
                    LeahFriend.Brain.Activate();
                }
                if (dbQuestProgress.StepOfQuest == -1 || dbQuestProgress.StepOfQuest == 0 || dbQuestProgress.StepOfQuest == 1)
                {
                    var    NewTristramPortal     = world.GetActorByDynamicId(34);
                    Player MasterPlayer          = client.Player;
                    var    ListenerUsePortalTask = Task <bool> .Factory.StartNew(() => OnUseTeleporterListener(NewTristramPortal.DynamicID, world));
                }
                if (dbQuestProgress.StepOfQuest == -1 || dbQuestProgress.StepOfQuest == 0 || dbQuestProgress.StepOfQuest == 1 || dbQuestProgress.StepOfQuest == 2)
                {
                    Player MasterPlayer = client.Player;
                    var    ListenerEnterToOldTristram = Task <bool> .Factory.StartNew(() => OnListenerToEnter(MasterPlayer, world));

                    ListenerEnterToOldTristram.ContinueWith(delegate   //Once killed:
                    {
                        Logger.Debug("Enter to Road Objective done "); // Waypoint_OldTristram
                        var ListenerEnterToAdriaEnter = Task <bool> .Factory.StartNew(() => OnListenerToAndriaEnter(MasterPlayer, world));
                    });
                }
                if (dbQuestProgress.StepOfQuest == 3)
                {
                    Player MasterPlayer = client.Player;
                    var    ListenerEnterToAdriaEnter = Task <bool> .Factory.StartNew(() => OnListenerToAndriaEnter(MasterPlayer, world));
                }
                if (dbQuestProgress.StepOfQuest > 3 && dbQuestProgress.StepOfQuest < 11)
                {
                    LeahBrains.EnterWorld(LeahBrains.Position);
                }

                if (dbQuestProgress.StepOfQuest == 12)
                {
                    Player      MasterPlayer   = client.Player;
                    var         CainIntroWorld = client.Player.World.Game.GetWorld(60713);
                    var         minions        = CainIntroWorld.GetActorsBySNO(80652);
                    List <uint> SkilletKiller  = new List <uint> {
                    };

                    foreach (var minion in minions)
                    {
                        SkilletKiller.Add(minion.DynamicID);
                    }
                    var CainKillerEvent = Task <bool> .Factory.StartNew(() => OnKillListenerCain(SkilletKiller, CainIntroWorld));

                    CainKillerEvent.ContinueWith(delegate
                    {
                        world.Game.Quests.Advance(72095);
                        dbQuestProgress.StepOfQuest = 13;
                    });
                }
            }

            #endregion

            #region Акт 1 Квест 3 - Сломанная корона
            if (dbQuestProgress.ActiveQuest == 72221)
            {
                world.Leave(world.GetActorByDynamicId(72));
                #region Перемотка ко второму квесту
                for (int Rem = 0; Rem < 8; Rem++)
                {
                    world.Game.Quests.Advance(87700);
                }
                //world.Leave(world.GetActorByDynamicId(75));
                #endregion
                #region Перемотка ко третьему квесту
                for (int Rem = 0; Rem < 15; Rem++)
                {
                    world.Game.Quests.Advance(72095);
                }
                world.Leave(world.GetActorByDynamicId(25));
                //world.Game.Quests.Advance(72095);
                #endregion
                if (dbQuestProgress.StepOfQuest >= 0 && dbQuestProgress.StepOfQuest < 5)
                {
                    var      BlacksmithVendor = world.GetActorBySNO(56947);
                    Vector3D position         = new Vector3D(BlacksmithVendor.Position);
                    //world.SpawnMonster(65036, position);// NonVendor - 65036
                    var BlacksmithQuest = world.GetActorBySNO(65036);
                    BlacksmithQuest.RotationAxis = BlacksmithVendor.RotationAxis;
                    BlacksmithQuest.RotationW    = BlacksmithVendor.RotationW;
                    world.Leave(BlacksmithVendor);
                }
                if (dbQuestProgress.StepOfQuest == 6)
                {
                    var ListenerEnterToGraveyard = Task <bool> .Factory.StartNew(() => OnListenerToEnterGraveyard(client.Player, world));

                    ListenerEnterToGraveyard.ContinueWith(delegate
                    {
                        Logger.Debug("Enter to Road Objective done ");
                    });
                }
            }

            #endregion

            #endregion

            #region Основная проверка
            if (dbQuestProgress.ActiveQuest != -1)
            {
                #region Нижнии ворота тристрама
                var DownGate = world.GetActorBySNO(90419);
                DownGate.Attributes[GameAttribute.Gizmo_State] = 1;
                DownGate.Attributes.BroadcastChangedIfRevealed();
                world.BroadcastIfRevealed(new Message.Definitions.Animation.SetIdleAnimationMessage
                {
                    ActorID      = DownGate.DynamicID,
                    AnimationSNO = Core.GS.Common.Types.TagMap.AnimationSetKeys.Open.ID
                }, DownGate);
                #endregion

                #region Убираем телегу
                if (dbQuestProgress.ActiveQuest != 87700 && dbQuestProgress.ActiveQuest != 72095)
                {
                    var      TELEGAS    = world.GetActorsBySNO(112131);
                    Vector3D LastTelega = new Vector3D();
                    foreach (var TELEGA in TELEGAS)
                    {
                        TELEGA.Destroy();
                        LastTelega = TELEGA.Position;
                    }
                }
                #endregion
                if (dbQuestProgress.StepOfQuest > 0)
                {
                    // Вышибаем лею
                    var actorToShoot = world.GetActorByDynamicId(72);
                    if (dbQuestProgress.ActiveQuest == 87700)
                    {
                        if (actorToShoot != null)
                        {
                            Logger.Debug("Вышибаем SNO {0}, мир содершит {1} ", actorToShoot.ActorSNO, world.GetActorsBySNO(3739).Count);
                            world.Leave(actorToShoot);
                        }
                        else
                        {
                            Logger.Debug("Вышибать некого");
                        }
                    }

                    Logger.Warn("Обнаружен начатый квест {0}", dbQuestProgress.ActiveQuest);
                    for (int CS = 0; CS < dbQuestProgress.StepOfQuest; CS++)
                    {
                        world.Game.Quests.Advance(dbQuestProgress.ActiveQuest);
                        //Logger.Warn("Обнаруженно прохождение квеста {0}, шаг квеста {1]", dbQuestProgress.ActiveQuest, dbQuestProgress.StepOfQuest);
                    }
                    Logger.Warn("Обнаружено Прохождение квеста {0}, шаг - {1}", dbQuestProgress.ActiveQuest, dbQuestProgress.StepOfQuest);
                }
                else
                {
                    world.Game.Quests.Advance(dbQuestProgress.ActiveQuest);
                    Logger.Warn("Обнаружен начатый квест {0}", dbQuestProgress.ActiveQuest);
                }
                if (dbQuestProgress.ActiveQuest == 87700)
                {
                    if (dbQuestProgress.StepOfQuest == 8)
                    {
                        world.Game.Quests.NotifyQuest(87700, Mooege.Common.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor, 192164);
                    }
                }
            }
            #endregion

            #region Сырые локации



            #endregion
            #region Заполним немного локации))
            Vector3D[] Points = new Vector3D[4];
            Points[0] = new Vector3D(2427.788f, 2852.193f, 27.1f);
            Points[1] = new Vector3D(2356.931f, 2528.715f, 27.1f);
            Points[2] = new Vector3D(2119.563f, 2489.693f, 27.1f);
            Points[3] = new Vector3D(2021.855f, 2774.645f, 40.05685f);
            int FatZombieAID   = 6652;
            int RisenZombieAID = 6644;
            //Ugly add monster, скучно))
            Vector3D[] MobPosSpawn = new Vector3D[50];
            foreach (Vector3D Point in Points)
            {
                for (int a = 0; a < 6; a++)
                {
                    world.SpawnMonster(RisenZombieAID, RandomDirection(Point, 10f, 80f));
                }
                for (int a = 0; a < 4; a++)
                {
                    world.SpawnMonster(FatZombieAID, RandomDirection(Point, 10f, 80f));
                }
            }

            #endregion
            DBSessions.AccountSession.Flush();
        }
Beispiel #5
0
        public override void Execute(Map.World world)
        {
            // test kill leah
            if (world.HasActor(72))
            {
                world.GetActorByDynamicId(72).Destroy();
            }
            //Get Leah
            var LeahBrains = world.GetActorByDynamicId(83);

            //Get Portal
            var NewTristramPortal = world.GetActorByDynamicId(34);

            portalAID = NewTristramPortal.ActorSNO.Id;
            if (HadConversation)
            {
                HadConversation = false;
                Logger.Debug(" RESCUE CAIN QUEST STARTED ");
                Logger.Debug(" Quests.Advance(72095) ");
                world.Game.Quests.HasCurrentQuest(72095, -1);
                world.Game.Quests.Advance(72095);
            }
            // Away Leah
            try { world.Leave(LeahBrains); }
            catch { }

            //LeahBrains.OnLeave(world);
            // Create Friend Leah for Party
            Hireling LeahFriend = new Hireling(world, LeahBrains.ActorSNO.Id, LeahBrains.Tags);

            LeahFriend.Brain = new MinionBrain(LeahFriend);


            // Point to spawn Leah
            var NewPoint = new Vector3D(LeahBrains.Position.X, LeahBrains.Position.Y + 5, LeahBrains.Position.Z);

            //LeahBrains.EnterWorld(NewPoint);
            foreach (var player in world.Players)
            {
                if (player.Value.PlayerIndex == 0)
                {
                    LeahFriend.GBHandle.Type = 4;
                    LeahFriend.GBHandle.GBID = 717705071;
                    LeahFriend.Attributes[GameAttribute.Pet_Creator]        = player.Value.PlayerIndex;
                    LeahFriend.Attributes[GameAttribute.Pet_Type]           = 0x8;
                    LeahFriend.Attributes[GameAttribute.Hitpoints_Max]      = 100f;
                    LeahFriend.Attributes[GameAttribute.Hitpoints_Cur]      = 80f;
                    LeahFriend.Attributes[GameAttribute.Attacks_Per_Second] = 1.6f;
                    LeahFriend.Attributes[GameAttribute.Pet_Owner]          = player.Value.PlayerIndex;
                    LeahFriend.Attributes[GameAttribute.Untargetable]       = false;
                    LeahFriend.Position     = RandomDirection(player.Value.Position, 3f, 8f);
                    LeahFriend.RotationW    = LeahBrains.RotationW;
                    LeahFriend.RotationAxis = LeahBrains.RotationAxis;
                    LeahFriend.EnterWorld(NewPoint);
                    LeahFriend.Attributes[GameAttribute.Level]++;
                    player.Value.ActiveHireling = LeahFriend;
                    player.Value.SelectedNPC    = null;
                    LeahFriend.Brain.Activate();
                    MasterPlayer = player.Value;
                }

                var dbQuestProgress = DBSessions.AccountSession.Get <DBProgressToon>(player.Value.Toon.PersistentID);

                dbQuestProgress.ActiveQuest = 72095;
                dbQuestProgress.StepOfQuest = 1;
                DBSessions.AccountSession.SaveOrUpdate(dbQuestProgress);
                DBSessions.AccountSession.Flush();
            }

            LeahBrains.OnLeave(world);
            var ListenerUsePortalTask = Task <bool> .Factory.StartNew(() => OnUseTeleporterListener(NewTristramPortal.DynamicID, world));

            //Wait for portal to be used .
            ListenerUsePortalTask.ContinueWith(delegate                //Once killed:
            {
                Logger.Debug(" Waypoint_NewTristram Objective done "); // Waypoint_NewTristram
            });

            var ListenerEnterToOldTristram = Task <bool> .Factory.StartNew(() => OnListenerToEnter(MasterPlayer, world));

            ListenerEnterToOldTristram.ContinueWith(delegate //Once killed:
            {
                Logger.Debug("Enter to Road Objective done ");
                var ListenerEnterToAdriaEnter = Task <bool> .Factory.StartNew(() => OnListenerToAndriaEnter(MasterPlayer, world));
                ListenerEnterToAdriaEnter.ContinueWith(delegate //Once killed:
                {
                    Logger.Debug("Enter to Adria Objective done ");
                    world.Game.Quests.Advance(72095);
                });
            });
        }
Beispiel #6
0
        public void Consume(GameClient client, GameMessage message)
        {
            if (message is JoinBNetGameMessage)
            {
                OnJoinGame(client, (JoinBNetGameMessage)message);
            }

            //Остреливаем левый портал
            var FalsePortal = client.Player.World.GetActorBySNO(5648);
            //client.Player.World.Leave(FalsePortal);
            //FalsePortal.Destroy();
            //Тестовая проверка прохождения // Пока только синг.
            var dbQuestProgress = DBSessions.AccountSession.Get <DBProgressToon>(client.Player.Toon.PersistentID);
            var world           = client.Player.World;

            //[050453] [UI] Quests
            //[050454] [UI] QuestUpdate
            //[174218] [UI] QuestReward
            #region Акт 1

            #region Акт 1 Квест 2 - Наследие декарда каина
            if (dbQuestProgress.ActiveQuest == 72095)
            {
                #region Перемотка ко второму квесту
                for (int Rem = 0; Rem < 8; Rem++)
                {
                    world.Game.Quests.Advance(87700);
                }
                #endregion
                var LeahBrains = world.GetActorByDynamicId(72);

                if (LeahBrains != null)
                {
                    Logger.Debug("Вышибаем SNO {0}, мир содершит {1} ", LeahBrains.ActorSNO, world.GetActorsBySNO(3739).Count);
                    world.Leave(LeahBrains);
                    world.Leave(world.GetActorByDynamicId(75));
                }
                if (dbQuestProgress.StepOfQuest == -1 || dbQuestProgress.StepOfQuest == 0 || dbQuestProgress.StepOfQuest == 1 || dbQuestProgress.StepOfQuest == 2)
                {
                    world.Leave(world.GetActorByDynamicId(83));
                    Hireling LeahFriend = new Hireling(world, LeahBrains.ActorSNO.Id, LeahBrains.Tags);
                    LeahFriend.Brain = new HirelingBrain(LeahFriend);
                    // SetBrain(new MinionBrain(this));
                    LeahFriend.Attributes[GameAttribute.Untargetable] = false;
                    LeahFriend.GBHandle.Type = 4;
                    LeahFriend.GBHandle.GBID = 717705071;
                    LeahFriend.Attributes[GameAttribute.Pet_Creator] = client.Player.PlayerIndex;
                    LeahFriend.Attributes[GameAttribute.Pet_Type]    = 0;
                    LeahFriend.Attributes[GameAttribute.Pet_Owner]   = client.Player.PlayerIndex;
                    LeahFriend.RotationW    = LeahBrains.RotationW;
                    LeahFriend.RotationAxis = LeahBrains.RotationAxis;
                    LeahFriend.EnterWorld(RandomDirection(client.Player.Position, 3f, 8f));
                    LeahFriend.Attributes[GameAttribute.Level] = 6;
                    client.Player.ActiveHireling = LeahFriend;


                    LeahFriend.Brain.Activate();
                }
                if (dbQuestProgress.StepOfQuest == -1 || dbQuestProgress.StepOfQuest == 0 || dbQuestProgress.StepOfQuest == 1)
                {
                    var    NewTristramPortal     = world.GetActorByDynamicId(34);
                    Player MasterPlayer          = client.Player;
                    var    ListenerUsePortalTask = Task <bool> .Factory.StartNew(() => OnUseTeleporterListener(NewTristramPortal.DynamicID, world));
                }
                if (dbQuestProgress.StepOfQuest == -1 || dbQuestProgress.StepOfQuest == 0 || dbQuestProgress.StepOfQuest == 1 || dbQuestProgress.StepOfQuest == 2)
                {
                    Player MasterPlayer = client.Player;
                    var    ListenerEnterToOldTristram = Task <bool> .Factory.StartNew(() => OnListenerToEnter(MasterPlayer, world));

                    ListenerEnterToOldTristram.ContinueWith(delegate   //Once killed:
                    {
                        Logger.Debug("Enter to Road Objective done "); // Waypoint_OldTristram
                        var ListenerEnterToAdriaEnter = Task <bool> .Factory.StartNew(() => OnListenerToAndriaEnter(MasterPlayer, world));
                    });
                }
                if (dbQuestProgress.StepOfQuest == 3)
                {
                    Player MasterPlayer = client.Player;
                    var    ListenerEnterToAdriaEnter = Task <bool> .Factory.StartNew(() => OnListenerToAndriaEnter(MasterPlayer, world));
                }
                if (dbQuestProgress.StepOfQuest > 3 && dbQuestProgress.StepOfQuest < 11)
                {
                    LeahBrains.EnterWorld(LeahBrains.Position);
                }

                if (dbQuestProgress.StepOfQuest == 12)
                {
                    Player      MasterPlayer   = client.Player;
                    var         CainIntroWorld = client.Player.World.Game.GetWorld(60713);
                    var         minions        = CainIntroWorld.GetActorsBySNO(80652);
                    List <uint> SkilletKiller  = new List <uint> {
                    };

                    foreach (var minion in minions)
                    {
                        SkilletKiller.Add(minion.DynamicID);
                    }
                    var CainKillerEvent = Task <bool> .Factory.StartNew(() => OnKillListenerCain(SkilletKiller, CainIntroWorld));

                    CainKillerEvent.ContinueWith(delegate
                    {
                        world.Game.Quests.Advance(72095);
                        dbQuestProgress.StepOfQuest = 13;
                    });
                }
            }

            #endregion

            #region Акт 1 Квест 3 - Сломанная корона
            if (dbQuestProgress.ActiveQuest == 72221)
            {
                //world.Leave(world.GetActorByDynamicId(72));
                world.Leave(world.GetActorByDynamicId(75));
                #region Перемотка ко второму квесту
                for (int Rem = 0; Rem < 8; Rem++)
                {
                    world.Game.Quests.Advance(87700);
                }
                //world.Leave(world.GetActorByDynamicId(75));
                #endregion
                #region Перемотка ко третьему квесту
                for (int Rem = 0; Rem < 15; Rem++)
                {
                    world.Game.Quests.Advance(72095);
                }
                world.Leave(world.GetActorByDynamicId(25));
                #endregion
                if (dbQuestProgress.StepOfQuest >= 0 && dbQuestProgress.StepOfQuest < 5)
                {
                    var      BlacksmithVendor = world.GetActorBySNO(56947);
                    Vector3D position         = new Vector3D(BlacksmithVendor.Position);
                    //world.SpawnMonster(65036, position);// NonVendor - 65036
                    var BlacksmithQuest = world.GetActorBySNO(65036);
                    BlacksmithQuest.RotationAxis = BlacksmithVendor.RotationAxis;
                    BlacksmithQuest.RotationW    = BlacksmithVendor.RotationW;
                    world.Leave(BlacksmithVendor);
                }
                if (dbQuestProgress.StepOfQuest == 6)
                {
                    var ListenerEnterToGraveyard = Task <bool> .Factory.StartNew(() => OnListenerToEnterGraveyard(client.Player, world));

                    ListenerEnterToGraveyard.ContinueWith(delegate
                    {
                        Logger.Debug("Enter to Road Objective done ");
                    });
                }
            }

            #endregion

            #region Акт 1 Квест 4 - Правление короля скелетов
            if (dbQuestProgress.ActiveQuest == 72061)
            {
                world.Leave(world.GetActorByDynamicId(75));
                #region Перемотка ко второму квесту
                for (int Rem = 0; Rem < 8; Rem++)
                {
                    world.Game.Quests.Advance(87700);
                }
                //world.Leave(world.GetActorByDynamicId(75));
                #endregion
                #region Перемотка ко третьему квесту
                for (int Rem = 0; Rem < 15; Rem++)
                {
                    world.Game.Quests.Advance(72095);
                }
                world.Leave(world.GetActorByDynamicId(25));
                #endregion
                #region Перемотка к четвертому квесту
                for (int Rem = 0; Rem < 10; Rem++)
                {
                    world.Game.Quests.Advance(72221);
                }
                var      BlacksmithVendor = world.GetActorBySNO(56947);
                Vector3D position         = new Vector3D(BlacksmithVendor.Position);
                world.SpawnMonster(56947, position);// NonVendor - 65036
                #endregion

                if (dbQuestProgress.StepOfQuest < 2)
                {
                    var ListenerUsePortalTask = Task <bool> .Factory.StartNew(() => OnEnterToParkListener(client.Player, world));

                    //Wait for portal to be used or player going to scene.
                    ListenerUsePortalTask.ContinueWith(delegate
                    {
                        Logger.Debug(" Waypoint_Park Objective done ");
                    });
                }
            }
            #endregion

            #region Акт 1 Квест 5 - Меч незнакомца
            if (dbQuestProgress.ActiveQuest == 117779)
            {
                world.Leave(world.GetActorByDynamicId(75));
                #region Перемотка ко второму квесту
                for (int Rem = 0; Rem < 8; Rem++)
                {
                    world.Game.Quests.Advance(87700);
                }
                //world.Leave(world.GetActorByDynamicId(75));
                #endregion
                #region Перемотка ко третьему квесту
                for (int Rem = 0; Rem < 15; Rem++)
                {
                    world.Game.Quests.Advance(72095);
                }
                world.Leave(world.GetActorByDynamicId(25));
                #endregion
                #region Перемотка к четвертому квесту
                for (int Rem = 0; Rem < 10; Rem++)
                {
                    world.Game.Quests.Advance(72221);
                }
                var BlacksmithVendor = world.GetActorBySNO(56947);
                world.Leave(BlacksmithVendor);
                Vector3D position = new Vector3D(BlacksmithVendor.Position);
                world.SpawnMonster(56947, position);// NonVendor - 65036


                #endregion
                #region Перемотка к пятому квесту
                for (int Rem = 0; Rem < 17; Rem++)
                {
                    world.Game.Quests.Advance(72061);
                }
                #endregion

                Vector3D PointToTyrael = new Vector3D(2940.182f, 2792.239f, 24.04533f);
                world.SpawnMonster(117365, PointToTyrael);
                //Открытие ворот
                var ListenerNierDoorsTask = Task <bool> .Factory.StartNew(() => OnNierDoorsListener(client.Player, world));

                //Wait for portal to be used or player going to scene.
                ListenerNierDoorsTask.ContinueWith(delegate
                {
                    Logger.Debug(" Waypoint_Park Objective done ");
                    //No Lock 230324
                    //Lock 216574
                    var Locked   = world.GetActorBySNO(216574);
                    var Unlocked = world.GetActorBySNO(230324);
                    world.Leave(Locked);
                    world.BroadcastIfRevealed(new PlayAnimationMessage
                    {
                        ActorID = Unlocked.DynamicID,
                        Field1  = 5,
                        Field2  = 0,
                        tAnim   = new Net.GS.Message.Fields.PlayAnimationMessageSpec[]
                        {
                            new Net.GS.Message.Fields.PlayAnimationMessageSpec()
                            {
                                Duration         = 1000,
                                AnimationSNO     = Unlocked.AnimationSet.TagMapAnimDefault[Mooege.Core.GS.Common.Types.TagMap.AnimationSetKeys.Opening],
                                PermutationIndex = 0,
                                Speed            = 1
                            }
                        }
                    }, Unlocked);

                    world.BroadcastIfRevealed(new SetIdleAnimationMessage
                    {
                        ActorID      = Unlocked.DynamicID,
                        AnimationSNO = Unlocked.AnimationSet.TagMapAnimDefault[Mooege.Core.GS.Common.Types.TagMap.AnimationSetKeys.Open]
                    }, Unlocked);
                });

                if (dbQuestProgress.StepOfQuest < 2)
                {
                    var ListenerTristramFieldsTask = Task <bool> .Factory.StartNew(() => OnFieldsListener(client.Player, world));

                    ListenerTristramFieldsTask.ContinueWith(delegate
                    {
                        Logger.Debug("Добро пожаловать в гиблые поля");
                        var ListenerFoundCaveTask = Task <bool> .Factory.StartNew(() => OnFoundCaveListener(client.Player, world));
                        ListenerFoundCaveTask.ContinueWith(delegate
                        {
                            Logger.Debug("Пещера Хазра найдена");
                        });
                    });
                }
                if (dbQuestProgress.StepOfQuest == 2)
                {
                    //OnFoundCaveListener
                    var ListenerFoundCaveTask = Task <bool> .Factory.StartNew(() => OnFoundCaveListener(client.Player, world));

                    ListenerFoundCaveTask.ContinueWith(delegate
                    {
                        Logger.Debug("Пещера Хазра найдена");
                    });
                }
                //World - Fields_Cave_SwordOfJustice_Level01 [119888]
            }
            #endregion

            #region Акт 1 Квест 6 - Меч незнакомца
            if (dbQuestProgress.ActiveQuest == 72738)
            {
                world.Leave(world.GetActorByDynamicId(75));
                #region Перемотка ко второму квесту
                for (int Rem = 0; Rem < 8; Rem++)
                {
                    world.Game.Quests.Advance(87700);
                }
                #endregion
                #region Перемотка ко третьему квесту
                for (int Rem = 0; Rem < 15; Rem++)
                {
                    world.Game.Quests.Advance(72095);
                }
                world.Leave(world.GetActorByDynamicId(25));
                #endregion
                #region Перемотка к четвертому квесту
                for (int Rem = 0; Rem < 10; Rem++)
                {
                    world.Game.Quests.Advance(72221);
                }
                var BlacksmithVendor = world.GetActorBySNO(56947);
                world.Leave(BlacksmithVendor);
                Vector3D position = new Vector3D(BlacksmithVendor.Position);
                world.SpawnMonster(56947, position);// NonVendor - 65036


                #endregion
                #region Перемотка к пятому квесту
                for (int Rem = 0; Rem < 17; Rem++)
                {
                    world.Game.Quests.Advance(72061);
                }
                #endregion
                #region Перемотка к шестому квесту
                for (int Rem = 0; Rem < 6; Rem++)
                {
                    world.Game.Quests.Advance(117779);
                }
                #endregion

                Vector3D PointToTyrael = new Vector3D(2940.182f, 2792.239f, 24.04533f);
                world.SpawnMonster(117365, PointToTyrael);
                //Открытие ворот
                var ListenerNierDoorsTask = Task <bool> .Factory.StartNew(() => OnNierDoorsListener(client.Player, world));

                //Открытие ворот в гиблые поля.
                ListenerNierDoorsTask.ContinueWith(delegate
                {
                    Logger.Debug(" Waypoint_Park Objective done ");
                    //No Lock 230324
                    //Lock 216574
                    var Locked   = world.GetActorBySNO(216574);
                    var Unlocked = world.GetActorBySNO(230324);
                    world.Leave(Locked);
                    world.BroadcastIfRevealed(new PlayAnimationMessage
                    {
                        ActorID = Unlocked.DynamicID,
                        Field1  = 5,
                        Field2  = 0,
                        tAnim   = new Net.GS.Message.Fields.PlayAnimationMessageSpec[]
                        {
                            new Net.GS.Message.Fields.PlayAnimationMessageSpec()
                            {
                                Duration         = 1000,
                                AnimationSNO     = Unlocked.AnimationSet.TagMapAnimDefault[Mooege.Core.GS.Common.Types.TagMap.AnimationSetKeys.Opening],
                                PermutationIndex = 0,
                                Speed            = 1
                            }
                        }
                    }, Unlocked);

                    world.BroadcastIfRevealed(new SetIdleAnimationMessage
                    {
                        ActorID      = Unlocked.DynamicID,
                        AnimationSNO = Unlocked.AnimationSet.TagMapAnimDefault[Mooege.Core.GS.Common.Types.TagMap.AnimationSetKeys.Open]
                    }, Unlocked);
                });
            }
            #endregion

            #endregion

            #region Основная проверка
            if (dbQuestProgress.ActiveQuest != -1)
            {
                #region Нижнии ворота тристрама
                var DownGate = world.GetActorBySNO(90419);
                DownGate.Attributes[GameAttribute.Gizmo_State] = 1;
                DownGate.Attributes.BroadcastChangedIfRevealed();
                world.BroadcastIfRevealed(new Message.Definitions.Animation.SetIdleAnimationMessage
                {
                    ActorID      = DownGate.DynamicID,
                    AnimationSNO = Core.GS.Common.Types.TagMap.AnimationSetKeys.Open.ID
                }, DownGate);
                #endregion
                //Убираем телегу
                var FactorToShoot = world.GetActorBySNO(81699);
                FactorToShoot.Destroy();
                #region Убираем телегу
                if (dbQuestProgress.ActiveQuest != 87700 && dbQuestProgress.ActiveQuest != 72095)
                {
                    var      TELEGAS    = world.GetActorsBySNO(112131);
                    Vector3D LastTelega = new Vector3D();
                    foreach (var TELEGA in TELEGAS)
                    {
                        TELEGA.Destroy();
                        LastTelega = TELEGA.Position;
                    }
                }
                #endregion
                if (dbQuestProgress.StepOfQuest > 0)
                {
                    // Вышибаем лею
                    var actorToShoot = world.GetActorByDynamicId(72);
                    if (dbQuestProgress.ActiveQuest == 87700)
                    {
                        if (actorToShoot != null)
                        {
                            Logger.Debug("Вышибаем SNO {0}, мир содершит {1} ", actorToShoot.ActorSNO, world.GetActorsBySNO(3739).Count);
                            world.Leave(actorToShoot);
                        }
                        else
                        {
                            Logger.Debug("Вышибать некого");
                        }
                    }

                    Logger.Warn("Обнаружен начатый квест {0}", dbQuestProgress.ActiveQuest);
                    for (int CS = 0; CS < dbQuestProgress.StepOfQuest; CS++)
                    {
                        world.Game.Quests.Advance(dbQuestProgress.ActiveQuest);
                        //Logger.Warn("Обнаруженно прохождение квеста {0}, шаг квеста {1]", dbQuestProgress.ActiveQuest, dbQuestProgress.StepOfQuest);
                    }
                    Logger.Warn("Обнаружено Прохождение квеста {0}, шаг - {1}", dbQuestProgress.ActiveQuest, dbQuestProgress.StepOfQuest);
                }
                else
                {
                    world.Game.Quests.Advance(dbQuestProgress.ActiveQuest);
                    Logger.Warn("Обнаружен начатый квест {0}", dbQuestProgress.ActiveQuest);
                }
                if (dbQuestProgress.ActiveQuest == 87700)
                {
                    if (dbQuestProgress.StepOfQuest == 8)
                    {
                        world.Game.Quests.NotifyQuest(87700, Mooege.Common.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor, 192164);
                    }
                }
            }
            #endregion

            #region Сырые локации

            #region Покои Короля

            //Покои: 117405
            // To Tyrael Zone

            /*
             * [148748] a1dun_Leor_Tyrael_Back_Skybox_01
             * [135396] a1dun_Leor_Tyrael_jail_01
             * [135521] a1dun_Leor_Tyrael_Stairs_A_01
             * [135710] a1dun_Leor_Tyrael_Filler_02
             * [117035] trDun_Crypt_W_Exit_Stranger_01
             *
             */
            //  var Leor_Tyrael = client.Player.World.Game.GetWorld(117405);
            Vector3D PointToScene = new Vector3D(0f, 0f, 0f);
            //   Core.GS.Map.Scene CainScene = new Core.GS.Map.Scene(Leor_Tyrael, PointToScene, 135521, null);
            #endregion

            #endregion

            DBSessions.AccountSession.Flush();
        }