mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-10 07:13:58 -05:00
lots of fixes :)
This commit is contained in:
@ -689,7 +689,6 @@ namespace SharedLibraryCore.Commands
|
||||
|
||||
public override async Task ExecuteAsync(GameEvent E)
|
||||
{
|
||||
// todo: move unflag to seperate command
|
||||
if (E.Target.Level >= E.Origin.Level)
|
||||
{
|
||||
await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FLAG_FAIL"]} ^5{E.Target.Name}");
|
||||
|
@ -33,8 +33,8 @@ namespace SharedLibraryCore
|
||||
Command,
|
||||
|
||||
// FROM GAME
|
||||
Script,
|
||||
ScriptDamage,
|
||||
ScriptKill,
|
||||
Kill,
|
||||
Damage,
|
||||
Death,
|
||||
@ -49,35 +49,19 @@ namespace SharedLibraryCore
|
||||
Owner = S;
|
||||
OnProcessed = new ManualResetEventSlim();
|
||||
Time = DateTime.UtcNow;
|
||||
CurrentEventId++;
|
||||
Id = CurrentEventId;
|
||||
}
|
||||
|
||||
public GameEvent()
|
||||
{
|
||||
OnProcessed = new ManualResetEventSlim();
|
||||
Time = DateTime.UtcNow;
|
||||
CurrentEventId++;
|
||||
Id = CurrentEventId;
|
||||
}
|
||||
|
||||
public static GameEvent TransferWaiter(EventType newType, GameEvent e)
|
||||
{
|
||||
var newEvent = new GameEvent()
|
||||
{
|
||||
Data = e.Data,
|
||||
Extra = e.Extra,
|
||||
Message = e.Message,
|
||||
OnProcessed = e.OnProcessed,
|
||||
Origin = e.Origin,
|
||||
Owner = e.Owner,
|
||||
Remote = e.Remote,
|
||||
Target = e.Target,
|
||||
Type = newType,
|
||||
};
|
||||
|
||||
// hack: prevent the previous event from completing until this one is done
|
||||
e.OnProcessed = new ManualResetEventSlim();
|
||||
newEvent.Time = e.Time;
|
||||
|
||||
return newEvent;
|
||||
}
|
||||
private static long CurrentEventId;
|
||||
|
||||
public EventType Type;
|
||||
public string Data; // Data is usually the message sent by player
|
||||
@ -89,5 +73,6 @@ namespace SharedLibraryCore
|
||||
public object Extra { get; set; }
|
||||
public ManualResetEventSlim OnProcessed { get; set; }
|
||||
public DateTime Time { get; private set; }
|
||||
public long Id { get; private set; }
|
||||
}
|
||||
}
|
||||
|
@ -48,16 +48,41 @@ namespace SharedLibraryCore.Helpers
|
||||
{
|
||||
double deltaX = Math.Abs(b.X -a.X);
|
||||
double deltaY = Math.Abs(b.Y - a.Y);
|
||||
// double deltaZ = Math.Abs(b.Z - a.Z);
|
||||
double deltaZ = Math.Abs(b.Z - a.Z);
|
||||
|
||||
// this 'fixes' the roll-over angles
|
||||
double dx = deltaX < 360.0 / 2 ? deltaX : 360.0 - deltaX;
|
||||
double dy = deltaY < 360.0 / 2 ? deltaY : 360.0 - deltaY;
|
||||
// double dz = deltaZ < 360.0 / 2 ? deltaZ : 360.0 - deltaZ;
|
||||
double dz = deltaZ < 360.0 / 2 ? deltaZ : 360.0 - deltaZ;
|
||||
|
||||
return Math.Sqrt((dx * dx) + (dy * dy) /*+ (dz * dz)*/);
|
||||
}
|
||||
|
||||
public static double ViewAngleDistance(Vector3 a, Vector3 b, Vector3 c)
|
||||
{
|
||||
double dabX = Math.Abs(a.X - b.X);
|
||||
dabX = dabX < 360.0 / 2 ? dabX : 360.0 - dabX;
|
||||
double dabY = Math.Abs(a.Y - b.Y);
|
||||
dabY = dabY < 360.0 / 2 ? dabY : 360.0 - dabY;
|
||||
|
||||
double dacX = Math.Abs(a.X - c.X);
|
||||
dacX = dacX < 360.0 / 2 ? dacX : 360.0 - dacX;
|
||||
double dacY = Math.Abs(a.Y - c.Y);
|
||||
dacY = dacY < 360.0 / 2 ? dacY : 360.0 - dacY;
|
||||
|
||||
double dbcX = Math.Abs(b.X - c.X);
|
||||
dbcX = dbcX < 360.0 / 2 ? dbcX : 360.0 - dbcX;
|
||||
double dbcY = Math.Abs(b.Y - c.Y);
|
||||
dbcY = dbcY < 360.0 / 2 ? dbcY : 360.0 - dbcY;
|
||||
|
||||
double deltaX = (dabX - dacX - dbcX) / 2.0;
|
||||
deltaX = deltaX < 360.0 / 2 ? deltaX : 360.0 - deltaX;
|
||||
double deltaY = (dabY - dacY - dbcY) / 2.0;
|
||||
deltaY = deltaY < 360.0 / 2 ? deltaY : 360.0 - deltaY;
|
||||
|
||||
return Math.Round(Math.Sqrt((deltaX * deltaX) + (deltaY * deltaY)), 4);
|
||||
}
|
||||
|
||||
public static Vector3 Subtract(Vector3 a, Vector3 b) => new Vector3(b.X - a.X, b.Y - a.Y, b.Z - a.Z);
|
||||
|
||||
public double DotProduct(Vector3 a) => (a.X * this.X) + (a.Y * this.Y) + (a.Z * this.Z);
|
||||
|
@ -40,20 +40,25 @@ namespace SharedLibraryCore.Objects
|
||||
|
||||
public async Task Tell(String Message)
|
||||
{
|
||||
|
||||
// await CurrentServer.Tell(Message, this);
|
||||
var e = new GameEvent()
|
||||
// this is console or remote so send immediately
|
||||
if (ClientNumber < 0)
|
||||
{
|
||||
Message = Message,
|
||||
Target = this,
|
||||
Owner = CurrentServer,
|
||||
Type = GameEvent.EventType.Tell,
|
||||
Data = Message
|
||||
};
|
||||
await CurrentServer.Tell(Message, this);
|
||||
}
|
||||
|
||||
CurrentServer.Manager.GetEventHandler().AddEvent(e);
|
||||
// this ensures the output it sent before returning
|
||||
await Task.Run(() => e.OnProcessed.Wait());
|
||||
else
|
||||
{
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Message = Message,
|
||||
Target = this,
|
||||
Owner = CurrentServer,
|
||||
Type = GameEvent.EventType.Tell,
|
||||
Data = Message
|
||||
};
|
||||
|
||||
CurrentServer.Manager.GetEventHandler().AddEvent(e);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task Kick(String Message, Player Sender)
|
||||
|
@ -56,8 +56,6 @@ namespace SharedLibraryCore.RCon
|
||||
{
|
||||
public IPEndPoint Endpoint { get; private set; }
|
||||
public string RConPassword { get; private set; }
|
||||
public ConcurrentQueue<ManualResetEventSlim> ResponseQueue;
|
||||
//Socket ServerConnection;
|
||||
ILogger Log;
|
||||
int FailedSends;
|
||||
int FailedReceives;
|
||||
@ -79,13 +77,6 @@ namespace SharedLibraryCore.RCon
|
||||
OnReceived = new ManualResetEvent(false);
|
||||
}
|
||||
|
||||
~Connection()
|
||||
{
|
||||
/*ServerConnection.Shutdown(SocketShutdown.Both);
|
||||
ServerConnection.Close();
|
||||
ServerConnection.Dispose();*/
|
||||
}
|
||||
|
||||
private void OnConnectedCallback(IAsyncResult ar)
|
||||
{
|
||||
var serverSocket = (Socket)ar.AsyncState;
|
||||
@ -144,12 +135,12 @@ namespace SharedLibraryCore.RCon
|
||||
if (!connectionState.Buffer.Take(4).ToArray().SequenceEqual(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF }))
|
||||
throw new NetworkException("Unexpected packet received");
|
||||
|
||||
if (FailedReceives == 0 && serverConnection.Available > 0)
|
||||
{
|
||||
serverConnection.BeginReceive(connectionState.Buffer, 0, connectionState.Buffer.Length, 0,
|
||||
new AsyncCallback(OnReceivedCallback), connectionState);
|
||||
}
|
||||
else
|
||||
/* if (FailedReceives == 0 && serverConnection.Available > 0)
|
||||
{
|
||||
serverConnection.BeginReceive(connectionState.Buffer, 0, connectionState.Buffer.Length, 0,
|
||||
new AsyncCallback(OnReceivedCallback), connectionState);
|
||||
}
|
||||
else*/
|
||||
{
|
||||
response = connectionState.ResponseString.ToString();
|
||||
OnReceived.Set();
|
||||
@ -169,7 +160,7 @@ namespace SharedLibraryCore.RCon
|
||||
|
||||
catch (ObjectDisposedException)
|
||||
{
|
||||
Log.WriteWarning($"Tried to check for more available bytes for disposed socket on {Endpoint}");
|
||||
// Log.WriteWarning($"Tried to check for more available bytes for disposed socket on {Endpoint}");
|
||||
}
|
||||
}
|
||||
|
||||
@ -211,7 +202,9 @@ namespace SharedLibraryCore.RCon
|
||||
retrySend:
|
||||
try
|
||||
{
|
||||
|
||||
#if DEBUG
|
||||
Console.WriteLine($"Sending Command {parameters}");
|
||||
#endif
|
||||
if (!OnConnected.WaitOne(StaticHelpers.SocketTimeout))
|
||||
throw new SocketException((int)SocketError.TimedOut);
|
||||
|
||||
|
@ -41,7 +41,6 @@ namespace SharedLibraryCore
|
||||
PlayerHistory = new Queue<PlayerHistory>();
|
||||
ChatHistory = new List<ChatInfo>();
|
||||
NextMessage = 0;
|
||||
OnEvent = new ManualResetEventSlim();
|
||||
CustomSayEnabled = Manager.GetApplicationSettings().Configuration().EnableCustomSayName;
|
||||
CustomSayName = Manager.GetApplicationSettings().Configuration().CustomSayName;
|
||||
InitializeTokens();
|
||||
@ -128,7 +127,7 @@ namespace SharedLibraryCore
|
||||
#if !DEBUG
|
||||
string formattedMessage = String.Format(RconParser.GetCommandPrefixes().Say, Message);
|
||||
|
||||
var e = new GameEvent()
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Message = formattedMessage,
|
||||
Data = formattedMessage,
|
||||
@ -139,8 +138,8 @@ namespace SharedLibraryCore
|
||||
Manager.GetEventHandler().AddEvent(e);
|
||||
#else
|
||||
Logger.WriteVerbose(Message.StripColors());
|
||||
await Task.CompletedTask;
|
||||
#endif
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -162,18 +161,21 @@ namespace SharedLibraryCore
|
||||
if (Target.Level == Player.Permission.Console)
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.Cyan;
|
||||
Console.WriteLine(Utilities.StripColors(Message));
|
||||
Console.WriteLine(Message.StripColors());
|
||||
Console.ForegroundColor = ConsoleColor.Gray;
|
||||
}
|
||||
|
||||
if (CommandResult.Count > 15)
|
||||
CommandResult.RemoveAt(0);
|
||||
|
||||
CommandResult.Add(new CommandResponseInfo()
|
||||
if (Target.ClientNumber < 0)
|
||||
{
|
||||
Response = Utilities.StripColors(Message),
|
||||
ClientId = Target.ClientId
|
||||
});
|
||||
CommandResult.Add(new CommandResponseInfo()
|
||||
{
|
||||
Response = Message.StripColors(),
|
||||
ClientId = Target.ClientId
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -261,7 +263,7 @@ namespace SharedLibraryCore
|
||||
{
|
||||
BroadcastMessages = new List<String>();
|
||||
|
||||
if(ServerConfig.AutoMessages != null)
|
||||
if (ServerConfig.AutoMessages != null)
|
||||
BroadcastMessages.AddRange(ServerConfig.AutoMessages);
|
||||
BroadcastMessages.AddRange(Manager.GetApplicationSettings().Configuration().AutoMessages);
|
||||
}
|
||||
@ -315,7 +317,6 @@ namespace SharedLibraryCore
|
||||
public RCon.Connection RemoteConnection { get; protected set; }
|
||||
public IRConParser RconParser { get; protected set; }
|
||||
public IEventParser EventParser { get; set; }
|
||||
public ManualResetEventSlim OnEvent { get; private set; }
|
||||
|
||||
// Internal
|
||||
protected string IP;
|
||||
@ -327,6 +328,7 @@ namespace SharedLibraryCore
|
||||
protected TimeSpan LastMessage;
|
||||
protected IFile LogFile;
|
||||
protected DateTime LastPoll;
|
||||
protected ManualResetEventSlim OnRemoteCommandResponse;
|
||||
|
||||
// only here for performance
|
||||
private bool CustomSayEnabled;
|
||||
|
@ -407,15 +407,15 @@ namespace SharedLibraryCore
|
||||
|
||||
public static Task SetDvarAsync(this Server server, string dvarName, object dvarValue) => server.RconParser.SetDvarAsync(server.RemoteConnection, dvarName, dvarValue);
|
||||
|
||||
public static Task<string[]> ExecuteCommandAsync(this Server server, string commandName) => server.RconParser.ExecuteCommandAsync(server.RemoteConnection, commandName);
|
||||
|
||||
public static async Task<string[]> ExecuteCommandAsync(this Server server, string commandName) => await server.RconParser.ExecuteCommandAsync(server.RemoteConnection, commandName);
|
||||
|
||||
public static Task<List<Player>> GetStatusAsync(this Server server) => server.RconParser.GetStatusAsync(server.RemoteConnection);
|
||||
|
||||
public static async Task<Dictionary<string, string>> GetInfoAsync(this Server server)
|
||||
{
|
||||
var response = await server.RemoteConnection.SendQueryAsync(RCon.StaticHelpers.QueryType.GET_INFO);
|
||||
return response.FirstOrDefault(r => r[0] == '\\')?.DictionaryFromKeyValue();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user