Skip to content

Commit

Permalink
1.55:
Browse files Browse the repository at this point in the history
- add new dungeons to moongourd export
- format paste string #207 (don't have TW fonts - using KR international font for TW)
- format paste string in clipboard for monospaced font tables
- fix crash on deleting numbers in settings menu
- add OS version to missed packet debug string
  • Loading branch information
Gl0 committed Oct 22, 2016
1 parent 6115e0d commit 48588be
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 73 deletions.
2 changes: 1 addition & 1 deletion DamageMeter.AutoUpdate/UpdateManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ namespace DamageMeter.AutoUpdate
public class UpdateManager
{

public static readonly string Version = "1.54";
public static readonly string Version = "1.55";

public static string ExecutableDirectory => Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

Expand Down
125 changes: 75 additions & 50 deletions DamageMeter.Core/CopyPaste.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading;
using DamageMeter.Database.Structures;
using Data;
using Lang;
using Tera.Game.Abnormality;
using System.Windows;
using Tera.Game;
using Clipboard = System.Windows.Clipboard;

namespace DamageMeter
{
public static class CopyPaste
{
private static readonly object Lock = new object();

internal static PrivateFontCollection PFC = new PrivateFontCollection();
internal static Font Font=new Font("Trebuchet MS", 12, FontStyle.Bold, GraphicsUnit.Pixel);
private static Graphics graphics = Graphics.FromImage(new Bitmap(1, 1));
public static void Paste(string text)
{
if (!Monitor.TryEnter(Lock)) return;
Expand Down Expand Up @@ -51,7 +56,7 @@ public static void CopyInspect(string name)
}


public static string Copy(StatsSummary statsSummary, Skills skills, AbnormalityStorage abnormals,
public static Tuple<string,string> Copy(StatsSummary statsSummary, Skills skills, AbnormalityStorage abnormals,
bool timedEncounter, string header, string content,
string footer, string orderby, string order)
{
Expand Down Expand Up @@ -133,7 +138,7 @@ public static string Copy(StatsSummary statsSummary, Skills skills, AbnormalityS
}
}

var dpsString = header;
var dpsString = new StringBuilder(header);

var name = entityInfo.Entity?.Info.Name ?? "";
AbnormalityDuration enrage;
Expand All @@ -142,19 +147,20 @@ public static string Copy(StatsSummary statsSummary, Skills skills, AbnormalityS
? 0
: (double) (enrage?.Duration(firstTick, lastTick) ?? 0)/(lastTick - firstTick);

dpsString = dpsString.Replace("{encounter}", name);
dpsString.Replace("{encounter}", name);
var interval = TimeSpan.FromSeconds(lastHit - firstHit);
dpsString = dpsString.Replace("{timer}", interval.ToString(@"mm\:ss"));
dpsString = dpsString.Replace("{partyDps}",
dpsString.Replace("{timer}", interval.ToString(@"mm\:ss"));
dpsString.Replace("{partyDps}",
FormatHelpers.Instance.FormatValue(lastHit - firstHit > 0
? entityInfo.TotalDamage/(lastHit - firstHit)
: 0) + LP.PerSecond);
dpsString = dpsString.Replace("{enrage}", FormatHelpers.Instance.FormatPercent(enrageperc));
dpsString.Replace("{enrage}", FormatHelpers.Instance.FormatPercent(enrageperc));

var placeholders = new List<KeyValuePair<PlayerDamageDealt, Dictionary<string, string>>>();
foreach (var playerStats in playerInfosOrdered)
{
var currentContent = content;

var playerHolder = new Dictionary<string, string>();
placeholders.Add(new KeyValuePair<PlayerDamageDealt, Dictionary<string, string>>(playerStats, playerHolder));
var buffs = abnormals.Get(playerStats.Source);
AbnormalityDuration slaying;
var firstOrDefault = heals.FirstOrDefault(x => x.Source == playerStats.Source);
Expand All @@ -166,47 +172,66 @@ public static string Copy(StatsSummary statsSummary, Skills skills, AbnormalityS
buffs.Times.TryGetValue(BasicTeraData.Instance.HotDotDatabase.Slaying, out slaying);
var slayingperc = lastTick - firstTick == 0
? 0
: (double) (slaying?.Duration(firstTick, lastTick) ?? 0)/(lastTick - firstTick);
currentContent = currentContent.Replace("{slaying}", FormatHelpers.Instance.FormatPercent(slayingperc));
currentContent = currentContent.Replace("{dps}",
FormatHelpers.Instance.FormatValue( playerStats.Interval == 0 ? playerStats.Amount : playerStats.Amount*TimeSpan.TicksPerSecond/playerStats.Interval) +
"/s");
currentContent = currentContent.Replace("{global_dps}",
FormatHelpers.Instance.FormatValue(entityInfo.Interval == 0 ? playerStats.Amount : playerStats.Amount*TimeSpan.TicksPerSecond/entityInfo.Interval) +
"/s");
currentContent = currentContent.Replace("{interval}", playerStats.Interval + LP.Seconds);
currentContent = currentContent.Replace("{damage_dealt}",
FormatHelpers.Instance.FormatValue(playerStats.Amount));
currentContent = currentContent.Replace("{class}", LP.ResourceManager.GetString(playerStats.Source.Class.ToString(), LP.Culture) + "");
currentContent = currentContent.Replace("{fullname}", playerStats.Source.FullName);
currentContent = currentContent.Replace("{name}", playerStats.Source.Name);
currentContent = currentContent.Replace("{deaths}", buffs.Death.Count(firstTick, lastTick) + "");
currentContent = currentContent.Replace("{death_duration}",
TimeSpan.FromTicks(buffs.Death.Duration(firstTick, lastTick)).ToString(@"mm\:ss"));
currentContent = currentContent.Replace("{aggro}",
buffs.Aggro(entityInfo.Entity).Count(firstTick, lastTick) + "");
currentContent = currentContent.Replace("{aggro_duration}",
TimeSpan.FromTicks(buffs.Aggro(entityInfo.Entity).Duration(firstTick, lastTick))
.ToString(@"mm\:ss"));
currentContent = currentContent.Replace("{damage_percentage}",
playerStats.Amount*100/entityInfo.TotalDamage + "%");
currentContent = currentContent.Replace("{crit_rate}", playerStats.CritRate + "%");
currentContent = currentContent.Replace("{crit_rate_heal}",
healCritrate + "%");
currentContent = currentContent.Replace("{biggest_crit}",
FormatHelpers.Instance.FormatValue(skills.BiggestCrit(playerStats.Source.User, entityInfo.Entity,
timedEncounter)));
currentContent = currentContent.Replace("{damage_received}",
FormatHelpers.Instance.FormatValue(skills.DamageReceived(playerStats.Source.User,
entityInfo.Entity, timedEncounter)));
currentContent = currentContent.Replace("{hits_received}",
FormatHelpers.Instance.FormatValue(skills.HitsReceived(playerStats.Source.User,
entityInfo.Entity, timedEncounter)));
: (double)(slaying?.Duration(firstTick, lastTick) ?? 0) / (lastTick - firstTick);
playerHolder["{slaying}"] = FormatHelpers.Instance.FormatPercent(slayingperc);
playerHolder["{dps}"] = FormatHelpers.Instance.FormatValue(playerStats.Interval == 0 ? playerStats.Amount : playerStats.Amount * TimeSpan.TicksPerSecond / playerStats.Interval) + LP.PerSecond;
playerHolder["{global_dps}"] = FormatHelpers.Instance.FormatValue(entityInfo.Interval == 0 ? playerStats.Amount : playerStats.Amount * TimeSpan.TicksPerSecond / entityInfo.Interval) + LP.PerSecond;
playerHolder["{interval}"] = playerStats.Interval/TimeSpan.TicksPerSecond + LP.Seconds;
playerHolder["{damage_dealt}"] = FormatHelpers.Instance.FormatValue(playerStats.Amount);
playerHolder["{class}"] = LP.ResourceManager.GetString(playerStats.Source.Class.ToString(), LP.Culture) + "";
playerHolder["{fullname}"] = playerStats.Source.FullName;
playerHolder["{name}"] = playerStats.Source.Name;
playerHolder["{deaths}"] = buffs.Death.Count(firstTick, lastTick) + "";
playerHolder["{death_duration}"] = TimeSpan.FromTicks(buffs.Death.Duration(firstTick, lastTick)).ToString(@"mm\:ss");
playerHolder["{aggro}"] = buffs.Aggro(entityInfo.Entity).Count(firstTick, lastTick) + "";
playerHolder["{aggro_duration}"] = TimeSpan.FromTicks(buffs.Aggro(entityInfo.Entity).Duration(firstTick, lastTick)).ToString(@"mm\:ss");
playerHolder["{damage_percentage}"] = playerStats.Amount * 100 / entityInfo.TotalDamage + "%";
playerHolder["{crit_rate}"] = playerStats.CritRate + "%";
playerHolder["{crit_rate_heal}"] = healCritrate + "%";
playerHolder["{biggest_crit}"] = FormatHelpers.Instance.FormatValue(skills.BiggestCrit(playerStats.Source.User, entityInfo.Entity, timedEncounter));
playerHolder["{damage_received}"] = FormatHelpers.Instance.FormatValue(skills.DamageReceived(playerStats.Source.User, entityInfo.Entity, timedEncounter));
playerHolder["{hits_received}"] = FormatHelpers.Instance.FormatValue(skills.HitsReceived(playerStats.Source.User, entityInfo.Entity, timedEncounter));
}
var placeholderLength = placeholders.SelectMany(x => x.Value).GroupBy(x=>x.Key).ToDictionary(x=>x.Key,x=>x.Max(z=> graphics.MeasureString(z.Value, Font, default(PointF), StringFormat.GenericTypographic).Width));
var dpsmono = new StringBuilder(dpsString.ToString());
var placeholderMono = placeholders.SelectMany(x => x.Value).GroupBy(x => x.Key).ToDictionary(x => x.Key, x => x.Max(z => z.Value.Length));
if (content.Contains('\\'))
placeholders.ForEach(x =>
{
var currentContent = new StringBuilder(content);
x.Value.ToList().ForEach(z => currentContent.Replace(z.Key, PadLeft(z.Value,placeholderLength[z.Key])));
dpsString.Append(currentContent);
currentContent = new StringBuilder(content);
x.Value.ToList().ForEach(z => currentContent.Replace(z.Key, z.Value.PadLeft(placeholderMono[z.Key])));
dpsmono.Append(currentContent);
});
else
{ placeholders.ForEach(x =>
{
var currentContent = new StringBuilder(content);
x.Value.ToList().ForEach(z => currentContent.Replace(z.Key, z.Value));
dpsString.Append(currentContent);
});
dpsmono = dpsString;
}
dpsString.Append(footer);
dpsmono.Append(footer);
dpsmono.Replace("\\", Environment.NewLine);
return new Tuple<string,string>(dpsString.ToString(),dpsmono.ToString());
}

dpsString += currentContent;
private static string PadLeft(string str, double length)
{
var result = str;
var olddelta = length - graphics.MeasureString(result, Font, default(PointF), StringFormat.GenericTypographic).Width;
var delta = length - graphics.MeasureString(result, Font, default(PointF), StringFormat.GenericTypographic).Width;
while (delta > 0)
{
result = " " + result;
olddelta = delta;
delta = length - graphics.MeasureString(result, Font, default(PointF), StringFormat.GenericTypographic).Width;
}
dpsString += footer;
return dpsString;
return olddelta+delta>=0?result:result.StartsWith(" ")?result.Substring(1,result.Length-1):result;
}
}
}
17 changes: 8 additions & 9 deletions DamageMeter.Core/DataExporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -279,18 +279,17 @@ private static void ToTeraDpsApi(EncounterBase teradpsData, NpcEntity entity)
*/
var areaId = int.Parse(teradpsData.areaId);
if (
areaId != 886 &&
//areaId != 886 &&
areaId != 467 &&
areaId != 767 &&
areaId != 768 &&
areaId != 470 &&
areaId != 468
//areaId != 770 &&
//areaId != 769 &&
//areaId != 916 &&
//areaId != 969 &&
//areaId != 970 &&
//areaId != 950
areaId != 468 &&
areaId != 770 &&
areaId != 769 &&
areaId != 916 &&
areaId != 969 &&
areaId != 970 &&
areaId != 950
)
{
return;
Expand Down
4 changes: 2 additions & 2 deletions DamageMeter.Core/NetworkController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ public static void CopyThread(StatsSummary stats, Skills skills, AbnormalityStor
{
try
{
Clipboard.SetText(text);
Clipboard.SetText(text.Item2);
break;
}
catch
Expand All @@ -221,7 +221,7 @@ public static void CopyThread(StatsSummary stats, Skills skills, AbnormalityStor
//Ignore
}
}
CopyPaste.Paste(text);
CopyPaste.Paste(text.Item1);
}

internal PacketProcessingFactory PacketProcessing = new PacketProcessingFactory();
Expand Down
24 changes: 20 additions & 4 deletions DamageMeter.Core/Processing/S_Login.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using Data;
using Lang;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Drawing.Text;

using Tera.Game;

namespace DamageMeter.Processing
Expand Down Expand Up @@ -41,6 +40,7 @@ internal S_LOGIN(Tera.Game.Messages.LoginServerMessage message)
NetworkController.Instance.EntityTracker = new EntityTracker(BasicTeraData.Instance.MonsterDatabase);
NetworkController.Instance.PlayerTracker = new PlayerTracker(NetworkController.Instance.EntityTracker, BasicTeraData.Instance.Servers);
Database.Database.Instance.DeleteAll();
SelectFont(NetworkController.Instance.Server.Region);
}
NetworkController.Instance.NeedInit = false;
}
Expand All @@ -51,5 +51,21 @@ internal S_LOGIN(Tera.Game.Messages.LoginServerMessage message)
NetworkController.Instance.EntityTracker.Update(message);
NetworkController.Instance.PacketProcessing.Update();
}
internal static void SelectFont(string region)
{
CopyPaste.PFC = new PrivateFontCollection();
if (region=="RU")
CopyPaste.PFC.AddFontFile(BasicTeraData.Instance.ResourceDirectory + "data\\fonts\\Fira Sans.ttf");
else if (region == "KR")
CopyPaste.PFC.AddFontFile(BasicTeraData.Instance.ResourceDirectory + "data\\fonts\\2002L_chat.ttf");
else if (region == "TW")
CopyPaste.PFC.AddFontFile(BasicTeraData.Instance.ResourceDirectory + "data\\fonts\\2002L_chat.ttf");
else if (region == "JP")
CopyPaste.PFC.AddFontFile(BasicTeraData.Instance.ResourceDirectory + "data\\fonts\\TT-UDShinGo-Medium.ttf");
else
CopyPaste.PFC.AddFontFile(BasicTeraData.Instance.ResourceDirectory + "data\\fonts\\Frutiger LT Pro 55 Roman.ttf");
CopyPaste.Font = new Font(CopyPaste.PFC.Families[0], 12, FontStyle.Regular, GraphicsUnit.Pixel);

}
}
}
10 changes: 5 additions & 5 deletions DamageMeter.UI/NotifyIcon.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -363,22 +363,22 @@ private void DisableCountOnlyBoss(object sender, RoutedEventArgs e)

