Advertisement
Guest User

Untitled

a guest
Apr 25th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.42 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using Pipliz;
  4.  
  5. namespace ScarabolMods
  6. {
  7. [ModLoader.ModManager]
  8. public static class CommandsModEntries
  9. {
  10. public static string MOD_PREFIX = "mods.scarabol.commands.";
  11. public static string ModDirectory;
  12.  
  13. [ModLoader.ModCallback(ModLoader.EModCallbackType.OnAssemblyLoaded, "scarabol.commands.assemblyload")]
  14. public static void OnAssemblyLoaded(string path)
  15. {
  16. ModDirectory = Path.GetDirectoryName(path);
  17. }
  18.  
  19. [ModLoader.ModCallback(ModLoader.EModCallbackType.AfterStartup, "scarabol.commands.registercallbacks")]
  20. public static void AfterStartup()
  21. {
  22. Log.Write("Loaded Commands Mod 6.0.10 by Scarabol");
  23. }
  24. }
  25.  
  26. public static class PlayerHelper
  27. {
  28. public static bool TryGetPlayer(string identifier, out Players.Player targetPlayer, out string error)
  29. {
  30. return TryGetPlayer(identifier, out targetPlayer, out error, false);
  31. }
  32.  
  33. public static bool TryGetPlayer(string identifier, out Players.Player targetPlayer, out string error, bool includeOffline)
  34. {
  35. targetPlayer = null;
  36. if (identifier.StartsWith("'"))
  37. {
  38. if (identifier.EndsWith("'"))
  39. {
  40. identifier = identifier.Substring(1, identifier.Length - 2);
  41. }
  42. else
  43. {
  44. error = "missing ' after playername";
  45. return false;
  46. }
  47. }
  48. if (identifier.Length < 1)
  49. {
  50. error = "no playername given";
  51. return false;
  52. }
  53. ulong steamid;
  54. if (ulong.TryParse(identifier, out steamid))
  55. {
  56. Steamworks.CSteamID csteamid = new Steamworks.CSteamID(steamid);
  57. if (csteamid.IsValid())
  58. {
  59. NetworkID networkId = new NetworkID(csteamid);
  60. error = "";
  61. if (Players.TryGetPlayer(networkId, out targetPlayer))
  62. {
  63. return true;
  64. }
  65. else
  66. {
  67. targetPlayer = null;
  68. }
  69. }
  70. }
  71. int closestDist = int.MaxValue;
  72. Players.Player closestMatch = null;
  73. foreach (var player in Players.PlayerDatabase.ValuesAsList)
  74. {
  75. if (!player.IsConnected && !includeOffline)
  76. {
  77. continue;
  78. }
  79. if (player.Name != null)
  80. {
  81. if (string.Equals(player.Name, identifier, StringComparison.InvariantCultureIgnoreCase))
  82. {
  83. if (targetPlayer == null)
  84. {
  85. targetPlayer = player;
  86. }
  87. else
  88. {
  89. targetPlayer = null;
  90. error = "duplicate player name, pls use SteamID";
  91. return false;
  92. }
  93. }
  94. else
  95. {
  96. int levDist = LevenshteinDistance.Compute(player.Name.ToLower(), identifier.ToLower());
  97. if (levDist < closestDist)
  98. {
  99. closestDist = levDist;
  100. closestMatch = player;
  101. }
  102. else if (levDist == closestDist)
  103. {
  104. closestMatch = null;
  105. }
  106. }
  107. }
  108. }
  109. if (targetPlayer != null)
  110. {
  111. error = "";
  112. return true;
  113. }
  114. else if (closestMatch != null && (closestDist < closestMatch.Name.Length * 0.2))
  115. {
  116. error = "";
  117. targetPlayer = closestMatch;
  118. Log.Write($"Name '{identifier}' did not match, picked closest match '{targetPlayer.Name}' instead");
  119. return true;
  120. }
  121. error = "player not found";
  122. return false;
  123. }
  124. }
  125.  
  126. // src: https://www.dotnetperls.com/levenshtein
  127. static class LevenshteinDistance
  128. {
  129. public static int Compute(string s, string t)
  130. {
  131. var n = s.Length;
  132. var m = t.Length;
  133. int[,] d = new int[n + 1, m + 1];
  134. if (n == 0)
  135. {
  136. return m;
  137. }
  138. if (m == 0)
  139. {
  140. return n;
  141. }
  142. for (var i = 0; i <= n; d[i, 0] = i++)
  143. {
  144. }
  145. for (var j = 0; j <= m; d[0, j] = j++)
  146. {
  147. }
  148. for (var i = 1; i <= n; i++)
  149. {
  150. for (var j = 1; j <= m; j++)
  151. {
  152. var cost = (t[j - 1] == s[i - 1]) ? 0 : 1;
  153. d[i, j] = System.Math.Min(
  154. System.Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
  155. d[i - 1, j - 1] + cost);
  156. }
  157. }
  158. return d[n, m];
  159. }
  160. }
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement