public static void BeforeLogLineRead(bool isImport, Advanced_Combat_Tracker.LogLineEventArgs logInfo)
{
string logLine = logInfo.logLine;
if (_ACT == null)
throw new ApplicationException("ACT Wrapper not initialized.");
try
{
// parse datetime
DateTime timestamp = ParseLogDateTime(logLine);
int chatLogType = 0;
if (logLine.IndexOf('|') > 5)
{
logLine = logLine.Substring(logLine.IndexOf('|')+1);
if (logLine.IndexOf('|') > 0)
{
chatLogType = Convert.ToInt32(logLine.Substring(0, logLine.IndexOf('|')), 16);
logLine = logLine.Substring(logLine.IndexOf('|')+1);
}
}
else if (logLine.IndexOf(' ') > 5)
logLine = logLine.Substring(logLine.IndexOf(' '));
// reformat logline
logInfo.logLine = "[" + timestamp.ToString("HH:mm:ss.fff") + "] " + logLine;
// timestamp = DateTime.ParseExact(logLine.Substring(1, logLine.IndexOf(']') - 1), "HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture);
// Exclude certain chat codes
if (chatLogType == 0x0c) // 0x0c = NPC talking, not parsed.
return;
Match m;
m = regex_yourdamage.Match(logLine);
if (m.Success)
{
string actor = "You";
string target = m.Groups["target"].Success ? DecodeString(m.Groups["target"].Value) : "";
string damage = (m.Groups["damage"].Value ?? "").Replace(",", "");
string hpdrain = (m.Groups["HPDrain"].Value ?? "").Replace(",", "");
if (_ACT.SetEncounter(timestamp, actor, target))
{
_ACT.AddCombatAction(
(int)Advanced_Combat_Tracker.SwingTypeEnum.NonMelee,
m.Groups["critical"].Value == "critically hit",
"",
actor,
DecodeString(m.Groups["skill"].Value),
new Advanced_Combat_Tracker.Dnum(int.Parse(damage)),
timestamp,
_ACT.GlobalTimeSorter,
target,
"");
if (m.Groups["HPDrain"].Success)
{
_ACT.AddCombatAction(
(int)Advanced_Combat_Tracker.SwingTypeEnum.Healing,
false,
"Drain",
actor,
DecodeString(m.Groups["skill"].Value),
new Advanced_Combat_Tracker.Dnum(int.Parse(hpdrain)),
timestamp,
_ACT.GlobalTimeSorter,
actor,
"");
}
}
return;
}
m = regex_incomingdamage1.Match(logLine);
if (!m.Success)
m = regex_incomingdamage2.Match(logLine);
if (!m.Success)
m = regex_incomingdamage3.Match(logLine);
if (m.Success)
{
string target = m.Groups["target"].Success ? DecodeString(m.Groups["target"].Value) : "";
string actor = m.Groups["actor"].Success ? DecodeString(m.Groups["actor"].Value) : "";
string skill = m.Groups["skill"].Success ? DecodeString(m.Groups["skill"].Value) : "";
string damage = (m.Groups["damage"].Value ?? "").Replace(",", "");
string hpdrain = (m.Groups["HPDrain"].Value ?? "").Replace(",", "");
// if skillname is blank, the skillname and actor may be transposed
if (string.IsNullOrWhiteSpace(skill))
{
if (!string.IsNullOrWhiteSpace(actor))
{
// "Received 1373 damage from Rising Blaze's ."
skill = actor;
}
}
if (string.IsNullOrWhiteSpace(target))
target = "You";
if (string.IsNullOrWhiteSpace(actor))
actor = "You";
// todo: in the future, if damage is missing, still parse the buff portion
if (!m.Groups["damage"].Success)
return;
if (_ACT.SetEncounter(timestamp, actor, target))
{
_ACT.AddCombatAction(
(int)Advanced_Combat_Tracker.SwingTypeEnum.NonMelee,
m.Groups["critical"].Value == "Critical",
"",
actor,
skill,
new Advanced_Combat_Tracker.Dnum(int.Parse(damage)),
timestamp,
_ACT.GlobalTimeSorter,
target,
"");
if (m.Groups["HPDrain"].Success)
{
_ACT.AddCombatAction(
(int)Advanced_Combat_Tracker.SwingTypeEnum.Healing,
false,
"Drain",
actor,
skill,
new Advanced_Combat_Tracker.Dnum(int.Parse(hpdrain)),
timestamp,
_ACT.GlobalTimeSorter,
actor,
"");
}
}
return;
}
m = regex_heal.Match(logLine);
if (m.Success)
{
string target = m.Groups["target"].Success ? DecodeString(m.Groups["target"].Value) : "";
if (string.IsNullOrWhiteSpace(target))
target = "You";
string actor = "Unknown";
// do not process if there is no HP amount.
if (!m.Groups["HPAmount"].Success)
return;
string hpamount= (m.Groups["HPAmount"].Value ?? "").Replace(",", "");
if (_ACT.SetEncounter(timestamp, actor, target))
{
_ACT.AddCombatAction(
(int)Advanced_Combat_Tracker.SwingTypeEnum.Healing,
false,
"",
actor,
DecodeString(m.Groups["skill"].Value),
new Advanced_Combat_Tracker.Dnum(int.Parse(hpamount)),
timestamp,
_ACT.GlobalTimeSorter,
target,
"");
}
return;
}
m = regex_debuff2.Match(logLine);
if (m.Success)
{
// todo: add debuff support
return;
}
m = regex_debuff.Match(logLine);
if (m.Success)
{
// todo: add debuff support
return;
}
m = regex_buff.Match(logLine);
if (m.Success)
{
// todo: add buff support
return;
}
m = regex_evade.Match(logLine);
if (m.Success)
{
// todo: add evade support
return;
}
m = regex_defeat.Match(logLine);
if (m.Success)
{
string target = m.Groups["target"].Success ? DecodeString(m.Groups["target"].Value) : "";
string actor = m.Groups["actor"].Success ? DecodeString(m.Groups["actor"].Value) : "";
if (string.IsNullOrWhiteSpace(actor))
actor = "Unknown";
if (_ACT.SetEncounter(timestamp, actor, target))
{
_ACT.AddCombatAction(
(int)Advanced_Combat_Tracker.SwingTypeEnum.NonMelee,
false,
"",
actor,
DecodeString(m.Groups["skill"].Value),
Advanced_Combat_Tracker.Dnum.Death,
timestamp,
_ACT.GlobalTimeSorter,
target,
"");
}
return;
}
}
catch (Exception ex)
{
string exception = ex.ToString().Replace(Environment.NewLine, " ");
if (ex.InnerException != null)
exception += " " + ex.InnerException.ToString().Replace(Environment.NewLine, " ");
BNS_ACT_Plugin.LogParserMessage("Error [LogParse.BeforeLogLineRead] " + exception + " " + logInfo.logLine);
}
// For debugging
if (!string.IsNullOrWhiteSpace(logLine))
BNS_ACT_Plugin.LogParserMessage("Unhandled Line: " + logInfo.logLine);
}