private void NumberPlayersChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
BasicTeraData.Instance.WindowData.NumberOfPlayersDisplayed = (int)NumberPlayersSpinner.Value;
BasicTeraData.Instance.WindowData.NumberOfPlayersDisplayed = (int?)NumberPlayersSpinner?.Value??5;
}

private void LFDelayChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
BasicTeraData.Instance.WindowData.LFDelay = (int)LFDelaySpinner.Value;
BasicTeraData.Instance.WindowData.LFDelay = (int?)LFDelaySpinner?.Value??150;
}

private void PopupTimeChange(object sender, RoutedPropertyChangedEventArgs<object> e)
{
BasicTeraData.Instance.WindowData.PopupDisplayTime = (int)PopupTimeSpinner.Value;
BasicTeraData.Instance.WindowData.PopupDisplayTime = (int?)PopupTimeSpinner?.Value??0;
}

private void SoundTimeChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
BasicTeraData.Instance.WindowData.SoundNotifyDuration = (int)SoundTimeSpinner.Value;
BasicTeraData.Instance.WindowData.SoundNotifyDuration = (int?)SoundTimeSpinner?.Value??0;

}

Expand All @@ -395,7 +395,7 @@ private void SoundFileChanged(object sender, RoutedEventArgs e)

private void SoundVolumeChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
BasicTeraData.Instance.WindowData.Volume = (float)SoundVolumeSpinner.Value;
BasicTeraData.Instance.WindowData.Volume = (float?)SoundVolumeSpinner?.Value??0;
}

