Иконка ресурса

FREE MagazinBoost : 1.6.7 1.6.7

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Oxide.Plugins {
    [Info("MagazinBoost", "Fujikura/RFC1920", "1.6.7", ResourceId = 1962)]
    [Description("Can change magazines, ammo and condition for most projectile weapons")]
    internal class MagazinBoost : RustPlugin {
#region Config
        private ConfigData configData;
        protected override void LoadDefaultConfig() {
            Puts("Creating new config file.");
            configData = new ConfigData {
                Version = Version
            }
            ;
            GetWeapons();
            SaveConfig(configData);
        }
        private void LoadVariables() {
            configData = Config.ReadObject<ConfigData>();
        }
        private void SaveConfig(ConfigData config) {
            Config.WriteObject(config, true);
        }
        private class ConfigData {
            public ConfigRights CheckRights = new ConfigRights();
            public ConfigPermissions Permissions = new ConfigPermissions();
            public Dictionary<string, WeaponStats> Weapons = new Dictionary<string, WeaponStats>();
            public bool Debug;
            public VersionNumber Version;
        }
        private class ConfigRights {
            public bool checkPermission = true;
            public bool removeSkinIfNoRights = true;
        }
        private class ConfigPermissions {
            public string permissionAll = "magazinboost.canall";
            public string permissionMaxAmmo = "magazinboost.canmaxammo";
            public string permissionPreLoad = "magazinboost.canpreload";
            public string permissionMaxCondition = "magazinboost.canmaxcondition";
            public string permissionAmmoType = "magazinboost.canammotype";
        }
        private class WeaponStats {
            public string displayname;
            public int maxammo;
            public int preload;
            public float maxcondition;
            public string ammotype;
            public int skinid;
            public bool settingactive;
            public int servermaxammo;
            public int serverpreload;
            public string serverammotype;
            public float servermaxcondition;
            public bool serveractive;
            public int givemaxammo;
            public int givepreload;
            public string giveammotype;
            public float givemaxcondition;
        }
#endregion Config
#region Oxide_hooks
        private void Init() {
            LoadVariables();
            GetWeapons();
            permission.RegisterPermission(configData.Permissions.permissionAll, this);
            permission.RegisterPermission(configData.Permissions.permissionMaxAmmo, this);
            permission.RegisterPermission(configData.Permissions.permissionPreLoad, this);
            permission.RegisterPermission(configData.Permissions.permissionMaxCondition, this);
            permission.RegisterPermission(configData.Permissions.permissionAmmoType, this);
        }
        private object OnWeaponReload(BaseProjectile projectile, BasePlayer player) {
            if (configData.Debug) Puts("OnReloadWeapon called!");
            Item item = projectile.GetItem();
            WeaponStats weaponStats = new WeaponStats();
            if (configData.Weapons.ContainsKey(item.info.shortname)) {
                if (configData.Debug) Puts("OnReloadWeapon: Adding weapon ");
                weaponStats = configData.Weapons[item.info.shortname];
            }
            if (!weaponStats.settingactive) {
                if (configData.Debug) Puts($"OnReloadWeapon: Weapon type {item.info.shortname} inactive.");
                return null;
            }
            double maxammo = HasExtender(projectile) ? Math.Ceiling(weaponStats.maxammo * 1.25) : weaponStats.maxammo;
            if (HasRight(player, "maxammo") || HasRight(player, "all")) {
                if (configData.Debug) Puts($"OnReloadWeapon: Weapon type {item.info.shortname} active - giving maxammo.");
                projectile.primaryMagazine.capacity = (int)maxammo;
                projectile.SendNetworkUpdate();
            }
            return null;
        }
        private bool HasExtender(BaseProjectile projectile) {
            foreach (BaseEntity attachment in projectile.children) {
                if (attachment.name.Contains("extendedmags.entity.prefab")) return true;
            }
            return false;
        }
        private void OnItemCraftFinished(ItemCraftTask task, Item item, ItemCrafter crafter) {
            if (configData.Debug) Puts("OnItemCraftFinished called!");
            if (!(item.GetHeldEntity() is BaseProjectile)) return;
            if (!HasAnyRight(crafter.owner)) return;
            WeaponStats weaponStats = new WeaponStats();
            if (configData.Weapons.ContainsKey(item.info.shortname)) {
                weaponStats = configData.Weapons[item.info.shortname];
            }
            if (!weaponStats.settingactive) return;
            BaseProjectile bp = item.GetHeldEntity() as BaseProjectile;
            if (bp != null) {
                if (HasRight(crafter.owner, "maxammo") || HasRight(crafter.owner, "all")) {
                    bp.primaryMagazine.capacity = weaponStats.maxammo;
                }
                if (HasRight(crafter.owner, "preload") || HasRight(crafter.owner, "all")) {
                    bp.primaryMagazine.contents = weaponStats.preload;
                }
                if (HasRight(crafter.owner, "ammotype") || HasRight(crafter.owner, "all")) {
                    ItemDefinition ammo = ItemManager.FindItemDefinition(weaponStats.ammotype);
                    if (ammo != null) bp.primaryMagazine.ammoType = ammo;
                }
                if (HasRight(crafter.owner, "maxcondition") || HasRight(crafter.owner, "all")) {
                    item._maxCondition = Convert.ToSingle(weaponStats.maxcondition);
                    item._condition = Convert.ToSingle(weaponStats.maxcondition);
                }
                if (weaponStats.skinid > 0) {
                    item.skin = Convert.ToUInt64(weaponStats.skinid);
                    item.GetHeldEntity().skinID = Convert.ToUInt64(weaponStats.skinid);
                }
            }
        }
        private void OnItemAddedToContainer(ItemContainer container, Item item) {
            if (container.entityOwner == null) return;
            if (!configData.CheckRights.checkPermission) return;
            if (item.GetHeldEntity() is BaseProjectile && container.HasFlag(ItemContainer.Flag.Belt)) {
                WeaponStats weaponStats = null;
                WeaponStats checkStats;
                if (configData.Weapons.TryGetValue(item.info.shortname, out checkStats)) {
                    weaponStats = checkStats;
                    if (!weaponStats.settingactive) return;
                }
                else {
                    return;
                }
                BaseProjectile bp = item.GetHeldEntity() as BaseProjectile;
                if (bp != null) {
                    if (bp.primaryMagazine.capacity > item.info.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize && !(HasRight(container.playerOwner, "maxammo") || HasRight(container.playerOwner, "all"))) {
                        bp.primaryMagazine.capacity = item.info.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize;
                        if (bp.primaryMagazine.contents > bp.primaryMagazine.capacity) {
                            bp.primaryMagazine.contents = bp.primaryMagazine.capacity;
                        }
                    }
                    if (item.maxCondition > item.info.condition.max && !(HasRight(container.playerOwner, "maxcondition") || HasRight(container.playerOwner, "all"))) {
                        float newCon = item.condition * (item.info.condition.max / item.maxCondition);
                        item._maxCondition = Convert.ToSingle(item.info.condition.max);
                        item._condition = Convert.ToSingle(newCon);
                    }
                    if (configData.CheckRights.removeSkinIfNoRights && !HasAnyRight(container.playerOwner) && item.GetHeldEntity().skinID == Convert.ToUInt64(weaponStats.skinid) && item.GetHeldEntity().skinID != 0uL) {
                        item.skin = 0uL;
                        item.GetHeldEntity().skinID = 0uL;
                    }
                }
            }
        }
#endregion
#region Main
        private void GetWeapons() {
            IEnumerable<ItemDefinition> weapons = ItemManager.GetItemDefinitions().Where(p => p.category == ItemCategory.Weapon && p.GetComponent<ItemModEntity>() != null);
            if (configData?.Weapons?.Count == 0) {
                int counter = 0;
                foreach (ItemDefinition weapon in weapons) {
                    if (configData.Debug) Puts($"Processing new weapon {weapon?.shortname}");
                    if (weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>() == null) continue;
                    WeaponStats weaponStats = new() {
                        displayname = weapon.displayName.english, maxammo = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize, preload = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents, maxcondition = weapon.condition.max, ammotype = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname, skinid = 0, settingactive = true, servermaxammo = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize, serverpreload = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents, serverammotype = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname, servermaxcondition = weapon.condition.max, serveractive = false, givemaxammo = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize, givepreload = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents, giveammotype = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname, givemaxcondition = weapon.condition.max
                    }
                    ;
                    configData.Weapons.Add(weapon.shortname, weaponStats);
                    counter++;
                }
                if (configData.Debug) Puts($"Created initial weaponlist with '{counter}' projectile weapons.");
                SaveConfig(configData);
            }
            else {
                if (configData?.Weapons?.Count > 0) {
                    int countLoadedServerStats = 0;
                    foreach (ItemDefinition weapon in weapons) {
                        if (!GameManifest.guidToPath.ContainsKey(weapon?.GetComponent<ItemModEntity>()?.entityPrefab?.guid) || weapon?.GetComponent<ItemModEntity>()?.entityPrefab?.Get()?.GetComponent<BaseProjectile>() == null) continue;
                        if (configData.Weapons.ContainsKey(weapon?.shortname)) {
                            if (configData.Debug) Puts($"Processing existing weapon {weapon?.shortname}");
                            WeaponStats serverDefaults = configData.Weapons[weapon?.shortname];
                            if (serverDefaults?.givemaxammo == 0) {
                                try {
                                    serverDefaults.givemaxammo = serverDefaults.servermaxammo;
                                    serverDefaults.givepreload = serverDefaults.serverpreload;
                                    serverDefaults.giveammotype = serverDefaults.serverammotype;
                                    serverDefaults.givemaxcondition = serverDefaults.servermaxcondition;
                                    serverDefaults.skinid = 0;
                                }
                                catch {
                                }
                            }
                            if (serverDefaults.serveractive) {
                                ItemDefinition weaponDef = ItemManager.FindItemDefinition(weapon.shortname);
                                weaponDef.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize = serverDefaults.servermaxammo;
                                weaponDef.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents = serverDefaults.serverpreload;
                                ItemDefinition ammo = ItemManager.FindItemDefinition(serverDefaults.serverammotype);
                                if (ammo != null) weaponDef.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType = ammo;
                                weaponDef.condition.max = Convert.ToSingle(serverDefaults.servermaxcondition);
                                countLoadedServerStats++;
                            }
                            continue;
                        }
                        WeaponStats weaponStats = new WeaponStats() {
                            displayname = weapon.displayName.english, maxammo = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize, preload = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents, maxcondition = weapon.condition.max, ammotype = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname, skinid = 0, settingactive = true, servermaxammo = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize, serverpreload = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents, serverammotype = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname, servermaxcondition = weapon.condition.max, serveractive = false, givemaxammo = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.definition.builtInSize, givepreload = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.contents, giveammotype = weapon.GetComponent<ItemModEntity>().entityPrefab.Get().GetComponent<BaseProjectile>().primaryMagazine.ammoType.shortname, givemaxcondition = weapon.condition.max
                        }
                        ;
                        configData.Weapons.Add(weapon.shortname, weaponStats);
                        if (configData.Debug) Puts($"Added NEW weapon '{weapon.displayName.english} ({weapon.shortname})' to weapons list");
                    }
                    if (countLoadedServerStats > 0 && configData.Debug) {
                        Puts($"Changed server default values for '{countLoadedServerStats}' weapons");
                    }
                    SaveConfig(configData);
                }
            }
        }
        [ConsoleCommand("mb.giveplayer")]
        private void BoostGive(ConsoleSystem.Arg arg) {
            if (arg.Connection?.authLevel < 2) return;
            if (arg.Args == null || arg.Args.Length < 2) {
                SendReply(arg, "Usage: magazinboost.give playername|id weaponshortname (optional: skinid)");
                return;
            }
            ulong skinid = 0;
            if (arg.Args.Length > 2) {
                if (!ulong.TryParse(arg.Args[2], out skinid)) {
                    SendReply(arg, "Skin has to be a number");
                    return;
                }
                if (arg.Args[2].Length != 9) {
                    SendReply(arg, "Skin has to be a 9-digit number");
                    return;
                }
            }
            BasePlayer target = BasePlayer.Find(arg.Args[0]);
            if (target == null) {
                SendReply(arg, $"Player '{arg.Args[0]}' not found");
                return;
            }
            WeaponStats weaponStats = null;
            WeaponStats checkStats;
            if (configData.Weapons.TryGetValue(arg.Args[1], out checkStats)) {
                weaponStats = checkStats;
                // as Dictionary <string, object>;
            }
            else {
                SendReply(arg, "Weapon '{arg.Args[0]}' not included/supported");
                return;
            }
            Item item = ItemManager.Create(ItemManager.FindItemDefinition(arg.Args[1]), 1, skinid);
            if (item == null) {
                SendReply(arg, "Weapon not created for unknown reason");
                return;
            }
            BaseProjectile bp = item.GetHeldEntity() as BaseProjectile;
            if (bp != null) {
                bp.primaryMagazine.capacity = weaponStats.givemaxammo;
                bp.primaryMagazine.contents = weaponStats.givepreload;
                ItemDefinition ammo = ItemManager.FindItemDefinition(weaponStats.giveammotype);
                if (ammo != null) bp.primaryMagazine.ammoType = ammo;
                item._maxCondition = Convert.ToSingle(weaponStats.givemaxcondition);
                item._condition = Convert.ToSingle(weaponStats.givemaxcondition);
                if (skinid == 0 && Convert.ToUInt64(weaponStats.skinid) > 0) skinid = Convert.ToUInt64(weaponStats.skinid);
                if (skinid > 0) {
                    item.skin = Convert.ToUInt64(weaponStats.skinid);
                    item.GetHeldEntity().skinID = Convert.ToUInt64(weaponStats.skinid);
                }
                target.GiveItem(item);
                SendReply(arg, $"Weapon '{arg.Args[1]}' given to Player '{target.displayName}'");
            }
        }
#endregion
#region Helpers
        private bool HasAnyRight(BasePlayer player) {
            if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionAll)) return true;
            if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionMaxAmmo)) return true;
            if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionPreLoad)) return true;
            if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionMaxCondition)) return true;
            if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionAmmoType)) return true;
            return false;
        }
        private bool HasRight(BasePlayer player, string perm) {
            bool right = false;
            switch (perm) {
                case "all" : if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionAll)) {
                    right = true;
                }
                break;
                case "maxammo" : if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionMaxAmmo)) {
                    right = true;
                }
                break;
                case "preload" : if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionPreLoad)) {
                    right = true;
                }
                break;
                case "maxcondition" : if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionMaxCondition)) {
                    right = true;
                }
                break;
                case "ammotype" : if (permission.UserHasPermission(player.UserIDString, configData.Permissions.permissionAmmoType)) {
                    right = true;
                }
                break;
            }
            return right;
        }
        //static List<string> GetPlayerAmmo(BasePlayer player, string type=null)
        private bool GetPlayerAmmo(BasePlayer player, string type = null) {
            foreach (Item item in player.inventory.containerMain.itemList) {
                if (item?.info.shortname.Contains(type) == true) {
                    if (configData.Debug) Puts($"Name: {item.info.shortname}, Amount: {item.amount}");
                    return true;
                    //int amt = item.amount();
                }
            }
            return false;
        }
#endregion
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху