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

FREE UpgradeWorkbenches : 1.0.4 1.0.4

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO;
using Newtonsoft.Json;
using System.Text;
using System.IO.Compression;
using Oxide.Core.Plugins;
using Oxide.Core.Configuration;
using System.Linq;
namespace Oxide.Plugins {
    [Info("UpgradeWorkbenches", "Jake_Rich", "1.0.4", ResourceId = 2741)]
    [Description("Lets players upgrade workbenches")]
    public class UpgradeWorkbenches : RustPlugin {
        public static UpgradeWorkbenches _plugin;
        void Init() {
            _plugin = this;
        }
        void Loaded() {
            lang.RegisterMessages(lang_en, this);
        }
        void Unload() {
        }
        object CanMoveItem(Item movedItem, PlayerInventory playerInventory, uint targetContainerID, int targetSlot, int amount) {
            if (movedItem.info.shortname != "workbench1" && movedItem.info.shortname != "workbench2" && movedItem.info.shortname != "workbench3") {
                return null;
            }
            var container = playerInventory.FindContainer(targetContainerID);
            if (container == null) {
                return null;
            }
            if (container.entityOwner == null) {
                return null;
            }
            if (!(container.entityOwner is Workbench)) {
                return null;
            }
            int workbenchItemLevel = int.Parse(movedItem.info.shortname.Replace("workbench", ""));
            int workbenchLevel = int.Parse(container.entityOwner.ShortPrefabName.Replace("workbench", "").Replace(".deployed", ""));
            if (workbenchItemLevel <= workbenchLevel) {
                return null;
            }
            var player = playerInventory.GetComponent<BasePlayer>();
            var workbench = GameManager.server.CreateEntity($"assets/prefabs/deployable/tier {workbenchItemLevel} workbench/workbench{workbenchItemLevel}.deployed.prefab", container.entityOwner.transform.position, container.entityOwner.transform.rotation) as Workbench;
            workbench.SendMessage("SetDeployedBy", player, SendMessageOptions.DontRequireReceiver);
            workbench.OwnerID = container.entityOwner.OwnerID;
            workbench.Spawn();
            //Since you can only upgrade to a tier 2 or tier 3 workbench, always can play the same sound effect (tier 2 & 3 share sound effect)
            Effect.server.Run("assets/prefabs/deployable/quarry/effects/mining-quarry-deploy.prefab", workbench.transform.position, Vector3.up, null, false);
            movedItem.UseItem();
            var oldItem = ItemManager.CreateByName($"workbench{workbenchLevel}");
            foreach(var item in (container.entityOwner as Workbench).inventory.itemList.ToList()) {
                player.GiveItem(item);
            }
            player.GiveItem(oldItem);
            player.EndLooting();
            playerInventory.ServerUpdate(0);
            container.entityOwner.Kill();
            return false;
        }
        void OnEntityBuilt(Planner planner, GameObject go) {
            var player = planner.GetOwnerPlayer();
            if (player == null) {
                return;
            }
            var workbench = go.GetComponent<Workbench>();
            if (workbench == null) {
                return;
            }
            PrintToChat(player, $"<color=#FF7F00>UpgradeWorkbenches:</color> {GetLangMessage("InfoMessage", player)}");
        }
#region Lang API
        public Dictionary<string, string> lang_en = new Dictionary<string, string>() {
            {
                "InfoMessage", "Workbenches can be upgraded!\n\nTo upgrade, drag a workbench item into a placed workbench's inventory!"
            }
            ,
        }
        ;
        public static string GetLangMessage(string key, BasePlayer player) {
            return _plugin.lang.GetMessage(key, _plugin, player.UserIDString);
        }
        public static string GetLangMessage(string key, ulong player) {
            return _plugin.lang.GetMessage(key, _plugin, player.ToString());
        }
        public static string GetLangMessage(string key, string player) {
            return _plugin.lang.GetMessage(key, _plugin, player);
        }
#endregion
#region PlayerData
        public class BasePlayerData {
            [JsonIgnore]
            public BasePlayer Player {
                get;
                set;
            }
            public string userID {
                get;
                set;
            }
            = "";
            public BasePlayerData() {
            }
            public BasePlayerData(BasePlayer player) : base() {
                userID = player.UserIDString;
                Player = player;
            }
        }
        public class PlayerDataController<T> where T : BasePlayerData {
            [JsonPropertyAttribute(Required = Required.Always)]
            private Dictionary<string, T> playerData {
                get;
                set;
            }
            = new Dictionary<string, T>();
            private JSONFile<Dictionary<string, T>> _file;
            private Timer _timer;
            public IEnumerable<T> All {
                get {
                    return playerData.Values;
                }
            }
            public PlayerDataController() {
            }
            public PlayerDataController(string filename = null) {
                if (filename == null) {
                    return;
                }
                _file = new JSONFile<Dictionary<string, T>>(filename);
                _timer = _plugin.timer.Every(120f, () => {
                    _file.Save();
                }
                );
            }
            public void Unload() {
                if (_file == null) {
                    return;
                }
                _file.Save();
            }
            public T Get(string identifer) {
                T data;
                if (!playerData.TryGetValue(identifer, out data)) {
                    data = Activator.CreateInstance<T>();
                    playerData[identifer] = data;
                }
                return data;
            }
            public T Get(ulong userID) {
                return Get(userID.ToString());
            }
            public T Get(BasePlayer player) {
                var data = Get(player.UserIDString);
                data.Player = player;
                return data;
            }
            public bool Has(ulong userID) {
                return playerData.ContainsKey(userID.ToString());
            }
            public void Set(string userID, T data) {
                playerData[userID] = data;
            }
            public bool Remove(string userID) {
                return playerData.Remove(userID);
            }
            public void Update(T data) {
                playerData[data.userID] = data;
            }
        }
#endregion
#region Configuration Files
        public enum ConfigLocation {
            Data = 0, Config = 1, Logs = 2, Plugins = 3, Lang = 4, Custom = 5,
        }
        public class JSONFile<Type> where Type : class {
            private DynamicConfigFile _file;
            public string _name {
                get;
                set;
            }
            public Type Instance {
                get;
                set;
            }
            private ConfigLocation _location {
                get;
                set;
            }
            private string _path {
                get;
                set;
            }
            public bool SaveOnUnload = false;
            public bool Compressed = false;
            public JSONFile(string name, ConfigLocation location = ConfigLocation.Data, string path = null, string extension = ".json", bool saveOnUnload = false) {
                SaveOnUnload = saveOnUnload;
                _name = name.Replace(".json", "");
                _location = location;
                switch (location) {
                    case ConfigLocation.Data : {
                        _path = $"{Oxide.Core.Interface.Oxide.DataDirectory}/{name}{extension}";
                        break;
                    }
                    case ConfigLocation.Config : {
                        _path = $"{Oxide.Core.Interface.Oxide.ConfigDirectory}/{name}{extension}";
                        break;
                    }
                    case ConfigLocation.Logs : {
                        _path = $"{Oxide.Core.Interface.Oxide.LogDirectory}/{name}{extension}";
                        break;
                    }
                    case ConfigLocation.Lang : {
                        _path = $"{Oxide.Core.Interface.Oxide.LangDirectory}/{name}{extension}";
                        break;
                    }
                    case ConfigLocation.Custom : {
                        _path = $"{path}/{name}{extension}";
                        break;
                    }
                }
                _file = new DynamicConfigFile(_path);
                _file.Settings = new JsonSerializerSettings() {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                }
                ;
                Init();
            }
            public virtual void Init() {
                _plugin.OnRemovedFromManager.Add(new Action<Plugin, PluginManager>(Unload));
                Load();
                Save();
                Load();
            }
            public virtual void Load() {
                if (Compressed) {
                    LoadCompressed();
                    return;
                }
                if (!_file.Exists()) {
                    Save();
                }
                Instance = _file.ReadObject<Type>();
                if (Instance == null) {
                    Instance = Activator.CreateInstance<Type>();
                    Save();
                }
                return;
            }
            private void LoadCompressed() {
                string str = _file.ReadObject<string>();
                if (str == null || str == "") {
                    Instance = Activator.CreateInstance<Type>();
                    return;
                }
                using (var compressedStream = new MemoryStream(Convert.FromBase64String(str))) using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress)) using (var resultStream = new MemoryStream()) {
                    var buffer = new byte[4096];
                    int read;
                    while ((read = zipStream.Read(buffer, 0, buffer.Length)) > 0) {
                        resultStream.Write(buffer, 0, read);
                    }
                    Instance = JsonConvert.DeserializeObject<Type>(Encoding.UTF8.GetString(resultStream.ToArray()));
                }
            }
            public virtual void Save() {
                if (Compressed) {
                    SaveCompressed();
                    return;
                }
                _file.WriteObject(Instance);
                return;
            }
            private void SaveCompressed() {
                using (var stream = new MemoryStream()) {
                    using (GZipStream zipStream = new GZipStream(stream, CompressionMode.Compress)) {
                        byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Instance));
                        zipStream.Write(bytes, 0, bytes.Length);
                        zipStream.Close();
                        _file.WriteObject(Convert.ToBase64String(stream.ToArray()));
                    }
                }
            }
            public virtual void Reload() {
                Load();
            }
            private void Unload(Plugin sender, PluginManager manager) {
                if (SaveOnUnload) {
                    Save();
                }
            }
        }
#endregion
    }
}

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