private void TestSoundAction(object sender, RoutedEventArgs e)
Expand Down
1 change: 1 addition & 0 deletions NetworkSniffer/NetworkSniffer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Management" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
Expand Down
5 changes: 4 additions & 1 deletion NetworkSniffer/TcpConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Management;
using System.Net;
using System.Windows.Forms;
using Data;
Expand Down Expand Up @@ -80,7 +81,9 @@ internal void HandleTcpReceived(uint sequenceNumber, ArraySegment<byte> data)

if (_bufferedPackets.Count > 100)
{
string debug = (BasicTeraData.Instance.WindowData.LowPriority ? "Low priority " : "Normal priority ") + SnifferType +
var name = (from x in new ManagementObjectSearcher("SELECT Version FROM Win32_OperatingSystem").Get().Cast<ManagementObject>()
select x.GetPropertyValue("Version")).FirstOrDefault()?.ToString() ?? "unknown";
string debug = (BasicTeraData.Instance.WindowData.LowPriority ? "Low priority " : "Normal priority ") + SnifferType + " running on win "+name+
" Received: " + BytesReceived + "\r\n" + _bufferedPackets.First().Key + ": " + _bufferedPackets.First().Value.Length + "\r\nQueue length:" + _bufferedPackets.Count;
while (_bufferedPackets.Values.First().Length >= 500)
_bufferedPackets.Remove(_bufferedPackets.Keys.First());
Expand Down
2 changes: 1 addition & 1 deletion resources/data

0 comments on commit 48588be

Please sign in to comment.