From 8d8576f4e7c1e4927614ef9d51decbc7165f88a7 Mon Sep 17 00:00:00 2001 From: Lucca Faria Ferri Date: Thu, 16 Feb 2023 19:56:14 -0800 Subject: [PATCH] Afk disconnect now configurable (not limited to DEBUG/RELEASE), opcodes/gamemessage extensions, static refactoring, QuestTrigger improvements, small GameClient.cs and Player.cs improvements. --- .../D3-GameServer/ClientSystem/GameClient.cs | 95 ++++++++-------- .../Commands/TeleportCommand.cs | 4 +- .../GSSystem/ActorSystem/Gizmo.cs | 18 ++-- .../DesctructibleLootContainer.cs | 14 +-- .../Implementations/LootRunPortal.cs | 12 +-- .../ActorSystem/Implementations/Waypoint.cs | 6 +- .../GSSystem/ActorSystem/InteractiveNPC.cs | 6 +- .../GSSystem/ActorSystem/Portal.cs | 12 +-- .../GSSystem/ActorSystem/StaticItem.cs | 6 +- .../D3-GameServer/GSSystem/GameSystem/Game.cs | 4 +- .../GSSystem/GameSystem/QuestManager.cs | 2 +- .../PlayerSystem/ConversationManager.cs | 12 +-- .../GSSystem/PlayerSystem/Player.cs | 102 +++++++++--------- .../Implementations/General/TownTeleport.cs | 4 +- .../Implementations/HeroSkills/Necromancer.cs | 2 +- .../PowerSystem/Payloads/DeathPayload.cs | 16 +-- .../GSSystem/QuestSystem/QuestProgress.cs | 50 ++++----- .../D3-GameServer/GameServerConfig.cs | 10 ++ 18 files changed, 195 insertions(+), 180 deletions(-) diff --git a/src/DiIiS-NA/D3-GameServer/ClientSystem/GameClient.cs b/src/DiIiS-NA/D3-GameServer/ClientSystem/GameClient.cs index b6f617b..801a63e 100644 --- a/src/DiIiS-NA/D3-GameServer/ClientSystem/GameClient.cs +++ b/src/DiIiS-NA/D3-GameServer/ClientSystem/GameClient.cs @@ -11,20 +11,22 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using DiIiS_NA.Core.Extensions; +using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Base; namespace DiIiS_NA.GameServer.ClientSystem { public class GameClient : IClient { - private static readonly Logger Logger = LogManager.CreateLogger("GC"); + private static readonly Logger Logger = LogManager.CreateLogger("GameClient"); public IConnection Connection { get; set; } public BattleClient BnetClient { get; set; } //private readonly GameBitBuffer _incomingBuffer = new GameBitBuffer(512); - private readonly GameBitBuffer _outgoingBuffer = new GameBitBuffer(ushort.MaxValue); + private readonly GameBitBuffer _outgoingBuffer = new(ushort.MaxValue); - private object _clientStreamLock = new object(); + private readonly object _clientStreamLock = new object(); public Game Game { get; set; } public Player Player { get; set; } @@ -33,21 +35,11 @@ namespace DiIiS_NA.GameServer.ClientSystem public bool TickingEnabled { - get - { - return _tickingEnabled; - } - set - { - _tickingEnabled = value; - //if (value == true) - //this.SendTick(); - } + get => _tickingEnabled; + set => _tickingEnabled = value; } - - public object _bufferLock = new object(); // we should be locking on this private object, locking on gameclient (this) may cause deadlocks. detailed information: http://msdn.microsoft.com/fr-fr/magazine/cc188793%28en-us%29.aspx /raist. - - public bool IsLoggingOut; + + public bool IsLoggingOut { get; set; } public GameClient(IConnection connection) { @@ -58,8 +50,6 @@ namespace DiIiS_NA.GameServer.ClientSystem public virtual void Parse(ConnectionDataEventArgs e) { - //Console.WriteLine(e.Data.Dump()); - //lock (_clientStreamLock) //{ Task.Run(() => @@ -70,25 +60,25 @@ namespace DiIiS_NA.GameServer.ClientSystem //Task.Delay(5000, cancelToken.Token).ContinueWith((task) => { Logger.Warn("Character {0} caused server CPU overload!", this.Player.Toon.Name); this.Game.Dispose(); }, TaskContinuationOptions.NotOnCanceled); try { - GameBitBuffer _incomingBuffer = new GameBitBuffer(512); + GameBitBuffer incomingBuffer = new(512); - _incomingBuffer.AppendData(e.Data.ToArray()); + incomingBuffer.AppendData(e.Data.ToArray()); - while (Connection.IsOpen() && _incomingBuffer.IsPacketAvailable()) + while (Connection.IsOpen() && incomingBuffer.IsPacketAvailable()) { - int end = _incomingBuffer.Position; - end += _incomingBuffer.ReadInt(32) * 8; + int end = incomingBuffer.Position; + end += incomingBuffer.ReadInt(32) * 8; - while ((end - _incomingBuffer.Position) >= 9 && Connection.IsOpen()) + while ((end - incomingBuffer.Position) >= 9 && Connection.IsOpen()) { - var message = _incomingBuffer.ParseMessage(); + var message = incomingBuffer.ParseMessage(); //217 // if (message == null) continue; try { Logger.LogIncomingPacket(message); // change ConsoleTarget's level to Level.Dump in program.cs if u want to see messages on console. - if (message.Id == 96 || message.Id == 369 || message.Id == 269) + if (message.Id is 96 or 369 or 269) message.Consumer = Consumers.Inventory; if (message.Consumer != Consumers.None) { @@ -96,7 +86,7 @@ namespace DiIiS_NA.GameServer.ClientSystem else Game.Route(this, message); } - else if (message is ISelfHandler) (message as ISelfHandler).Handle(this); // if message is able to handle itself, let it do so. + else if (message is ISelfHandler handler) handler.Handle(this); // if message is able to handle itself, let it do so. else if (message.Id != 217) Logger.Warn("{0} - ID:{1} has no consumer or self-handler.", message.GetType().Name, message.Id); @@ -107,9 +97,9 @@ namespace DiIiS_NA.GameServer.ClientSystem } } - _incomingBuffer.Position = end; + incomingBuffer.Position = end; } - _incomingBuffer.ConsumeData(); + incomingBuffer.ConsumeData(); //Thread.Sleep(5); } catch (Exception ex) @@ -125,14 +115,15 @@ namespace DiIiS_NA.GameServer.ClientSystem //} } - private int LastReplicatedTick = 0; - + public void SendMessage(Opcodes opcode) => SendMessage(new SimpleMessage(opcode)); + + private int _lastReplicatedTick; public virtual void SendMessage(GameMessage message) { //System.Threading.Thread.Sleep(50); lock (_outgoingBuffer) { - if (Game.TickCounter > LastReplicatedTick && TickingEnabled && !(message is GameTickMessage) /*&& !(message is EndOfTickMessage)*/ && !Player.BetweenWorlds) + if (Game.TickCounter > _lastReplicatedTick && TickingEnabled && message is not GameTickMessage /*&& !(message is EndOfTickMessage)*/ && !Player.BetweenWorlds) { /*var endMessage = new EndOfTickMessage() { @@ -143,12 +134,12 @@ namespace DiIiS_NA.GameServer.ClientSystem _outgoingBuffer.EncodeMessage(endMessage); Connection.Send(_outgoingBuffer.GetPacketAndReset());*/ - LastReplicatedTick = Game.TickCounter; + _lastReplicatedTick = Game.TickCounter; var tickMessage = new GameTickMessage(Game.TickCounter); Logger.LogOutgoingPacket(tickMessage); _outgoingBuffer.EncodeMessage(tickMessage); Connection.Send(_outgoingBuffer.GetPacketAndReset()); - dataSent = false; + _dataSent = false; } //if (message is GameTickMessage) //message = new GameTickMessage(this.Game.TickCounter); //reassigning new tick value @@ -160,17 +151,14 @@ namespace DiIiS_NA.GameServer.ClientSystem var data = _outgoingBuffer.GetPacketAndReset(); Connection.Send(data); } - dataSent = true; + _dataSent = true; //if (flushImmediately) this.SendTick(); } } - public void SendBytes(byte[] data) - { - Connection.Send(data); - } + public void SendBytes(byte[] data) => Connection.Send(data); - protected bool dataSent = true; + private bool _dataSent = true; public bool OpenWorldDefined = false; @@ -179,9 +167,9 @@ namespace DiIiS_NA.GameServer.ClientSystem //if (_outgoingBuffer.Length <= 32) return; lock (_outgoingBuffer) { - if (!dataSent) return; + if (!_dataSent) return; - if (TickingEnabled && Game.TickCounter > LastReplicatedTick) + if (TickingEnabled && Game.TickCounter > _lastReplicatedTick) { /*this.SendMessage(new EndOfTickMessage() { @@ -189,14 +177,14 @@ namespace DiIiS_NA.GameServer.ClientSystem Field1 = this.LastReplicatedTick }); // send the tick end.*/ SendMessage(new GameTickMessage(Game.TickCounter)); // send the tick. - LastReplicatedTick = Game.TickCounter; + _lastReplicatedTick = Game.TickCounter; //this.SendMessage(new GameTickMessage(0)); //before client enters game causes freeze with PvP scoreboard /*this.SendMessage(new EndOfTickMessage() { Field0 = this.Game.TickCounter, Field1 = 0 }); // send the tick end*/ - dataSent = false; + _dataSent = false; FlushOutgoingBuffer(); } } @@ -213,4 +201,21 @@ namespace DiIiS_NA.GameServer.ClientSystem } } } + + public static class OpcodesExtensions + { + /// + /// Sends a simple message with the given opcode. + /// + /// The opcode + /// The InGameClients + public static void SendTo(this Opcodes opcode, params GameClient[] clients) { foreach (var client in clients) client.SendMessage(opcode); } + + /// + /// Sends a message with a given opcode. + /// + /// Message to send to client + /// The InGameClients + public static void SendTo(this GameMessage message, params GameClient[] clients) { foreach (var client in clients) client.SendMessage(message); } + } } diff --git a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/TeleportCommand.cs b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/TeleportCommand.cs index 389061c..9a66a05 100644 --- a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/TeleportCommand.cs +++ b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/TeleportCommand.cs @@ -50,10 +50,10 @@ public class TeleportCommand : CommandGroup { var trigger = invokerClient.InGameClient.Player.World.Game.SideQuestProgress.GlobalQuestTriggers[levelArea]; - if (trigger.triggerType == QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == QuestStepObjectiveType.EnterLevelArea) try { - trigger.questEvent.Execute(invokerClient.InGameClient.Player.World); // launch a questEvent + trigger.QuestEvent.Execute(invokerClient.InGameClient.Player.World); // launch a questEvent } catch { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Gizmo.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Gizmo.cs index 687c300..1053c42 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Gizmo.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Gizmo.cs @@ -41,13 +41,13 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem if (World.Game.QuestProgress.QuestTriggers.ContainsKey((int)SNO)) { var trigger = World.Game.QuestProgress.QuestTriggers[(int)SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) { World.Game.QuestProgress.UpdateCounter((int)SNO); - if (trigger.count == World.Game.QuestProgress.QuestTriggers[(int)SNO].counter) + if (trigger.Count == World.Game.QuestProgress.QuestTriggers[(int)SNO].Counter) try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { @@ -58,23 +58,23 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem else if (World.Game.SideQuestProgress.QuestTriggers.ContainsKey((int)SNO)) { var trigger = World.Game.SideQuestProgress.QuestTriggers[(int)SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) { World.Game.SideQuestProgress.UpdateSideCounter((int)SNO); - if (trigger.count == World.Game.SideQuestProgress.QuestTriggers[(int)SNO].counter) - trigger.questEvent.Execute(World); // launch a questEvent + if (trigger.Count == World.Game.SideQuestProgress.QuestTriggers[(int)SNO].Counter) + trigger.QuestEvent.Execute(World); // launch a questEvent } } if (World.Game.SideQuestProgress.GlobalQuestTriggers.ContainsKey((int)SNO)) { var trigger = World.Game.SideQuestProgress.GlobalQuestTriggers[(int)SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) { World.Game.SideQuestProgress.UpdateGlobalCounter((int)SNO); - if (trigger.count == World.Game.SideQuestProgress.GlobalQuestTriggers[(int)SNO].counter) + if (trigger.Count == World.Game.SideQuestProgress.GlobalQuestTriggers[(int)SNO].Counter) try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent World.Game.SideQuestProgress.GlobalQuestTriggers.Remove((int)SNO); } catch (Exception e) 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 c7f147e..6725480 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/DesctructibleLootContainer.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/DesctructibleLootContainer.cs @@ -120,14 +120,14 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations if (World.Game.QuestProgress.QuestTriggers.ContainsKey((int)SNO)) { var trigger = World.Game.QuestProgress.QuestTriggers[(int)SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster) { World.Game.QuestProgress.UpdateCounter((int)SNO); - if (trigger.count == World.Game.QuestProgress.QuestTriggers[(int)SNO].counter) - trigger.questEvent.Execute(World); // launch a questEvent + if (trigger.Count == World.Game.QuestProgress.QuestTriggers[(int)SNO].Counter) + trigger.QuestEvent.Execute(World); // launch a questEvent } else - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup) { World.Game.QuestProgress.UpdateCounter((int)SNO); } @@ -135,11 +135,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations else if (World.Game.SideQuestProgress.QuestTriggers.ContainsKey((int)SNO)) { var trigger = World.Game.SideQuestProgress.QuestTriggers[(int)SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster) { World.Game.SideQuestProgress.UpdateSideCounter((int)SNO); - if (trigger.count == World.Game.SideQuestProgress.QuestTriggers[(int)SNO].counter) - trigger.questEvent.Execute(World); // launch a questEvent + if (trigger.Count == World.Game.SideQuestProgress.QuestTriggers[(int)SNO].Counter) + trigger.QuestEvent.Execute(World); // launch a questEvent } } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/LootRunPortal.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/LootRunPortal.cs index ddde9ac..4714613 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/LootRunPortal.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/LootRunPortal.cs @@ -96,11 +96,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations if (World.Game.QuestProgress.QuestTriggers.ContainsKey(Destination.DestLevelAreaSNO)) //EnterLevelArea { var trigger = World.Game.QuestProgress.QuestTriggers[Destination.DestLevelAreaSNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) { try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { @@ -111,11 +111,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations if (World.Game.SideQuestProgress.QuestTriggers.ContainsKey(Destination.DestLevelAreaSNO)) //EnterLevelArea { var trigger = World.Game.SideQuestProgress.QuestTriggers[Destination.DestLevelAreaSNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) { try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { @@ -126,11 +126,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations if (World.Game.SideQuestProgress.GlobalQuestTriggers.ContainsKey(Destination.DestLevelAreaSNO)) //EnterLevelArea { var trigger = World.Game.SideQuestProgress.GlobalQuestTriggers[Destination.DestLevelAreaSNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) { try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent World.Game.SideQuestProgress.GlobalQuestTriggers.Remove(Destination.DestLevelAreaSNO); } catch (Exception e) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Waypoint.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Waypoint.cs index e23dfc2..bdd51ea 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Waypoint.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Waypoint.cs @@ -118,13 +118,13 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations if (World.Game.QuestProgress.QuestTriggers.ContainsKey((int)SNO)) { var trigger = World.Game.QuestProgress.QuestTriggers[(int)SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) { World.Game.QuestProgress.UpdateCounter((int)SNO); - if (trigger.count == World.Game.QuestProgress.QuestTriggers[(int)SNO * (-1)].counter) + if (trigger.Count == World.Game.QuestProgress.QuestTriggers[(int)SNO * (-1)].Counter) try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/InteractiveNPC.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/InteractiveNPC.cs index 99167e5..ec5019a 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/InteractiveNPC.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/InteractiveNPC.cs @@ -234,13 +234,13 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem if (World.Game.QuestProgress.QuestTriggers.ContainsKey((int)SNO)) { var trigger = World.Game.QuestProgress.QuestTriggers[(int)SNO]; - if (trigger.triggerType == QuestStepObjectiveType.InteractWithActor) + if (trigger.TriggerType == QuestStepObjectiveType.InteractWithActor) { World.Game.QuestProgress.UpdateCounter((int)SNO); - if (trigger.count == World.Game.QuestProgress.QuestTriggers[(int)SNO].counter) + if (trigger.Count == World.Game.QuestProgress.QuestTriggers[(int)SNO].Counter) try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Portal.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Portal.cs index 7f164e6..67b2711 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Portal.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Portal.cs @@ -1481,11 +1481,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem if (World.Game.QuestProgress.QuestTriggers.ContainsKey(Destination.DestLevelAreaSNO)) //EnterLevelArea { var trigger = World.Game.QuestProgress.QuestTriggers[Destination.DestLevelAreaSNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) { try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { @@ -1496,11 +1496,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem if (World.Game.SideQuestProgress.QuestTriggers.ContainsKey(Destination.DestLevelAreaSNO)) //EnterLevelArea { var trigger = World.Game.SideQuestProgress.QuestTriggers[Destination.DestLevelAreaSNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) { try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { @@ -1511,11 +1511,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem if (World.Game.SideQuestProgress.GlobalQuestTriggers.ContainsKey(Destination.DestLevelAreaSNO)) //EnterLevelArea { var trigger = World.Game.SideQuestProgress.GlobalQuestTriggers[Destination.DestLevelAreaSNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) { try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent World.Game.SideQuestProgress.GlobalQuestTriggers.Remove(Destination.DestLevelAreaSNO); } catch (Exception e) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/StaticItem.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/StaticItem.cs index 1944704..4b3a78f 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/StaticItem.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/StaticItem.cs @@ -35,13 +35,13 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem if (World.Game.QuestProgress.QuestTriggers.ContainsKey((int)SNO)) { var trigger = World.Game.QuestProgress.QuestTriggers[(int)SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor) { World.Game.QuestProgress.UpdateCounter((int)SNO); - if (trigger.count == World.Game.QuestProgress.QuestTriggers[(int)SNO].counter) + if (trigger.Count == World.Game.QuestProgress.QuestTriggers[(int)SNO].Counter) try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs index e01e328..f952a83 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs @@ -1573,11 +1573,11 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem if (QuestProgress.QuestTriggers.ContainsKey(levelArea)) //EnterLevelArea { var trigger = QuestProgress.QuestTriggers[levelArea]; - if (trigger.triggerType == QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == QuestStepObjectiveType.EnterLevelArea) { try { - trigger.questEvent.Execute(encWorld); // launch a questEvent + trigger.QuestEvent.Execute(encWorld); // launch a questEvent } catch (Exception e) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs index b06ce7b..ea1ac37 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs @@ -553,7 +553,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem if (Game.QuestProgress.QuestTriggers.Count == 1) { var trigger = Game.QuestProgress.QuestTriggers.First(); - switch (trigger.Value.triggerType) + switch (trigger.Value.TriggerType) { case QuestStepObjectiveType.InteractWithActor: { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/ConversationManager.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/ConversationManager.cs index 6699a5a..1ed0371 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/ConversationManager.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/ConversationManager.cs @@ -279,11 +279,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem if (player.World.Game.QuestProgress.QuestTriggers.ContainsKey(SNOId)) { var trigger = player.World.Game.QuestProgress.QuestTriggers[SNOId]; - if (trigger.triggerType == QuestStepObjectiveType.HadConversation) + if (trigger.TriggerType == QuestStepObjectiveType.HadConversation) { try { - trigger.questEvent.Execute(player.World); // launch a questEvent + trigger.QuestEvent.Execute(player.World); // launch a questEvent } catch (Exception e) { @@ -295,11 +295,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem if (player.World.Game.SideQuestProgress.QuestTriggers.ContainsKey(SNOId)) //EnterLevelArea { var trigger = player.World.Game.SideQuestProgress.QuestTriggers[SNOId]; - if (trigger.triggerType == QuestStepObjectiveType.HadConversation) + if (trigger.TriggerType == QuestStepObjectiveType.HadConversation) { try { - trigger.questEvent.Execute(player.World); // launch a questEvent + trigger.QuestEvent.Execute(player.World); // launch a questEvent } catch (Exception e) { @@ -311,11 +311,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem if (player.World.Game.SideQuestProgress.GlobalQuestTriggers.ContainsKey(SNOId)) { var trigger = player.World.Game.SideQuestProgress.GlobalQuestTriggers[SNOId]; - if (trigger.triggerType == QuestStepObjectiveType.HadConversation) + if (trigger.TriggerType == QuestStepObjectiveType.HadConversation) { try { - trigger.questEvent.Execute(player.World); // launch a questEvent + trigger.QuestEvent.Execute(player.World); // launch a questEvent player.World.Game.SideQuestProgress.GlobalQuestTriggers.Remove(SNOId); } catch (Exception e) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs index 572dbf6..4fc04e6 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs @@ -104,7 +104,7 @@ public class Player : Actor, IMessageConsumer, IUpdateable public int PreSceneId = -1; - public List NecroSkeletons = new() { }; + public List NecromancerSkeletons = new() { }; public bool ActiveSkeletons = false; public Actor ActiveGolem = null; @@ -2663,11 +2663,11 @@ public class Player : Actor, IMessageConsumer, IUpdateable if (World.Game.QuestProgress.QuestTriggers.ContainsKey(levelArea)) //EnterLevelArea { var trigger = World.Game.QuestProgress.QuestTriggers[levelArea]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) try { Logger.MethodTrace($"EnterLevelArea: {levelArea}"); - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { @@ -2749,10 +2749,10 @@ public class Player : Actor, IMessageConsumer, IUpdateable if (World.Game.QuestProgress.QuestTriggers.ContainsKey(levelArea)) //EnterLevelArea { var trigger = World.Game.QuestProgress.QuestTriggers[levelArea]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { @@ -2988,19 +2988,21 @@ public class Player : Actor, IMessageConsumer, IUpdateable TimedActions.Add(TickTimer.WaitSeconds(World.Game, seconds, onTimeout)); } + private bool DisconnectIdle() + { + if (!GameServerConfig.Instance.AfkDisconnect || InGameClient.Game.TickCounter - LastMovementTick <= 54000) + return false; + + Logger.Warn($"Player $[underline white]${Name}$[/]$ disconnected for being AFK."); + Opcodes.CloseGameMessage.SendTo(InGameClient); + return true; + + } public void Update(int tickCounter) { if (BetweenWorlds) return; - -#if DEBUG -#else - if ((this.InGameClient.Game.TickCounter - this.LastMovementTick) > 54000) //15m AFK - { - - this.InGameClient.SendMessage(new SimpleMessage(Opcodes.CloseGameMessage)); - } -#endif - + if (DisconnectIdle()) return; + // Check the gold if (InGameClient.Game.TickCounter % 120 == 0 && World != null && GoldCollectedTempCount > 0) { @@ -3069,18 +3071,16 @@ public class Player : Actor, IMessageConsumer, IUpdateable // Check if there is an conversation to close in this tick Conversations.Update(World.Game.TickCounter); - foreach (var proximityGizmo in GetObjectsInRange(20f, true)) + foreach (var proximityGizmo in GetObjectsInRange(20f, true).Where(proximityGizmo => proximityGizmo != null && proximityGizmo.SNO != ActorSno.__NONE)) { - if (proximityGizmo == null || proximityGizmo.SNO == ActorSno.__NONE) continue; - if (World.Game.QuestProgress.QuestTriggers.ContainsKey((int)proximityGizmo.SNO) && - proximityGizmo.Visible) //EnterTrigger + if (World.Game.QuestProgress.QuestTriggers.ContainsKey((int)proximityGizmo.SNO) && proximityGizmo.Visible) //EnterTrigger { var trigger = World.Game.QuestProgress.QuestTriggers[(int)proximityGizmo.SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger) //this.World.Game.Quests.NotifyQuest(this.World.Game.CurrentQuest, Mooege.Common.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger, proximityGizmo.ActorSNO.Id); try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent } catch (Exception e) { @@ -3090,11 +3090,11 @@ public class Player : Actor, IMessageConsumer, IUpdateable else if (World.Game.SideQuestProgress.QuestTriggers.ContainsKey((int)proximityGizmo.SNO)) { var trigger = World.Game.SideQuestProgress.QuestTriggers[(int)proximityGizmo.SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger) { World.Game.SideQuestProgress.UpdateSideCounter((int)proximityGizmo.SNO); - if (trigger.count == World.Game.SideQuestProgress.QuestTriggers[(int)proximityGizmo.SNO].counter) - trigger.questEvent.Execute(World); // launch a questEvent + if (trigger.Count == World.Game.SideQuestProgress.QuestTriggers[(int)proximityGizmo.SNO].Counter) + trigger.QuestEvent.Execute(World); // launch a questEvent } } @@ -3102,11 +3102,11 @@ public class Player : Actor, IMessageConsumer, IUpdateable proximityGizmo.Visible) //EnterTrigger { var trigger = World.Game.SideQuestProgress.GlobalQuestTriggers[(int)proximityGizmo.SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger) //this.World.Game.Quests.NotifyQuest(this.World.Game.CurrentQuest, Mooege.Common.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger, proximityGizmo.ActorSNO.Id); try { - trigger.questEvent.Execute(World); // launch a questEvent + trigger.QuestEvent.Execute(World); // launch a questEvent World.Game.SideQuestProgress.GlobalQuestTriggers.Remove((int)proximityGizmo.SNO); } catch (Exception e) @@ -3159,22 +3159,21 @@ public class Player : Actor, IMessageConsumer, IUpdateable } #region Necromancer summons - - var switcherToBool = false; - var switcherToBool2 = false; - ActiveSkillSavedData nowSkillGolen = null; + // ActiveSkillSavedData nowSkillGolen = null; - removed by @iamdroppy - not used in any path; written once, never read + var hasActiveSkeletons = false; + var hasActiveGolem = false; foreach (var skill in SkillSet.ActiveSkills) if (skill.snoSkill == 453801) - switcherToBool = true; + hasActiveSkeletons = true; foreach (var skill in SkillSet.ActiveSkills) if (skill.snoSkill == 451537) { - switcherToBool2 = true; - nowSkillGolen = skill; + hasActiveGolem = true; + // nowSkillGolen = skill; - removed by @iamdroppy - not used in any path; written once, never read } - ActiveSkeletons = switcherToBool; - EnableGolem = switcherToBool2; + ActiveSkeletons = hasActiveSkeletons; + EnableGolem = hasActiveGolem; var killer = new PowerContext @@ -3186,9 +3185,9 @@ public class Player : Actor, IMessageConsumer, IUpdateable if (ActiveSkeletons) { - if (Followers.All(s => s.Value != ActorSno._p6_necro_commandskeletons_a) && NecroSkeletons.Any()) + if (Followers.All(s => s.Value != ActorSno._p6_necro_commandskeletons_a) && NecromancerSkeletons.Any()) { - foreach (var skeleton in NecroSkeletons) + foreach (var skeleton in NecromancerSkeletons) { try { @@ -3201,17 +3200,18 @@ public class Player : Actor, IMessageConsumer, IUpdateable catch{} } - NecroSkeletons.Clear(); + NecromancerSkeletons.Clear(); } - while (NecroSkeletons.Count < 7) + while (NecromancerSkeletons.Count < 7) { - var necroSkeleton = new NecromancerSkeleton_A(World, ActorSno._p6_necro_commandskeletons_a, this); - necroSkeleton.Brain.DeActivate(); - necroSkeleton.Scale = 1.2f; + var necromancerSkeleton = new NecromancerSkeleton_A(World, ActorSno._p6_necro_commandskeletons_a, this); + necromancerSkeleton.Brain.DeActivate(); + necromancerSkeleton.Scale = 1.2f; - necroSkeleton.EnterWorld(PowerContext.RandomDirection(Position, 3f, 8f)); - NecroSkeletons.Add(necroSkeleton); - /*this.InGameClient.SendMessage(new PetMessage() + necromancerSkeleton.EnterWorld(PowerContext.RandomDirection(Position, 3f, 8f)); + NecromancerSkeletons.Add(necromancerSkeleton); + /* + this.InGameClient.SendMessage(new PetMessage() { Owner = this.PlayerIndex, Index = this.CountFollowers(473147), @@ -3219,21 +3219,21 @@ public class Player : Actor, IMessageConsumer, IUpdateable Type = 70, }); //*/ - necroSkeleton.Brain.Activate(); + necromancerSkeleton.Brain.Activate(); } } else { - foreach (var skel in NecroSkeletons) + foreach (var necromancerSkeleton in NecromancerSkeletons) { InGameClient.SendMessage(new PetDetachMessage() { - PetId = skel.GlobalID + PetId = necromancerSkeleton.GlobalID }); - World.Leave(skel); + World.Leave(necromancerSkeleton); } - NecroSkeletons.Clear(); + NecromancerSkeletons.Clear(); } if (EnableGolem || ActiveGolem != null) @@ -4084,7 +4084,7 @@ public class Player : Actor, IMessageConsumer, IUpdateable }, SkillSlotEverAssigned = 0x0F, //0xB4, PlaytimeTotal = Toon.TimePlayed, - WaypointFlags = GameServerConfig.Instance.UnlockAllWaypoints ? 0x0000ffff : this.World.Game.WaypointFlags, + WaypointFlags = GameServerConfig.Instance.UnlockAllWaypoints ? 0x0000ffff : World.Game.WaypointFlags, HirelingData = new HirelingSavedData() { HirelingInfos = HirelingInfo, diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/General/TownTeleport.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/General/TownTeleport.cs index 8d5bd37..4b0f5b7 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/General/TownTeleport.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/General/TownTeleport.cs @@ -60,11 +60,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations if (User.World.Game.QuestProgress.QuestTriggers.ContainsKey(town_levelArea)) //EnterLevelArea { var trigger = User.World.Game.QuestProgress.QuestTriggers[town_levelArea]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea) { try { - trigger.questEvent.Execute(User.World); // launch a questEvent + trigger.QuestEvent.Execute(User.World); // launch a questEvent } catch (Exception e) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Necromancer.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Necromancer.cs index fa2aea0..7628543 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Necromancer.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Necromancer.cs @@ -2005,7 +2005,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations } - foreach (var skeleton in ((Player)User).NecroSkeletons) + foreach (var skeleton in ((Player)User).NecromancerSkeletons) { //User.PlayEffectGroup(474172); ActorMover mover = new ActorMover(skeleton); 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 f957c7c..a14164a 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs @@ -119,7 +119,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads { PetId = skeletonA.DynamicID(skeletonA.Master as Player) }); - masterPlr.NecroSkeletons.Remove(skeletonA); + masterPlr.NecromancerSkeletons.Remove(skeletonA); } if (Target is Minion { Master: Player masterPlr2 } @@ -600,13 +600,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads if (Target.World.Game.QuestProgress.QuestTriggers.ContainsKey((int)Target.SNO)) { var trigger = Target.World.Game.QuestProgress.QuestTriggers[(int)Target.SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster) { Target.World.Game.QuestProgress.UpdateCounter((int)Target.SNO); - if (trigger.count == Target.World.Game.QuestProgress.QuestTriggers[(int)Target.SNO].counter) - trigger.questEvent.Execute(Target.World); // launch a questEvent + if (trigger.Count == Target.World.Game.QuestProgress.QuestTriggers[(int)Target.SNO].Counter) + trigger.QuestEvent.Execute(Target.World); // launch a questEvent } - else if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup) + else if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup) { Target.World.Game.QuestProgress.UpdateCounter((int)Target.SNO); } @@ -614,11 +614,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads else if (Target.World.Game.SideQuestProgress.QuestTriggers.ContainsKey((int)Target.SNO)) { var trigger = Target.World.Game.SideQuestProgress.QuestTriggers[(int)Target.SNO]; - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster) { Target.World.Game.SideQuestProgress.UpdateSideCounter((int)Target.SNO); - if (trigger.count == Target.World.Game.SideQuestProgress.QuestTriggers[(int)Target.SNO].counter) - trigger.questEvent.Execute(Target.World); // launch a questEvent + if (trigger.Count == Target.World.Game.SideQuestProgress.QuestTriggers[(int)Target.SNO].Counter) + trigger.QuestEvent.Execute(Target.World); // launch a questEvent } } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestProgress.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestProgress.cs index 1951e36..30aaa07 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestProgress.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestProgress.cs @@ -21,10 +21,10 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem public struct QuestTrigger { - public DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType triggerType; - public int count; - public int counter; - public QuestEvent questEvent; + public DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType TriggerType; + public int Count; + public int Counter; + public QuestEvent QuestEvent; } public class Quest @@ -88,19 +88,19 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem protected void ListenConversation(int convId, QuestEvent qevent) { QuestTriggers.TryAdd(convId, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.HadConversation, count = 1, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.HadConversation, Count = 1, Counter = 0, QuestEvent = qevent }); } protected void GlobalListenConversation(int convId, QuestEvent qevent) { GlobalQuestTriggers.TryAdd(convId, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.HadConversation, count = 1, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.HadConversation, Count = 1, Counter = 0, QuestEvent = qevent }); } protected void ListenKill(ActorSno monsterSno, int monsterCount, QuestEvent qevent) { QuestTriggers.TryAdd((int)monsterSno, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster, count = monsterCount, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster, Count = monsterCount, Counter = 0, QuestEvent = qevent }); } public void ActiveArrow(World world, ActorSno sno, WorldSno destworld = WorldSno.__NONE) @@ -192,40 +192,40 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem protected void ListenKillBonus(ActorSno monsterSno, int monsterCount, QuestEvent qevent) { QuestTriggers.TryAdd((int)monsterSno, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup, count = monsterCount, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup, Count = monsterCount, Counter = 0, QuestEvent = qevent }); } protected void ListenTeleport(int laId, QuestEvent qevent) { QuestTriggers.TryAdd(laId, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea, count = 1, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea, Count = 1, Counter = 0, QuestEvent = qevent }); } protected void GlobalListenTeleport(int laId, QuestEvent qevent) { GlobalQuestTriggers.TryAdd(laId, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea, count = 1, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterLevelArea, Count = 1, Counter = 0, QuestEvent = qevent }); } protected void ListenProximity(ActorSno actorSno, QuestEvent qevent) { QuestTriggers.TryAdd((int)actorSno, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger, count = 1, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.EnterTrigger, Count = 1, Counter = 0, QuestEvent = qevent }); } protected void ListenInteract(ActorSno actorSno, int actorCount, QuestEvent qevent) { QuestTriggers.TryAdd((int)actorSno, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor, count = actorCount, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor, Count = actorCount, Counter = 0, QuestEvent = qevent }); } protected void ListenInteractBonus(ActorSno actorSno, int actorCount, int counter, QuestEvent qevent) { QuestTriggers.TryAdd((int)actorSno, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor, count = actorCount, counter = counter, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor, Count = actorCount, Counter = counter, QuestEvent = qevent }); } protected void GlobalListenInteract(ActorSno actorSno, int actorCount, QuestEvent qevent) { GlobalQuestTriggers.TryAdd((int)actorSno, - new QuestTrigger { triggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor, count = actorCount, counter = 0, questEvent = qevent }); + new QuestTrigger { TriggerType = DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor, Count = actorCount, Counter = 0, QuestEvent = qevent }); } protected void UnlockTeleport(int waypointId) @@ -236,30 +236,30 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem public void UpdateCounter(int dataId) { var trigger = QuestTriggers[dataId]; - trigger.counter++; + trigger.Counter++; QuestTriggers[dataId] = trigger; - if (trigger.counter <= trigger.count) - if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup) - Game.QuestManager.NotifyBonus(trigger.counter, (trigger.counter >= trigger.count)); - else if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor && dataId == 3628) - Game.QuestManager.NotifyBonus(trigger.counter, (trigger.counter >= trigger.count)); + if (trigger.Counter <= trigger.Count) + if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup) + Game.QuestManager.NotifyBonus(trigger.Counter, (trigger.Counter >= trigger.Count)); + else if (trigger.TriggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor && dataId == 3628) + Game.QuestManager.NotifyBonus(trigger.Counter, (trigger.Counter >= trigger.Count)); else - Game.QuestManager.NotifyQuest(trigger.counter, (trigger.counter >= trigger.count)); + Game.QuestManager.NotifyQuest(trigger.Counter, (trigger.Counter >= trigger.Count)); } public void UpdateSideCounter(int dataId) { var trigger = QuestTriggers[dataId]; - trigger.counter++; + trigger.Counter++; QuestTriggers[dataId] = trigger; - if (trigger.counter <= trigger.count) - Game.QuestManager.NotifySideQuest(trigger.counter, (trigger.counter >= trigger.count)); + if (trigger.Counter <= trigger.Count) + Game.QuestManager.NotifySideQuest(trigger.Counter, (trigger.Counter >= trigger.Count)); } public void UpdateGlobalCounter(int dataId) { var trigger = GlobalQuestTriggers[dataId]; - trigger.counter++; + trigger.Counter++; GlobalQuestTriggers[dataId] = trigger; } diff --git a/src/DiIiS-NA/D3-GameServer/GameServerConfig.cs b/src/DiIiS-NA/D3-GameServer/GameServerConfig.cs index feff5ed..19863b7 100644 --- a/src/DiIiS-NA/D3-GameServer/GameServerConfig.cs +++ b/src/DiIiS-NA/D3-GameServer/GameServerConfig.cs @@ -56,6 +56,16 @@ namespace DiIiS_NA.GameServer set => Set(nameof(IWServer), value); } + public bool AfkDisconnect + { +#if DEBUG + get => GetBoolean(nameof(AfkDisconnect), false); +#else + get => GetBoolean(nameof(AfkTimeoutEnabled), true); +#endif + set => Set(nameof(AfkDisconnect), value); + } + #region Game Mods ///