Afk disconnect now configurable (not limited to DEBUG/RELEASE), opcodes/gamemessage extensions, static refactoring, QuestTrigger improvements, small GameClient.cs and Player.cs improvements.

This commit is contained in:
Lucca Faria Ferri 2023-02-16 19:56:14 -08:00
parent e8c75545c7
commit 8d8576f4e7
18 changed files with 195 additions and 180 deletions

View File

@ -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
{
/// <summary>
/// Sends a simple message with the given opcode.
/// </summary>
/// <param name="opcode">The opcode</param>
/// <param name="clients">The InGameClients</param>
public static void SendTo(this Opcodes opcode, params GameClient[] clients) { foreach (var client in clients) client.SendMessage(opcode); }
/// <summary>
/// Sends a message with a given opcode.
/// </summary>
/// <param name="message">Message to send to client</param>
/// <param name="clients">The InGameClients</param>
public static void SendTo(this GameMessage message, params GameClient[] clients) { foreach (var client in clients) client.SendMessage(message); }
}
}

View File

@ -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
{

View File

@ -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)

View File

@ -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
}
}

View File

@ -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)

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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:
{

View File

@ -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)

View File

@ -104,7 +104,7 @@ public class Player : Actor, IMessageConsumer, IUpdateable
public int PreSceneId = -1;
public List<Actor> NecroSkeletons = new() { };
public List<Actor> 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,18 +2988,20 @@ 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<Actor>(20f, true))
foreach (var proximityGizmo in GetObjectsInRange<Actor>(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,

View File

@ -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)
{

View File

@ -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);

View File

@ -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
}
}

View File

@ -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;
}

View File

@ -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
/// <summary>