diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/DesctructibleLootContainer.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/DesctructibleLootContainer.cs index 90e4883..d6f4714 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/DesctructibleLootContainer.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/DesctructibleLootContainer.cs @@ -88,9 +88,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations Logger.Trace("Breaked barricade, id: {0}", SNO); - if (source != null && source is Player && tombs.Contains(SNO)) + if (source is Player player && tombs.Contains(SNO)) { - (source as Player).AddAchievementCounter(74987243307171, 1); + player.AddAchievementCounter(74987243307171, 1); } if (AnimationSet.TagMapAnimDefault.ContainsKey(AnimationSetKeys.DeathDefault)) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Door.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Door.cs index 4eca667..b366839 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Door.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Door.cs @@ -75,7 +75,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations public void Open() { - Logger.MethodTrace($"Opening door $[underline green]${SNO}$[/]$ in world $[underline green]{World.SNO}$[/]$"); + Logger.MethodTrace($"Opening door $[underline green]${SNO}$[/]$ in world $[underline green]${World.SNO}$[/]$"); World.BroadcastIfRevealed(plr => new PlayAnimationMessage { ActorID = DynamicID(plr), diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs index 4f52161..d4db294 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs @@ -1630,7 +1630,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem public void AddOnLoadWorldAction(WorldSno worldSno, Action action) { Logger.Trace("AddOnLoadWorldAction: {0}", worldSno); - if (Players.Values.Any(p => p.World != null && p.World.SNO == worldSno)) + if (Players.Values.Any(p => p.World?.SNO == worldSno)) { action.Invoke(); } @@ -1649,7 +1649,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem if (!OnLoadSceneActions.ContainsKey(sceneSno)) OnLoadSceneActions.Add(sceneSno, new List()); - OnLoadSceneActions[sceneSno].Add(action); + OnLoadSceneActions[sceneSno].Add(action); } #endregion diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs index a2e744b..b21ff8c 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs @@ -188,10 +188,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem get { return Actors.Values.OfType().Select(actor => actor).ToList(); } } - public List Portals - { - get { return Actors.Values.OfType().Select(actor => actor).ToList(); } - } + public List Portals => Actors.Values.OfType().Select(actor => actor).ToList(); public List Monsters { @@ -251,6 +248,43 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem #region update & tick logic + /// + /// Retrieve all portals located within a specified of the given . + /// + /// The actor located near the portals + /// The radius of the portals to be returned is to be specified. + /// Order all existing portals in the world by ascending distance from a specified . + /// If is null. + /// If is not null but lesser than 0. + public ImmutableArray GetPortals(Actor actor, float? radius = null) + { + if (actor == null) + throw new ArgumentNullException(nameof(actor)); + if (radius <= 0) + throw new ArgumentOutOfRangeException(nameof(radius), "Radius must be greater than zero."); + + if (radius is { } r) + Logger.MethodTrace( + $"All portals near $[underline]${actor.SNO} ({actor.GetType().Name})$[/]$ within $[underline]${r}$[/]$ radius"); + else + Logger.MethodTrace($"All portals near $[underline]${actor.SNO} ({actor.GetType().Name})$[/]$"); + + return Portals + .Where(portal => + { + if (radius is not { } r) return true; + var position = actor.Position; + var distance = portal.Position.DistanceSquared(ref position); + return distance <= radius.Value; + }) + .OrderBy(s => + { + var position = actor.Position; + return s.Position.DistanceSquared(ref position); + }) + .ToImmutableArray(); + } + public void Update(int tickCounter) { foreach (var player in Players.Values) @@ -1499,6 +1533,8 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem public ImmutableArray GetAllDoors() => Actors.Select(a => a.Value).Where(a => a is Door).Cast().ToImmutableArray(); + public ImmutableArray GetAllDoors(ActorSno sno) => + Actors.Select(a => a.Value).Where(a => a is Door && a.SNO == sno).Cast().ToImmutableArray(); public ImmutableArray OpenAllDoors() { List openedDoors = new(); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs index c966079..02129bc 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs @@ -556,7 +556,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads if (Context.DogsSummoned >= 3) plr.GrantAchievement(74987243307567); } - Logger.Trace("Killed monster, id: {0}, level {1}", Target.SNO, Target.Attributes[GameAttribute.Level]); + Logger.Trace("Killed monster, id: $[red]${0}$[/]$, level $[red]${1}$[/]$", Target.SNO, Target.Attributes[GameAttribute.Level]); //handling quest triggers diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/ActI.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/ActI.cs index 8373087..618714e 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/ActI.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/ActI.cs @@ -8,6 +8,7 @@ using DiIiS_NA.GameServer.GSSystem.QuestSystem.QuestEvents; using DiIiS_NA.GameServer.Core.Types.Math; using DiIiS_NA.GameServer.GSSystem.QuestSystem.QuestEvents.Implementations; using System.Linq; +using System.Threading.Tasks; using DiIiS_NA.GameServer.MessageSystem; using DiIiS_NA.GameServer.GSSystem.PlayerSystem; using DiIiS_NA.GameServer.GSSystem.AISystem.Brains; @@ -1070,7 +1071,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem }); - ListenKill(ActorSno._skeletonking_shield_skeleton, 1, new Advance()); + ListenKill(ActorSno._skeletonking_shield_skeleton, 4, new Advance()); } }); @@ -1082,8 +1083,19 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem Objectives = new List { Objective.Default() }, OnAdvance = () => { //take crown on Leoric's head - - OpenAll(this.Game.GetWorld(WorldSno.a1trdun_king_level08)); + Game.AddOnLoadWorldAction(WorldSno.a1trdun_king_level08, () => + { + var world = Game.GetWorld(WorldSno.a1trdun_king_level08); + if (world.Players.Any()) + { + var player = world.Players.First(); + var portal = world.GetPortals(player.Value); + portal.First().SetUsable(false); + } + + Open(Game.GetWorld(WorldSno.a1trdun_king_level08), ActorSno._trdun_cath_gate_b_skeletonking); + }); + //Open(this.Game.GetWorld(73261), 172645); ListenInteract(ActorSno._skeletonkinggizmo, 1, new Advance()); } }); @@ -1096,6 +1108,15 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem Objectives = new List { Objective.Default() }, OnAdvance = () => { //kill Leoric + Game.AddOnLoadWorldAction(WorldSno.a1trdun_king_level08, () => + { + var world = Game.GetWorld(WorldSno.a1trdun_king_level08); + if (!world.Players.Any()) return; + var player = world.Players.First(); + var portal = world.GetPortals(player.Value); + portal.First().SetUsable(false); + }); + ListenKill(ActorSno._skeletonking, 1, new Advance()); } }); @@ -1108,13 +1129,17 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem Objectives = new List { Objective.Default() }, OnAdvance = () => { //go to fallen star room - Open(Game.GetWorld(WorldSno.a1trdun_king_level08), ActorSno._trdun_cath_gate_b_skeletonking); Game.CurrentEncounter.Activated = false; - ListenTeleport(117411, new Advance()); Game.AddOnLoadWorldAction(WorldSno.a1trdun_king_level08, () => { - Open(Game.GetWorld(WorldSno.a1trdun_king_level08), ActorSno._trdun_crypt_skeleton_king_throne_parts); + var world = Game.GetWorld(WorldSno.a1trdun_king_level08); + Open(world, ActorSno._trdun_crypt_skeleton_king_throne_parts); + if (!world.Players.Any()) return; + var player = world.Players.First(); + var portal = world.GetPortals(player.Value); + portal.First().SetUsable(true); }); + ListenTeleport(117411, new Advance()); } }); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/ActIII.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/ActIII.cs index 16aec21..cbb63c6 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/ActIII.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/ActIII.cs @@ -694,7 +694,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem Game.AddOnLoadWorldAction(WorldSno.a3dun_azmodan_arena, () => { var world = Game.GetWorld(WorldSno.a3dun_azmodan_arena); - OpenAll(world, ActorSno._a3dun_crater_st_demon_chainpylon_fire_azmodan); + Open(world, ActorSno._a3dun_crater_st_demon_chainpylon_fire_azmodan); try { world.GetActorBySNO(ActorSno._azmodan).Destroy(); } catch { }; world.SpawnMonster(ActorSno._azmodan, new Vector3D { X = 395.553f, Y = 394.966f, Z = 0.1f }); }); @@ -811,7 +811,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem if (World.Players.Values.First().Position.Y < 140) break; } - script.Execute(World); + script.Execute(World); }); #region Описание скрипта //Понеслась diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestProgress.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestProgress.cs index c1ea0a0..58edfda 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestProgress.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestProgress.cs @@ -174,28 +174,23 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem //opening gates or door(for getting pass) protected bool Open(World world, ActorSno sno) { - var actor = world.GetActorsBySNO(sno).Where(d => d.Visible).FirstOrDefault(); - if (actor == null) - return false; - - (actor as Door).Open(); + var doors = world.GetAllDoors(sno); + if (!doors.Any()) return false; + foreach (var door in doors) + door.Open(); return true; } //opening all doors - protected void OpenAll(World world) + protected bool OpenAll(World world) { - foreach (var actor in world.Actors.Select(s=>s.Value).Where(t=>t is Door).Cast()) - (actor).Open(); - } - - protected bool OpenAll(World world, ActorSno sno) - { - foreach (var actor in world.GetActorsBySNO(sno).Where(d => d.Visible).ToList()) - (actor as Door).Open(); + var doors = world.GetAllDoors(); + if (!doors.Any()) return false; + foreach (var door in doors) + door.Open(); return true; } - + protected void ListenKillBonus(ActorSno monsterSno, int monsterCount, QuestEvent qevent) { QuestTriggers.TryAdd((int)monsterSno,