Guest User

Weapon Damager

a guest
Sep 8th, 2024
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.39 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Text;
  3. using Oxide.Core.Configuration;
  4. using Oxide.Core;
  5. using System;
  6. using System.Linq;
  7. using Oxide.Core.Libraries.Covalence;
  8. using System.Text.RegularExpressions;
  9.  
  10. namespace Oxide.Plugins
  11. {
  12. //Body part scaling from k1lly0u's plugin, with permission (thanks, k1lly0u)
  13. //Further code cleanup/improvement with help of k1lly0u
  14. [Info("Weapon Damage Scaler", "Shady", "1.1.8", ResourceId = 1594)]
  15. [Description("Scale damage per weapon, ammo types, skins, prefabs, and per body part.")]
  16. internal class WeaponDamageScaler : RustPlugin
  17. {
  18. private readonly Dictionary<ulong, string> skinIDName = new Dictionary<ulong, string>();
  19. private WeaponData weaponData;
  20. private DynamicConfigFile wData;
  21. private float GlobalDamageScale;
  22.  
  23. private readonly Array buildingGrades = Enum.GetValues(typeof(BuildingGrade.Enum));
  24. private readonly HashSet<string> prefabNames = new HashSet<string>();
  25.  
  26. private readonly List<string> _forbiddenTags = new List<string> { "</color>", "</size>", "<b>", "</b>", "<i>", "</i>" };
  27.  
  28. private readonly Regex _colorRegex = new Regex("(<color=.+?>)");
  29. private readonly Regex _sizeRegex = new Regex("(<size=.+?>)");
  30.  
  31. #region Data Management
  32. private class ItemStructure
  33. {
  34. public string Name;
  35. public float GlobalModifier = 1.0f;
  36. public Dictionary<string, float> IndividualParts = new Dictionary<string, float>();
  37. public Dictionary<string, float> PrefabModifiers = new Dictionary<string, float>();
  38. }
  39.  
  40. private class WeaponData { public Dictionary<string, ItemStructure> Weapons = new Dictionary<string, ItemStructure>(); }
  41.  
  42. private void InitializeWeaponData()
  43. {
  44. var skinNameDir = new List<string>();
  45. foreach (var kvp in Rust.Workshop.Approved.All)
  46. {
  47. var skin = kvp.Value;
  48. if (skin.Skinnable.Category == Rust.Workshop.Category.Weapon) skinNameDir.Add(skin.Name);
  49. }
  50. ItemStructure outStructure;
  51. for (int i = 0; i < ItemManager.itemList.Count; i++)
  52. {
  53. var definition = ItemManager.itemList[i];
  54. if (definition == null) continue;
  55. if ((definition.category == ItemCategory.Weapon || definition.category == ItemCategory.Tool || definition.category == ItemCategory.Ammunition) && !definition.shortname.Contains("mod") && !weaponData.Weapons.TryGetValue(definition.shortname, out outStructure)) weaponData.Weapons[definition.shortname] = new ItemStructure { Name = definition.displayName.english, GlobalModifier = 1.0f, PrefabModifiers = new Dictionary<string, float>(), IndividualParts = CreateBodypartList() };
  56.  
  57. var skinDir = ItemSkinDirectory.ForItem(definition) ?? null;
  58. if (skinDir != null && skinDir.Length > 0 && (definition.category == ItemCategory.Weapon || definition.category == ItemCategory.Tool))
  59. {
  60. for (int j = 0; j < skinDir.Length; j++)
  61. {
  62. var skin = skinDir[j];
  63. var name = skin.invItem?.displayName?.english ?? skin.name;
  64. if (!skinNameDir.Contains(name)) skinNameDir.Add(name);
  65. }
  66. }
  67. }
  68. for (int i = 0; i < skinNameDir.Count; i++)
  69. {
  70. var skin = skinNameDir[i];
  71. if (!weaponData.Weapons.TryGetValue(skin, out outStructure)) weaponData.Weapons[skin] = new ItemStructure { Name = skin, GlobalModifier = 1.0f, PrefabModifiers = new Dictionary<string, float>(), IndividualParts = CreateBodypartList() };
  72. }
  73. SaveData();
  74. }
  75. private Dictionary<string, float> CreateBodypartList()
  76. {
  77. Dictionary<string, float> newData = new Dictionary<string, float>();
  78. for (int i = 0; i < Bodyparts.Length; i++) newData.Add(Bodyparts[i], 1.0f);
  79. return newData;
  80. }
  81.  
  82. private void SaveData() => wData?.WriteObject(weaponData);
  83.  
  84. private void LoadData()
  85. {
  86. try
  87. {
  88. wData = Interface.Oxide.DataFileSystem.GetFile("damagescaler_data");
  89. weaponData = Interface.GetMod().DataFileSystem.ReadObject<WeaponData>("damagescaler_data");
  90. InitializeWeaponData();
  91. }
  92. catch (Exception ex)
  93. {
  94. PrintError(ex.ToString());
  95. PrintWarning("Unable to load data, creating new datafile!");
  96. weaponData = new WeaponData();
  97. }
  98. }
  99. #endregion
  100. #region Config
  101. protected override void LoadDefaultConfig()
  102. {
  103. Config["GlobalDamageScaler"] = GlobalDamageScale = GetConfig("GlobalDamageScaler", 1.0f);
  104. SaveConfig();
  105. }
  106.  
  107. private T GetConfig<T>(string name, T defaultValue)
  108. {
  109. if (Config[name] == null) return defaultValue;
  110. return (T)Convert.ChangeType(Config[name], typeof(T));
  111. }
  112. public string[] Bodyparts = new string[]
  113. {
  114. "r_forearm",
  115. "l_forearm",
  116. "l_upperarm",
  117. "r_upperarm",
  118. "r_hand",
  119. "l_hand",
  120. "pelvis",
  121. "l_hip",
  122. "r_hip",
  123. "spine3",
  124. "spine4",
  125. "spine1",
  126. "spine2",
  127. "r_knee",
  128. "r_foot",
  129. "r_toe",
  130. "l_knee",
  131. "l_foot",
  132. "l_toe",
  133. "head",
  134. "neck",
  135. "jaw",
  136. "r_eye",
  137. "l_eye"
  138. };
  139. #endregion
  140. #region Localization
  141. protected override void LoadDefaultMessages()
  142. {
  143. var messages = new Dictionary<string, string>
  144. {
  145. //DO NOT EDIT LANGUAGE FILES HERE!
  146. {"noPerms", "You do not have permission to use this command!"},
  147. {"invalidSyntax", "Invalid Syntax, usage example: setscale <weaponname> <x.x>"},
  148. {"itemSkinNotFound", "Item/Skin: \"" + "{item}" + "\" does not exist, syntax example: setscale <WeaponOrAmmoOrSkinName> <x.x>" },
  149. {"invalidSyntaxBodyPart", "<color=orange>/scalebp weapon <shortname> <bone> <amount></color> - Scale damage done for <shortname> to <bone>"},
  150. {"bodyPartExample", "<color=orange>-- ex. /scalebp weapon rifle.ak pelvis 1.25</color> - Damage done from a assault rifle to a pelvis is set to 125%"},
  151. {"scaleList", "<color=orange>/scalebp list</color> - Displays all bones"},
  152. {"shortnameNotFound", "Could not find a weapon with the shortname: <color=orange>{0}</color>"},
  153. {"bonePartNotFound", "Could not find a bone called: <color=orange>{0}</color>. Check /scalebp list"},
  154. {"bodyPartExample2", "<color=orange>/scalebp weapon <shortname> <bone> <amount></color>"},
  155. {"successfullyChangedValueBP","You have changed <color=orange>{0}'s</color> damage against <color=orange>{1}</color> to <color=orange>{2}</color>x damage" },
  156. {"alreadySameValue", "This is already the value for the selected item!"},
  157. {"scaledItem", "Scaled \"" + "{engName}" + "\" (" + "{shortName}" + ") " + "to: " + "{scaledValue}"},
  158. {"prefabNotExist", "Prefab/Building grade does not exist: {0}" },
  159. {"scaledPrefab", "Scaled Prefab/Building grade \"{0}\" by {1} for weapon {2}" },
  160. };
  161. lang.RegisterMessages(messages, this);
  162. }
  163. private string GetMessage(string key, string steamId = null) => lang.GetMessage(key, this, steamId);
  164. #endregion
  165. #region Oxide Hooks
  166. private void OnServerInitialized()
  167. {
  168. var strs = GameManifest.Current.pooledStrings;
  169. for (int i = 0; i < strs.Length; i++)
  170. {
  171. var str = strs[i].str ?? string.Empty;
  172. prefabNames.Add(str);
  173. }
  174.  
  175. for (int i = 0; i < ItemManager.itemList.Count; i++)
  176. {
  177. var item = ItemManager.itemList[i];
  178. var skinDir = ItemSkinDirectory.ForItem(item);
  179. if (skinDir == null || skinDir.Length < 1) continue;
  180. for (int j = 0; j < skinDir.Length; j++)
  181. {
  182. var skin = skinDir[j];
  183. ulong skinID;
  184. if (ulong.TryParse(skin.id.ToString(), out skinID)) skinIDName[skinID] = (skin.invItem?.displayName?.english ?? skin.name);
  185. }
  186. }
  187.  
  188. foreach (var kvp in Rust.Workshop.Approved.All)
  189. {
  190. var val = kvp.Value;
  191. skinIDName[val.WorkshopdId] = val.Name;
  192. }
  193.  
  194. LoadData();
  195. }
  196.  
  197. private void Init()
  198. {
  199. RegisterPerm("weapondamagescaler.setscale");
  200. RegisterPerm("weapondamagescaler.setscalebp");
  201. RegisterPerm("weapondamagescaler.allowed");
  202. AddCovalenceCommand("setscale", nameof(CmdSetScale));
  203. AddCovalenceCommand("scalebp", nameof(cmdScaleBP));
  204. LoadDefaultConfig();
  205. LoadDefaultMessages();
  206. }
  207.  
  208. private void Unload() => SaveData();
  209.  
  210. private void OnExplosiveThrown(BasePlayer player, BaseEntity entity)
  211. {
  212. if (player == null || entity == null) return;
  213.  
  214.  
  215.  
  216. var sb = Facepunch.Pool.Get<StringBuilder>();
  217. try
  218. {
  219. ItemStructure itemStruct;
  220. var prefabName = sb.Clear().Append(entity.ShortPrefabName).Replace("_", ".").Replace(".deployed", string.Empty).ToString();
  221. if (weaponData.Weapons.TryGetValue(prefabName, out itemStruct))
  222. {
  223. var c4 = entity?.GetComponent<TimedExplosive>() ?? null;
  224. if (c4 != null) for (int i = 0; i < c4.damageTypes.Count; i++) c4.damageTypes[i].amount *= itemStruct?.GlobalModifier ?? 1f;
  225. }
  226. }
  227. finally { Facepunch.Pool.FreeUnmanaged(ref sb); }
  228.  
  229. }
  230.  
  231. private void OnRocketLaunched(BasePlayer player, BaseEntity entity)
  232. {
  233. var explosive = entity as TimedExplosive;
  234. if (explosive == null) return;
  235.  
  236. var sb = Facepunch.Pool.Get<StringBuilder>();
  237. try
  238. {
  239. var ammoName = sb.Clear().Append("ammo.").Append(entity.ShortPrefabName).Replace("_", ".").ToString();
  240. ItemStructure itemStruct;
  241. if (weaponData.Weapons.TryGetValue(ammoName, out itemStruct)) for (int i = 0; i < explosive.damageTypes.Count; i++) explosive.damageTypes[i].amount *= itemStruct?.GlobalModifier ?? 1f;
  242. }
  243. finally { Facepunch.Pool.FreeUnmanaged(ref sb); }
  244.  
  245.  
  246. }
  247.  
  248. private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo)
  249. {
  250. if (entity == null || hitInfo == null) return;
  251.  
  252. var type = hitInfo?.damageTypes?.GetMajorityDamageType() ?? Rust.DamageType.Generic;
  253. if (type == Rust.DamageType.Suicide) return;
  254.  
  255. var attacker = hitInfo?.Initiator as BasePlayer;
  256. if (attacker != null && HasPermID(attacker.UserIDString, "weapondamagescaler.allowed"))
  257. {
  258. if (GlobalDamageScale != 1.0f) hitInfo?.damageTypes?.ScaleAll(GlobalDamageScale);
  259. else ScaleDealtDamage(hitInfo);
  260. }
  261. }
  262. #endregion
  263. #region Commands
  264. private void CmdSetScale(IPlayer player, string command, string[] args)
  265. {
  266. if (!HasPerm(player, "weapondamagescaler.setscale"))
  267. {
  268. SendReply(player, GetMessage("noPerms", player.Id));
  269. return;
  270. }
  271. if (args.Length <= 1)
  272. {
  273. SendReply(player, GetMessage("invalidSyntax", player.Id));
  274. return;
  275. }
  276.  
  277.  
  278. var itemName = args[0].ToLower();
  279. var englishName = GetEnglishName(itemName);
  280. var prefabName = (args.Length > 2) ? args[2].ToLower() : string.Empty;
  281. var shortName = string.Empty;
  282.  
  283. foreach (var entry in weaponData.Weapons)
  284. {
  285. if (entry.Value.Name.Equals(itemName, StringComparison.OrdinalIgnoreCase))
  286. {
  287. shortName = entry.Key;
  288. break;
  289. }
  290. else if (entry.Key.Equals(itemName, StringComparison.OrdinalIgnoreCase))
  291. {
  292. shortName = entry.Key;
  293. break;
  294. }
  295. }
  296. if (string.IsNullOrEmpty(shortName)) shortName = skinIDName?.Where(p => p.Value.ToLower() == itemName)?.FirstOrDefault().Value ?? string.Empty;
  297. ItemStructure itemStruct;
  298. if (string.IsNullOrEmpty(shortName) || !weaponData.Weapons.TryGetValue(shortName, out itemStruct))
  299. {
  300. SendReply(player, GetMessage("itemSkinNotFound", player.Id).Replace("{item}", englishName));
  301. return;
  302. }
  303.  
  304. var value = 0f;
  305. if (!float.TryParse(args[1], out value))
  306. {
  307. SendReply(player, GetMessage("invalidSyntax", player.Id));
  308. return;
  309. }
  310.  
  311. if (!string.IsNullOrEmpty(shortName))
  312. {
  313. if (!string.IsNullOrEmpty(prefabName))
  314. {
  315. if (!PrefabExists(prefabName) && !GradeExists(prefabName))
  316. {
  317. SendReply(player, string.Format(GetMessage("prefabNotExist", player.Id), prefabName));
  318. return;
  319. }
  320. if (weaponData.Weapons[shortName].PrefabModifiers == null || weaponData.Weapons[shortName].PrefabModifiers.Count < 1) weaponData.Weapons[shortName].PrefabModifiers = new Dictionary<string, float>();
  321. weaponData.Weapons[shortName].PrefabModifiers[prefabName] = value;
  322. SendReply(player, string.Format(GetMessage("scaledPrefab", player.Id), prefabName, value, englishName));
  323. return;
  324. }
  325. if (weaponData.Weapons[shortName].GlobalModifier == value)
  326. {
  327. SendReply(player, GetMessage("alreadySameValue", player.Id));
  328. return;
  329. }
  330.  
  331. weaponData.Weapons[shortName].GlobalModifier = value;
  332.  
  333.  
  334. var sb = new StringBuilder(GetMessage("scaledItem", player.Id));
  335.  
  336. var finalstring =
  337. sb
  338. .Replace("{engName}", englishName)
  339. .Replace("{shortName}", shortName)
  340. .Replace("{scaledValue}", value.ToString())
  341. .ToString();
  342.  
  343. SendReply(player, finalstring);
  344. }
  345. else SendReply(player, GetMessage("invalidSyntax", player.Id));
  346. }
  347.  
  348. private void cmdScaleBP(IPlayer player, string command, string[] args)
  349. {
  350. if (!HasPerm(player, "weapondamagescaler.setscalebp"))
  351. {
  352. SendReply(player, GetMessage("noPerms", player.Id));
  353. return;
  354. }
  355. if (args.Length < 1)
  356. {
  357. SendReply(player, GetMessage("invalidSyntaxBodyPart", player.Id));
  358. SendReply(player, GetMessage("bodyPartExample", player.Id));
  359. SendReply(player, GetMessage("scaleList", player.Id)); //send in three messages to prevent it going invisible from character limit(?)
  360. return;
  361. }
  362. switch (args[0].ToLower())
  363. {
  364. case "weapon":
  365. if (args.Length >= 3)
  366. {
  367. var shortName = string.Empty;
  368. var engName = args[1].ToLower();
  369.  
  370. foreach (var entry in weaponData.Weapons)
  371. {
  372. if (entry.Value.Name.ToLower() == engName)
  373. {
  374. shortName = entry.Key;
  375. break;
  376. }
  377. else if (entry.Key.ToLower() == engName)
  378. {
  379. shortName = entry.Key;
  380. break;
  381. }
  382. }
  383. if (!string.IsNullOrEmpty(shortName))
  384. {
  385. if (weaponData.Weapons.ContainsKey(shortName))
  386. {
  387. if (weaponData.Weapons[shortName].IndividualParts.ContainsKey(args[2].ToLower()))
  388. {
  389. float i = 0;
  390. if (args.Length == 4)
  391. if (!float.TryParse(args[3], out i)) i = 1.0f;
  392. weaponData.Weapons[shortName].IndividualParts[args[2].ToLower()] = i;
  393. SaveData();
  394. SendReply(player, string.Format(GetMessage("successfullyChangedValueBP", player.Id), args[1], args[2], i));
  395. return;
  396. }
  397. SendReply(player, string.Format(GetMessage("bonePartNotFound", player.Id), args[2]));
  398. return;
  399. }
  400. SendReply(player, string.Format(GetMessage("shortnameNotFound", player.Id), args[1]));
  401. return;
  402. }
  403. }
  404. SendReply(player, GetMessage("bodyPartExample2", player.Id));
  405. return;
  406.  
  407. case "list":
  408. var bpPlayer = player?.Object as BasePlayer;
  409. if (bpPlayer == null) return;
  410. var BPsb = new StringBuilder();
  411. for (int i = 0; i < Bodyparts.Length; i++)
  412. {
  413. var bp = Bodyparts[i];
  414. var bpName = FirstUpper(bpPlayer?.skeletonProperties?.FindBone(StringPool.Get(bp))?.name?.english ?? bp);
  415. BPsb.AppendLine(bp + " (" + bpName + "), ");
  416. }
  417. SendReply(bpPlayer, BPsb.ToString().TrimEnd().TrimEnd(','));
  418. return;
  419. }
  420. }
  421. #endregion
  422. #region Util
  423. private string GetSkinName(ulong skinID)
  424. {
  425. string skinName;
  426. skinIDName.TryGetValue(skinID, out skinName);
  427. return skinName;
  428. }
  429.  
  430. private ItemDefinition GetItemDefFromPrefabName(string shortprefabName)
  431. {
  432. if (string.IsNullOrEmpty(shortprefabName)) return null;
  433. var adjName = shortprefabName.Replace("_deployed", "").Replace(".deployed", "").Replace("_", "").Replace(".entity", "");
  434. var def = ItemManager.FindItemDefinition(adjName);
  435. if (def != null) return def;
  436. adjName = shortprefabName.Replace("_deployed", "").Replace(".deployed", "").Replace("_", ".").Replace(".entity", "");
  437. return ItemManager.FindItemDefinition(adjName);
  438. }
  439.  
  440. //this code feels messy but it works I guess
  441. private void ScaleDealtDamage(HitInfo hitInfo)
  442. {
  443. if (hitInfo == null || hitInfo?.damageTypes == null) return;
  444. if (hitInfo?.Weapon == null && hitInfo?.WeaponPrefab == null) hitInfo.WeaponPrefab = hitInfo.Weapon = hitInfo?.InitiatorPlayer?.GetHeldEntity()?.GetComponent<AttackEntity>() ?? null;
  445.  
  446. if (hitInfo?.Weapon == null && hitInfo?.WeaponPrefab == null) return;
  447. var bodypart = StringPool.Get((hitInfo?.HitBone ?? 0)) ?? string.Empty;
  448. var wepPrefab = hitInfo?.Weapon?.ShortPrefabName ?? hitInfo?.WeaponPrefab?.ShortPrefabName ?? string.Empty;
  449. var weaponName = hitInfo?.Weapon?.GetItem()?.info?.shortname ?? hitInfo?.WeaponPrefab?.GetItem()?.info?.shortname ?? string.Empty;
  450. if (string.IsNullOrEmpty(weaponName) && !string.IsNullOrEmpty(wepPrefab) && !wepPrefab.Contains("rocket") && !wepPrefab.Contains("explosive")) weaponName = GetItemDefFromPrefabName(wepPrefab)?.shortname ?? string.Empty;
  451. var ammoName = hitInfo?.Weapon?.GetItem()?.GetHeldEntity()?.GetComponent<BaseProjectile>()?.primaryMagazine?.ammoType?.shortname ?? string.Empty;
  452. if (string.IsNullOrEmpty(ammoName)) ammoName = (hitInfo?.Weapon ?? hitInfo?.WeaponPrefab ?? null)?.GetComponent<BaseProjectile>()?.primaryMagazine?.ammoType?.shortname ?? string.Empty;
  453.  
  454. var skinName = GetSkinName(hitInfo?.Weapon?.GetItem()?.skin ?? 0);
  455. ItemStructure weaponInfo = null;
  456. ItemStructure ammoInfo = null;
  457. ItemStructure skinInfo = null;
  458. if (!string.IsNullOrEmpty(weaponName)) weaponData.Weapons.TryGetValue(weaponName, out weaponInfo);
  459. if (!string.IsNullOrEmpty(ammoName)) weaponData.Weapons.TryGetValue(ammoName, out ammoInfo);
  460. if (!string.IsNullOrEmpty(skinName)) weaponData.Weapons.TryGetValue(skinName, out skinInfo);
  461. var ammoMod = ammoInfo?.GlobalModifier ?? 1.0f;
  462. var skinMod = skinInfo?.GlobalModifier ?? 1.0f;
  463. var prefabName = hitInfo?.HitEntity?.ShortPrefabName ?? string.Empty;
  464. var gradeName = (hitInfo?.HitEntity?.GetComponent<BuildingBlock>()?.grade ?? BuildingGrade.Enum.None).ToString().ToLower();
  465.  
  466.  
  467. var prefabModWeapon = 1.0f;
  468. var prefabModAmmo = 1.0f;
  469. var prefabModSkin = 1.0f;
  470. var individualModWeapon = 1.0f;
  471. var individualModAmmo = 1.0f;
  472. var individualModSkin = 1.0f;
  473. if (weaponInfo != null)
  474. {
  475. if (!weaponInfo.PrefabModifiers.TryGetValue(prefabName, out prefabModWeapon) && !weaponInfo.PrefabModifiers.TryGetValue(gradeName, out prefabModWeapon)) prefabModWeapon = 1.0f;
  476. if (!weaponInfo.IndividualParts.TryGetValue(bodypart, out individualModWeapon)) individualModWeapon = 1.0f;
  477. }
  478. if (ammoInfo != null)
  479. {
  480. if (!ammoInfo.PrefabModifiers.TryGetValue(prefabName, out prefabModAmmo) && !ammoInfo.PrefabModifiers.TryGetValue(gradeName, out prefabModAmmo)) prefabModAmmo = 1.0f;
  481. if (!ammoInfo.IndividualParts.TryGetValue(bodypart, out individualModAmmo)) individualModAmmo = 1.0f;
  482. }
  483. if (skinInfo != null)
  484. {
  485. if (skinInfo != null && !skinInfo.PrefabModifiers.TryGetValue(prefabName, out prefabModSkin) && !skinInfo.PrefabModifiers.TryGetValue(gradeName, out prefabModSkin)) prefabModSkin = 1.0f;
  486. if (!skinInfo.IndividualParts.TryGetValue(bodypart, out individualModSkin)) individualModSkin = 1.0f;
  487. }
  488.  
  489. var prefabMod = (prefabModWeapon + prefabModAmmo + prefabModSkin) - 2;
  490.  
  491. var globalMod = weaponInfo?.GlobalModifier ?? 1.0f;
  492.  
  493. var individualMod = (individualModWeapon + individualModSkin + individualModAmmo) - 2;
  494.  
  495. var totalMod = (globalMod + individualMod + ammoMod + prefabMod + skinMod) - 4;
  496.  
  497. if (totalMod != 1.0f) hitInfo?.damageTypes?.ScaleAll(totalMod);
  498. }
  499.  
  500. //Borrowed RemoveTags from BetterChat//
  501. //Modified quite a bit
  502. private string RemoveTags(string phrase)
  503. {
  504. if (string.IsNullOrEmpty(phrase)) return phrase;
  505.  
  506.  
  507. // Replace Color Tags
  508. phrase = _colorRegex.Replace(phrase, string.Empty);
  509. // Replace Size Tags
  510. phrase = _sizeRegex.Replace(phrase, string.Empty);
  511.  
  512. var phraseSB = Facepunch.Pool.Get<StringBuilder>();
  513. try
  514. {
  515. phraseSB.Clear().Append(phrase);
  516.  
  517. for (int i = 0; i < _forbiddenTags.Count; i++) phraseSB.Replace(_forbiddenTags[i], string.Empty);
  518.  
  519. return phraseSB.ToString();
  520. }
  521. finally { Facepunch.Pool.FreeUnmanaged(ref phraseSB); }
  522. }
  523.  
  524. private void RegisterPerm(string perm) => permission.RegisterPermission(perm, this);
  525.  
  526. private bool HasPermID(string userID, string perm) => permission.UserHasPermission(userID, perm);
  527.  
  528. private bool HasPerm(IPlayer player, string perm) => player?.HasPermission(perm) ?? false;
  529.  
  530. private void SendReply(IPlayer player, string message)
  531. {
  532. if (player == null || string.IsNullOrEmpty(message)) return;
  533. if (player.IsServer || player?.Object == null) message = RemoveTags(message); //remove tags for console (may no longer be needed? - needs to be checked)
  534. player.Message(message);
  535. }
  536.  
  537. private bool PrefabExists(string prefabName)
  538. {
  539. if (string.IsNullOrEmpty(prefabName)) return false;
  540. return prefabNames.Any(p => p.EndsWith(prefabName, StringComparison.OrdinalIgnoreCase) || p.EndsWith(prefabName + ".prefab", StringComparison.OrdinalIgnoreCase));
  541. }
  542.  
  543. private bool GradeExists(string gradeName)
  544. {
  545. if (string.IsNullOrEmpty(gradeName)) return false;
  546. foreach (var grade in buildingGrades) if (grade.ToString().Equals(gradeName, StringComparison.OrdinalIgnoreCase)) return true;
  547. return false;
  548. }
  549.  
  550. private string GetEnglishName(string shortName) { return ItemManager.FindItemDefinition(shortName)?.displayName?.english ?? shortName; }
  551.  
  552. private string FirstUpper(string original)
  553. {
  554. if (string.IsNullOrEmpty(original)) return string.Empty;
  555. var charArray = original.ToCharArray();
  556. charArray[0] = char.ToUpper(charArray[0]);
  557. return new string(charArray);
  558. }
  559. #endregion
  560. }
  561. }
  562.  
Advertisement
Add Comment
Please, Sign In to add comment