mirror of
https://github.com/Tribufu/ServerManagers
synced 2026-08-08 04:01:05 +00:00
796 lines
32 KiB
C#
796 lines
32 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Net.Sockets;
|
|
using System.Text.RegularExpressions;
|
|
using System.Net;
|
|
using System.Globalization;
|
|
using System.Threading;
|
|
|
|
namespace QueryMaster
|
|
{
|
|
/// <summary>
|
|
/// Encapsulates a method that has a parameter of type string which is the log message received from server.
|
|
/// Invoked when a log message is received from server.
|
|
/// </summary>
|
|
/// <param name="log">Received log message.</param>
|
|
public delegate void LogCallback(string log);
|
|
/// <summary>
|
|
/// Provides methods to listen to logs and to set up events on desired type of log message.
|
|
/// </summary>
|
|
public class Logs : IDisposable
|
|
{
|
|
Socket UdpSocket;
|
|
private readonly int BufferSize = 1400;
|
|
private LogCallback Callback;
|
|
private byte[] recvData;
|
|
private int Port;
|
|
private int HeaderSize = 0;
|
|
private IPEndPoint ServerEndPoint;
|
|
private Regex LineSplit;
|
|
private Regex RegPlayer = new Regex("^([^\"]+)<([^\"]+)><([^\"]+)><([^\"]*)>$");
|
|
private char[] QuoteSplitPattern = { '\"' };
|
|
/// <summary>
|
|
/// Occurs when Server cvar starts(In TFC, if tfc_clanbattle is 1, this doesn't happen.).
|
|
/// </summary>
|
|
public event EventHandler<LogEventArgs> CvarStartMsg; //001.1
|
|
/// <summary>
|
|
/// Occurs when someone changes a cvar over rcon.
|
|
/// </summary>
|
|
public event EventHandler<CvarEventArgs> ServerCvar; //001.2
|
|
/// <summary>
|
|
/// Occurs when Server cvar ends(In TFC, if tfc_clanbattle is 0, this doesn't happen.).
|
|
/// </summary>
|
|
public event EventHandler<LogEventArgs> CvarEndMsg; //001.3
|
|
/// <summary>
|
|
/// Occurs when Logging to file is started.
|
|
/// </summary>
|
|
public event EventHandler<LogStartEventArgs> LogFileStarted; //002.1
|
|
/// <summary>
|
|
/// Occurs when Log file is closed.
|
|
/// </summary>
|
|
public event EventHandler<LogEventArgs> LogFileClosed; //002.2
|
|
/// <summary>
|
|
/// Occurs when map is loaded.
|
|
/// </summary>
|
|
public event EventHandler<MapLoadEventArgs> MapLoaded; //003.1
|
|
/// <summary>
|
|
/// Occurs when Map starts.
|
|
/// </summary>
|
|
public event EventHandler<MapStartEventArgs> MapStarted; //003.2
|
|
/// <summary>
|
|
/// Occurs when an rcon message is sent to server.
|
|
/// </summary>
|
|
public event EventHandler<RconEventArgs> RconMsg; //004(1,2)
|
|
/// <summary>
|
|
/// Occurs when server name is displayed.
|
|
/// </summary>
|
|
public event EventHandler<ServerNameEventArgs> ServerName; //005
|
|
/// <summary>
|
|
/// Occurs when Server says.
|
|
/// </summary>
|
|
public event EventHandler<ServerSayEventArgs> ServerSay; //006
|
|
/// <summary>
|
|
/// Occurs when a player is connected.
|
|
/// </summary>
|
|
public event EventHandler<ConnectEventArgs> PlayerConnected; //050
|
|
/// <summary>
|
|
/// Occurs when a player is validated.
|
|
/// </summary>
|
|
public event EventHandler<PlayerEventArgs> PlayerValidated; //050b
|
|
/// <summary>
|
|
/// Occurs when a player is enters game.
|
|
/// </summary>
|
|
public event EventHandler<PlayerEventArgs> PlayerEnteredGame; //51
|
|
/// <summary>
|
|
/// Occurs when a player is disconnected.
|
|
/// </summary>
|
|
public event EventHandler<PlayerEventArgs> PlayerDisConnected; //52
|
|
/// <summary>
|
|
/// Occurs when a player is kicked.
|
|
/// </summary>
|
|
public event EventHandler<KickEventArgs> PlayerKicked; //052b
|
|
/// <summary>
|
|
/// Occurs when a player commit suicide.
|
|
/// </summary>
|
|
public event EventHandler<SuicideEventArgs> PlayerSuicided; //053
|
|
/// <summary>
|
|
/// Occurs when a player Join team.
|
|
/// </summary>
|
|
public event EventHandler<TeamSelectionEventArgs> PlayerJoinedTeam; //054
|
|
/// <summary>
|
|
/// Occurs when a player change role.
|
|
/// </summary>
|
|
public event EventHandler<RoleSelectionEventArgs> PlayerChangedRole; //055
|
|
/// <summary>
|
|
/// Occurs when a player changes name.
|
|
/// </summary>
|
|
public event EventHandler<NameChangeEventArgs> PlayerChangedName; //056
|
|
/// <summary>
|
|
/// Occurs when a player is killed.
|
|
/// </summary>
|
|
public event EventHandler<KillEventArgs> PlayerKilled; //057
|
|
/// <summary>
|
|
/// Occurs when a player is injured.
|
|
/// </summary>
|
|
public event EventHandler<InjureEventArgs> PlayerInjured; //058
|
|
/// <summary>
|
|
/// Occurs when a player triggers something on another player(in TFC this event may cover medic healings and infections, sentry gun destruction, spy uncovering.etc).
|
|
/// </summary>
|
|
public event EventHandler<PlayerOnPlayerEventArgs> PlayerOnPLayerTriggered; //059
|
|
/// <summary>
|
|
/// Occurs when a player triggers an action.
|
|
/// </summary>
|
|
public event EventHandler<PlayerActionEventArgs> PlayerTriggered; //060
|
|
/// <summary>
|
|
/// Occurs when a team triggers an action(eg:team winning).
|
|
/// </summary>
|
|
public event EventHandler<TeamActionEventArgs> TeamTriggered; //061
|
|
/// <summary>
|
|
/// Occurs when server triggers an action(eg:roundstart,game events).
|
|
/// </summary>
|
|
public event EventHandler<WorldActionEventArgs> WorldTriggered; //062
|
|
/// <summary>
|
|
/// Occurs when a player says.
|
|
/// </summary>
|
|
public event EventHandler<ChatEventArgs> Say; //063.1
|
|
/// <summary>
|
|
/// Occurs when a player uses teamsay.
|
|
/// </summary>
|
|
public event EventHandler<ChatEventArgs> TeamSay; //063.2
|
|
/// <summary>
|
|
/// Occurs when a team forms alliance with another team.
|
|
/// </summary>
|
|
public event EventHandler<TeamAllianceEventArgs> TeamAlliance; //064
|
|
/// <summary>
|
|
/// Occurs when Team Score Report is displayed at round end.
|
|
/// </summary>
|
|
public event EventHandler<TeamScoreReportEventArgs> TeamScoreReport; //065
|
|
/// <summary>
|
|
/// Occurs when a private message is sent.
|
|
/// </summary>
|
|
public event EventHandler<PrivateChatEventArgs> PrivateChat; //066
|
|
/// <summary>
|
|
/// Occurs when Player Score Report is displayed at round end.
|
|
/// </summary>
|
|
public event EventHandler<PlayerScoreReportEventArgs> PlayerScoreReport; //067
|
|
/// <summary>
|
|
/// Occurs when Player selects a weapon.
|
|
/// </summary>
|
|
public event EventHandler<WeaponEventArgs> PlayerSelectedWeapon; //068
|
|
/// <summary>
|
|
/// Occurs when Player acquires a weapon.
|
|
/// </summary>
|
|
public event EventHandler<WeaponEventArgs> PlayerAcquiredWeapon; //069
|
|
/// <summary>
|
|
/// Occurs when server shuts down.
|
|
/// </summary>
|
|
public event EventHandler<LogEventArgs> ShutDown; //new
|
|
/// <summary>
|
|
/// Occurs when a log message cannot be parsed.
|
|
/// </summary>
|
|
public event EventHandler<ExceptionEventArgs> Exception;
|
|
|
|
internal Logs(EngineType type, int port, IPEndPoint serverEndPoint)
|
|
{
|
|
ServerEndPoint = serverEndPoint;
|
|
Port = port;
|
|
recvData = new byte[BufferSize];
|
|
LineSplit = new Regex(": ");
|
|
switch (type)
|
|
{
|
|
case EngineType.GoldSource: HeaderSize = 10; break;
|
|
case EngineType.Source: HeaderSize = 7; break;
|
|
}
|
|
UdpSocket = new Socket(AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, ProtocolType.Udp);
|
|
UdpSocket.Bind(new IPEndPoint(IPAddress.Any, Port));
|
|
|
|
UdpSocket.BeginReceive(recvData, 0, recvData.Length, SocketFlags.None, Recv, null);
|
|
}
|
|
/// <summary>
|
|
/// Listen to logs sent by the server
|
|
/// </summary>
|
|
/// <param name="callback">Called when a log message is received</param>
|
|
public void Listen(LogCallback callback)
|
|
{
|
|
Callback = callback;
|
|
}
|
|
|
|
private void Recv(IAsyncResult res)
|
|
{
|
|
int bytesRecv = 0;
|
|
try
|
|
{
|
|
bytesRecv = UdpSocket.EndReceive(res);
|
|
}
|
|
catch (ObjectDisposedException)
|
|
{
|
|
return;
|
|
}
|
|
if(bytesRecv>HeaderSize)
|
|
ThreadPool.QueueUserWorkItem(ProcessLog, Encoding.UTF8.GetString(recvData, HeaderSize, bytesRecv - HeaderSize));
|
|
UdpSocket.BeginReceive(recvData, 0, recvData.Length, SocketFlags.None, Recv, null);
|
|
}
|
|
|
|
private void ProcessLog(object line)
|
|
{
|
|
string logLine = (string)line;
|
|
DateTime Timestamp;
|
|
string info;
|
|
try
|
|
{
|
|
string[] data = LineSplit.Split(logLine, 2);
|
|
Timestamp = DateTime.ParseExact(data[0], "MM/dd/yyyy - HH:mm:ss", CultureInfo.InvariantCulture);
|
|
info = data[1].Remove(data[1].Length - 2);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
e.Data.Add("ReceivedData", Util.StringToBytes(logLine));
|
|
throw;
|
|
}
|
|
if (info.StartsWith("//"))
|
|
return;
|
|
if (Callback != null)
|
|
Callback(logLine);
|
|
string[] result = info.Split(QuoteSplitPattern, StringSplitOptions.RemoveEmptyEntries);
|
|
try
|
|
{
|
|
if (info[0] == '\"')
|
|
{
|
|
switch (result[1])
|
|
{
|
|
case " connected, address ": OnConnection(Timestamp, result); break; // 50
|
|
case " STEAM USERID validated": OnValidation(Timestamp, result); break; //50b
|
|
case " entered the game": OnEnterGame(Timestamp, result); break; //51
|
|
case " disconnected": OnDisconnection(Timestamp, result); break; //52
|
|
case " committed suicide with ": OnSuicide(Timestamp, result); break; //53
|
|
case " joined team ": OnTeamSelection(Timestamp, result); break; //54
|
|
case " changed role to ": OnRoleSelection(Timestamp, result); break; //55
|
|
case " changed name to ": OnNameChange(Timestamp, result); break; //56
|
|
case " killed ": OnKill(Timestamp, result); break; //57
|
|
case " attacked ": OnInjure(Timestamp, result); break; //58
|
|
case " triggered ": //59 ,60
|
|
{
|
|
if (result.Length > 3 && result[3] == " against ")
|
|
OnPlayer_PlayerAction(Timestamp, result);
|
|
else
|
|
OnPlayerAction(Timestamp, result);
|
|
break;
|
|
}
|
|
case " say ": OnSay(Timestamp, result); break; //63a
|
|
case " say_team ": OnTeamSay(Timestamp, result); break; //63b
|
|
case " tell ": OnPrivateChat(Timestamp, result); break; //66
|
|
case " selected weapon ": OnWeaponSelection(Timestamp, result); break; //68
|
|
case " acquired weapon ": OnWeaponPickup(Timestamp, result); break; //69
|
|
default: OnException(Timestamp, info); break;
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (result[0])
|
|
{
|
|
case "Server cvars start": OnCvarStart(Timestamp); break; //001.1
|
|
case "Server cvar ": OnServerCvar(Timestamp, result); break; //001.2
|
|
case "Server cvars end": OnCvarEnd(Timestamp); break; //001.3
|
|
case "Log file started (file ": OnLogFileStart(Timestamp, result); break; //002.1
|
|
case "Log file closed": OnLogFileClose(Timestamp); break; //002.2
|
|
case "Loading map ": OnMapLoading(Timestamp, result); break; //003.1
|
|
case "Started map ": OnMapStart(Timestamp, result); break; //003.2
|
|
case "Rcon: ": OnRconMsg(Timestamp, result); break; //004.1
|
|
case "Bad Rcon: ": OnRconMsg(Timestamp, result); break; //004.2
|
|
case "Server name is ": OnserverName(Timestamp, result); break; //005
|
|
case "Server say ": OnServerSay(Timestamp, result); break; //006
|
|
case "Kick: ": OnKick(Timestamp, result); break; //0052b
|
|
case "Team ":
|
|
{
|
|
switch (result[2])
|
|
{
|
|
case " triggered ": OnTeamAction(Timestamp, result); break; //061
|
|
case " formed alliance with team ": OnTeamAlliance(Timestamp, result); break; //064
|
|
case " scored ": OnTeamScoreReport(Timestamp, result); break; //065
|
|
}
|
|
break;
|
|
|
|
}
|
|
case "World triggered ": OnWorldAction(Timestamp, result); break; //062
|
|
case "Player ": OnPlayerAction(Timestamp, result); break; //60
|
|
case "Server shutdown": OnShutDown(Timestamp); break; //new
|
|
default: OnException(Timestamp, info); break;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
Exception.Fire(ServerEndPoint, new ExceptionEventArgs() { Timestamp = Timestamp, LogLine = info });
|
|
}
|
|
|
|
|
|
|
|
}
|
|
/// <summary>
|
|
/// Disposes the resources used by log instance
|
|
/// </summary>
|
|
public void Dispose()
|
|
{
|
|
if (UdpSocket != null)
|
|
UdpSocket.Close();
|
|
CvarStartMsg = null;
|
|
ServerCvar = null;
|
|
CvarEndMsg = null;
|
|
LogFileStarted = null;
|
|
LogFileClosed = null;
|
|
MapLoaded = null;
|
|
MapStarted = null;
|
|
RconMsg = null;
|
|
ServerName = null;
|
|
ServerSay = null;
|
|
PlayerConnected = null;
|
|
PlayerValidated = null;
|
|
PlayerEnteredGame = null;
|
|
PlayerDisConnected = null;
|
|
PlayerKicked = null;
|
|
PlayerSuicided = null;
|
|
PlayerJoinedTeam = null;
|
|
PlayerChangedRole = null;
|
|
PlayerChangedName = null;
|
|
PlayerKilled = null;
|
|
PlayerInjured = null;
|
|
PlayerOnPLayerTriggered = null;
|
|
PlayerTriggered = null;
|
|
TeamTriggered = null;
|
|
WorldTriggered = null;
|
|
Say = null;
|
|
TeamSay = null;
|
|
TeamAlliance = null;
|
|
TeamScoreReport = null;
|
|
PrivateChat = null;
|
|
PlayerScoreReport = null;
|
|
PlayerSelectedWeapon = null;
|
|
PlayerAcquiredWeapon = null;
|
|
ShutDown = null;
|
|
Exception = null;
|
|
}
|
|
|
|
|
|
//Server cvars start [001.1]
|
|
protected virtual void OnCvarStart(DateTime Timestamp)
|
|
{
|
|
CvarStartMsg.Fire(ServerEndPoint, new LogEventArgs() { Timestamp = Timestamp });
|
|
}
|
|
|
|
//Server cvar "var" = "value" [001.2]
|
|
protected virtual void OnServerCvar(DateTime Timestamp, string[] info)
|
|
{
|
|
CvarEventArgs eventArgs = new CvarEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Cvar = info[1],
|
|
Value = info[3]
|
|
};
|
|
ServerCvar.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
|
|
//Server cvars end [001.3]
|
|
protected virtual void OnCvarEnd(DateTime Timestamp)
|
|
{
|
|
CvarEndMsg.Fire(ServerEndPoint, new LogEventArgs() { Timestamp = Timestamp });
|
|
}
|
|
|
|
//Log file started (file "filename") (game "game") (version "protocol/release/build") [002.1]
|
|
protected virtual void OnLogFileStart(DateTime Timestamp, string[] info)
|
|
{
|
|
string[] tmp = info[5].Split('/');
|
|
LogStartEventArgs eventArgs = new LogStartEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
FileName = info[1],
|
|
Game = info[3],
|
|
Protocol = tmp[0],
|
|
Release = tmp[1],
|
|
Build = tmp[2]
|
|
};
|
|
LogFileStarted.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//Log file closed [002.2]
|
|
protected virtual void OnLogFileClose(DateTime Timestamp)
|
|
{
|
|
LogFileClosed.Fire(ServerEndPoint, new LogEventArgs() { Timestamp = Timestamp });
|
|
}
|
|
|
|
//Loading map "map" [003.1]
|
|
protected virtual void OnMapLoading(DateTime Timestamp, string[] info)
|
|
{
|
|
MapLoadEventArgs eventArgs = new MapLoadEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
MapName = info[1]
|
|
};
|
|
MapLoaded.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
//Started map "map" (CRC "crc") [003.2]
|
|
protected virtual void OnMapStart(DateTime Timestamp, string[] info)
|
|
{
|
|
MapStartEventArgs eventArgs = new MapStartEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
MapName = info[1],
|
|
MapCRC = info[3]
|
|
};
|
|
MapStarted.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
//Rcon: "rcon challenge "password" command" from "ip:port" [004.1]
|
|
//Bad Rcon: "rcon challenge "password" command" from "ip:port" [004.2]
|
|
protected virtual void OnRconMsg(DateTime Timestamp, string[] info)
|
|
{
|
|
string[] s = info[5].Split(':');
|
|
RconEventArgs eventArgs = new RconEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
IsValid = info[0] == "Rcon: " ? true : false,
|
|
Challenge = info[1].Split(' ')[1],
|
|
Password = info[2],
|
|
Command = info[3],
|
|
Ip = s[0],
|
|
Port = ushort.Parse(s[1])
|
|
|
|
};
|
|
RconMsg.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//Server name is "hostname" [005]
|
|
protected virtual void OnserverName(DateTime Timestamp, string[] info)
|
|
{
|
|
ServerNameEventArgs eventArgs = new ServerNameEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Name = info[1]
|
|
};
|
|
ServerName.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
//Server say "message" [006]
|
|
protected virtual void OnServerSay(DateTime Timestamp, string[] info)
|
|
{
|
|
ServerSayEventArgs eventArgs = new ServerSayEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Message = info[1]
|
|
};
|
|
ServerSay.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><>" connected, address "ip:port" [50]
|
|
protected virtual void OnConnection(DateTime Timestamp, string[] info)
|
|
{
|
|
string[] s = info[2].Split(':');
|
|
ConnectEventArgs eventArgs = new ConnectEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Ip = s[0],
|
|
Port = ushort.Parse(s[1])
|
|
};
|
|
PlayerConnected.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><>" STEAM USERID validated [50b]
|
|
protected virtual void OnValidation(DateTime Timestamp, string[] info)
|
|
{
|
|
PlayerEventArgs eventArgs = new PlayerEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
};
|
|
PlayerValidated.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><>" entered the game [51]
|
|
protected virtual void OnEnterGame(DateTime Timestamp, string[] info)
|
|
{
|
|
PlayerEventArgs eventArgs = new PlayerEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
};
|
|
PlayerEnteredGame.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" disconnected [52]
|
|
protected virtual void OnDisconnection(DateTime Timestamp, string[] info)
|
|
{
|
|
PlayerEventArgs eventArgs = new PlayerEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
};
|
|
PlayerDisConnected.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
//Kick: "Name<uid><wonid><>" was kicked by "Console" (message "") [52b]
|
|
protected virtual void OnKick(DateTime Timestamp, string[] info)
|
|
{
|
|
KickEventArgs eventArgs = new KickEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[1]),
|
|
Kicker = info[3],
|
|
Message = info.Length == 7 ? info[5] : string.Empty
|
|
};
|
|
PlayerKicked.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" committed suicide with "weapon" [53]
|
|
protected virtual void OnSuicide(DateTime Timestamp, string[] info)
|
|
{
|
|
SuicideEventArgs eventArgs = new SuicideEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Weapon = info[2]
|
|
};
|
|
PlayerSuicided.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" joined team "team" [54]
|
|
protected virtual void OnTeamSelection(DateTime Timestamp, string[] info)
|
|
{
|
|
TeamSelectionEventArgs eventArgs = new TeamSelectionEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Team = info[2]
|
|
};
|
|
PlayerJoinedTeam.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" changed role to "role" [55]
|
|
protected virtual void OnRoleSelection(DateTime Timestamp, string[] info)
|
|
{
|
|
RoleSelectionEventArgs eventArgs = new RoleSelectionEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Role = info[2]
|
|
};
|
|
PlayerChangedRole.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" changed name to "Name" [56]
|
|
protected virtual void OnNameChange(DateTime Timestamp, string[] info)
|
|
{
|
|
NameChangeEventArgs eventArgs = new NameChangeEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
NewName = info[2]
|
|
};
|
|
PlayerChangedName.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" killed "Name<uid><wonid><team>" with "weapon" [57]
|
|
protected virtual void OnKill(DateTime Timestamp, string[] info)
|
|
{
|
|
KillEventArgs eventArgs = new KillEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Victim = GetPlayerInfo(info[2]),
|
|
Weapon = info[4]
|
|
};
|
|
PlayerKilled.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" attacked "Name<uid><wonid><team>" with "weapon" (damage "damage") [58]
|
|
protected virtual void OnInjure(DateTime Timestamp, string[] info)
|
|
{
|
|
InjureEventArgs eventArgs = new InjureEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Victim = GetPlayerInfo(info[2]),
|
|
Weapon = info[4],
|
|
Damage = info[6]
|
|
};
|
|
PlayerInjured.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" triggered "action" against "Name<uid><wonid><team>" [59]
|
|
protected virtual void OnPlayer_PlayerAction(DateTime Timestamp, string[] info)
|
|
{
|
|
PlayerOnPlayerEventArgs eventArgs = new PlayerOnPlayerEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Source = GetPlayerInfo(info[0]),
|
|
Action = info[2],
|
|
Target = GetPlayerInfo(info[4])
|
|
};
|
|
PlayerOnPLayerTriggered.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" triggered "action" [60]
|
|
protected virtual void OnPlayerAction(DateTime Timestamp, string[] info)
|
|
{
|
|
string s = string.Empty;
|
|
if (info.Length > 3)
|
|
{
|
|
for (int i = 3; i < info.Length; i++)
|
|
s += info[i];
|
|
}
|
|
PlayerActionEventArgs eventArgs = new PlayerActionEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Action = info[2],
|
|
ExtraInfo = s
|
|
};
|
|
PlayerTriggered.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//Team "team" triggered "action" [61]
|
|
protected virtual void OnTeamAction(DateTime Timestamp, string[] info)
|
|
{
|
|
TeamActionEventArgs eventArgs = new TeamActionEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Team = info[1],
|
|
Action = info[3]
|
|
};
|
|
TeamTriggered.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//World triggered "action" [62]
|
|
protected virtual void OnWorldAction(DateTime Timestamp, string[] info)
|
|
{
|
|
WorldActionEventArgs eventArgs = new WorldActionEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Action = info[1]
|
|
};
|
|
WorldTriggered.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
//"Name<uid><wonid><team>" say "message" [63.1]
|
|
protected virtual void OnSay(DateTime Timestamp, string[] info)
|
|
{
|
|
ChatEventArgs eventArgs = new ChatEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Message = info.Length == 3 ? info[2] : string.Empty
|
|
};
|
|
Say.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
// "Name<uid><wonid><team>" say_team "message" [63.2]
|
|
protected virtual void OnTeamSay(DateTime Timestamp, string[] info)
|
|
{
|
|
ChatEventArgs eventArgs = new ChatEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Message = info.Length == 3 ? info[2] : string.Empty
|
|
};
|
|
TeamSay.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//Team "team" formed alliance with team "team" [64]
|
|
protected virtual void OnTeamAlliance(DateTime Timestamp, string[] info)
|
|
{
|
|
TeamAllianceEventArgs eventArgs = new TeamAllianceEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Team1 = info[1],
|
|
Team2 = info[3]
|
|
};
|
|
TeamAlliance.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//Team "team" scored "score" with "numplayers" players + extra info [65]
|
|
protected virtual void OnTeamScoreReport(DateTime Timestamp, string[] info)
|
|
{
|
|
string details = string.Empty;
|
|
if (info.Length > 6)
|
|
{
|
|
for (int i = 6; i < info.Length; i++)
|
|
details += info[i];
|
|
}
|
|
TeamScoreReportEventArgs eventArgs = new TeamScoreReportEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Team = info[1],
|
|
Score = info[3],
|
|
PlayerCount = info[5],
|
|
ExtraInfo = details
|
|
};
|
|
TeamScoreReport.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" tell "Name<uid><wonid><team>" message "message" [66]
|
|
protected virtual void OnPrivateChat(DateTime Timestamp, string[] info)
|
|
{
|
|
PrivateChatEventArgs eventArgs = new PrivateChatEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Sender = GetPlayerInfo(info[0]),
|
|
Receiver = GetPlayerInfo(info[2]),
|
|
Message = info.Length == 5 ? info[4] : string.Empty
|
|
};
|
|
PrivateChat.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//Player "Name<uid><wonid><team>" scored "score" + extra info [67]
|
|
protected virtual void OnPlayerScoreReport(DateTime Timestamp, string[] info)
|
|
{
|
|
string details = string.Empty;
|
|
if (info.Length > 4)
|
|
{
|
|
for (int i = 4; i < info.Length; i++)
|
|
details += info[i];
|
|
}
|
|
PlayerScoreReportEventArgs eventArgs = new PlayerScoreReportEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[1]),
|
|
Score = info[3],
|
|
ExtraInfo = details
|
|
|
|
};
|
|
PlayerScoreReport.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" selected weapon "weapon" [68]
|
|
protected virtual void OnWeaponSelection(DateTime Timestamp, string[] info)
|
|
{
|
|
WeaponEventArgs eventArgs = new WeaponEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Weapon = info[2]
|
|
};
|
|
PlayerSelectedWeapon.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
//"Name<uid><wonid><team>" acquired weapon "weapon" [69]
|
|
protected virtual void OnWeaponPickup(DateTime Timestamp, string[] info)
|
|
{
|
|
WeaponEventArgs eventArgs = new WeaponEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
Player = GetPlayerInfo(info[0]),
|
|
Weapon = info[2]
|
|
};
|
|
PlayerAcquiredWeapon.Fire(ServerEndPoint, eventArgs);
|
|
}
|
|
|
|
protected virtual void OnShutDown(DateTime Timestamp)
|
|
{
|
|
ShutDown.Fire(ServerEndPoint, new LogEventArgs() { Timestamp = Timestamp });
|
|
}
|
|
protected virtual void OnException(DateTime Timestamp, string info)
|
|
{
|
|
ExceptionEventArgs eventArgs = new ExceptionEventArgs()
|
|
{
|
|
Timestamp = Timestamp,
|
|
LogLine = info
|
|
};
|
|
Exception.Fire(ServerEndPoint, eventArgs);
|
|
|
|
}
|
|
|
|
//Name<uid><wonid><team>
|
|
private PlayerInfo GetPlayerInfo(string s)
|
|
{
|
|
Match match = RegPlayer.Match(s);
|
|
PlayerInfo info = new PlayerInfo()
|
|
{
|
|
Name = match.Groups[1].Value,
|
|
Uid = match.Groups[2].Value,
|
|
WonId = match.Groups[3].Value,
|
|
Team = match.Groups[4].Value,
|
|
};
|
|
return info;
|
|
}
|
|
|
|
}
|
|
}
|