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); }
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); }
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); }
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(); }
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); }); }); }
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(); }