Для улучшения кода и повышения его производительности, можно внести следующие изменения:Улучши код
1. Использование HashSet вместо List: Вместо List можно использовать HashSet для хранения коротких имен оружия для более эффективного поиска. HashSet обеспечит более быстрый доступ для проверки наличия элемента.
2. Кэширование активного оружия игрока: Кэширование активного оружия игрока может сократить лишние операции поиска оружия при выполнении различных действий.
3. Использование TryGetValue: Использование метода TryGetValue для избегания двойного доступа к словарю при проверке наличия значения и его получении.
Вот улучшенный пример кода с учетом вышеуказанных рекомендаций:
C#:
using System.Collections.Generic;
using UnityEngine;
namespace YourPluginNamespace
{
public class MagazineUpgradePlugin : RustPlugin
{
private Dictionary<ulong, HashSet<string>> playerMagazineWeapons = new Dictionary<ulong, HashSet<string>>();
private Dictionary<ulong, Dictionary<string, int>> playerMagazineSizes = new Dictionary<ulong, Dictionary<string, int>>();
private Dictionary<ulong, Item> playerActiveWeapons = new Dictionary<ulong, Item>();
void OnPlayerLootItem(BasePlayer player, Item item)
{
if (item.info.shortname == "magazine_upgrade_item")
{
UpgradeMagazine(player);
}
}
void UpgradeMagazine(BasePlayer player)
{
Item currentWeapon = playerActiveWeapons.ContainsKey(player.userID) ? playerActiveWeapons[player.userID] : GetActiveWeapon(player);
if (currentWeapon != null)
{
string weaponShortname = currentWeapon.info.shortname;
int newMagazineSize = playerMagazineSizes.TryGetValue(player.userID, out var weapons) && weapons.TryGetValue(weaponShortname, out var size) ? size : 30;
currentWeapon.info.baseMagazineSize = newMagazineSize;
if (!playerMagazineWeapons.ContainsKey(player.userID))
{
playerMagazineWeapons[player.userID] = new HashSet<string>();
}
playerMagazineWeapons[player.userID].Add(weaponShortname);
if (!playerMagazineSizes.ContainsKey(player.userID))
{
playerMagazineSizes[player.userID] = new Dictionary<string, int>();
}
playerMagazineSizes[player.userID][weaponShortname] = newMagazineSize;
SendReply(player, $"Your {weaponShortname}'s magazine size has been increased to {newMagazineSize}!");
}
}
void OnPlayerReload(BasePlayer player)
{
if (playerMagazineWeapons.TryGetValue(player.userID, out var weapons))
{
foreach (var weaponShortname in weapons)
{
if (playerMagazineSizes.TryGetValue(player.userID, out var sizes) && sizes.TryGetValue(weaponShortname, out var size))
{
Item weapon = GetWeaponByShortname(player, weaponShortname);
if (weapon != null)
{
weapon.info.baseMagazineSize = size;
}
}
}
}
}
Item GetActiveWeapon(BasePlayer player)
{
Item activeWeapon = player.GetActiveItem();
if (activeWeapon != null)
{
playerActiveWeapons[player.userID] = activeWeapon;
}
return activeWeapon;
}
Item GetWeaponByShortname(BasePlayer player, string shortname)
{
foreach (Item item in player.inventory.containerBelt.itemList)
{
if (item.info.shortname == shortname)
{
return item;
}
}
return null;
}
void LoadDefaultConfig()
{
Config["reload_magazine_sizes"] = new Dictionary<string, int>
{
{ "rifle", 30 },
{ "pistol", 15 }
};
SaveConfig();
}
}
}
Эти улучшения помогут оптимизировать производительность вашего плагина и обеспечить более эффективную работу с данными и оружием игроков. Не забудьте протестировать обновленный код перед использованием на сервере Rust.