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

FREE ATMSystem : 2.0.3 2.0.3

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using UnityEngine;
using Oxide.Game.Rust.Cui;
using Network;
using System.Diagnostics;
namespace Oxide.Plugins {
    [Info("ATMSystem", "David", "2.0.3")]
    public class ATMSystem : RustPlugin {
#region Variables
        List<CardReader> readers = new List<CardReader>();
        List<VendingMachine> machines = new List<VendingMachine>();
        Dictionary<BasePlayer, string> stored_input = new Dictionary<BasePlayer, string>();
#endregion
#region Hooks
        [PluginReference]
        private Plugin Economics;
        void OnServerInitialized(bool initial) {
            Puts("Looking for possible ATMs...");
            int count = 0;
            foreach (VendingMachine machine in GameObject.FindObjectsOfType(typeof(VendingMachine))) {
                if (machine.skinID == config.atm.skinID) {
                    count++;
                    ApplyATMPreset(machine);
                    if (config.atm.card) AttachCardReader(machine);
                }
            }
            Puts($"Created {count} ATMs.");
            if (initial) {
                timer.Once(90f, () => {
                    Puts("Looking for possible ATMs again...");
                    foreach (VendingMachine machine in GameObject.FindObjectsOfType(typeof(VendingMachine))) {
                        if (machine.skinID == config.atm.skinID) {
                            count++;
                            ApplyATMPreset(machine);
                            if (config.atm.card) AttachCardReader(machine);
                        }
                    }
                    Puts($"Created {count} ATMs.");
                }
                );
            }
        }
        void OnEntityTakeDamage(VendingMachine entity, HitInfo info) {
            if (entity.skinID == config.atm.skinID) info.damageTypes.ScaleAll(0);
        }
        object OnRotateVendingMachine(VendingMachine entity, BasePlayer player) {
            if (entity.skinID == config.atm.skinID) return false;
            return null;
        }
        object CanAdministerVending(BasePlayer player, VendingMachine entity) {
            if (entity.skinID == config.atm.skinID) return false;
            return null;
        }
        private object CanUseVending(BasePlayer player, VendingMachine entity) {
            if (entity.skinID == config.atm.skinID) {
                if (config.atm.card) {
                    SendReply(player, gl("need_card"));
                    return false;
                }
                OpenInterface(player);
                return false;
            }
            return null;
        }
        object OnCardSwipe(CardReader cardReader, Keycard card, BasePlayer player) {
            if (card.skinID == config.card.skinID) {
                if (cardReader.GetParentEntity() != null && cardReader.GetParentEntity().skinID == config.atm.skinID) {
                    OpenInterface(player);
                    return false;
                }
                var readerAsEnt = cardReader as BaseEntity;
                if (readerAsEnt != null && readerAsEnt.OwnerID != 0 ) {
                    OpenInterface(player);
                    return false;
                }
                return false;
            }
            return null;
        }
        void OnPlayerRespawned(BasePlayer player) {
            if (config.card.onSpawn && config.atm.card) {
                var item = ItemManager.CreateByName(config.card.shortname, 1, config.card.skinID);
                if (item != null) {
                    item.name = config.card.displayName;
                    player.GiveItem(item);
                }
            }
        }
        void OnPlayerDeath(BasePlayer player, HitInfo info) {
            if (config.card.takeOnDeath && config.atm.card) {
                TakeFromInventory(player, config.card.shortname, 1, config.card.skinID);
            }
        }
        void Unload() {
            /* foreach (var reader in readers)
            {
                try
                {
                    reader.Kill();
                }
                catch
                {
                    //
                }
            } */
            foreach (var machine in machines) {
                try {
                    //machine.skinID = 0;
                    machine.shopName = "";
                    machine.SetFlag(BaseEntity.Flags.Reserved4, false, false);
                    machine.SendNetworkUpdate();
                    machine.UpdateMapMarker();
                }
                catch {
                    //
                }
            }
            foreach (var player in BasePlayer.activePlayerList) {
                CuiHelper.DestroyUi(player, "atm_bg");
            }
        }
#endregion
#region Method & Functions
        void ApplyATMPreset(VendingMachine entity) {
            entity.skinID = config.atm.skinID;
            entity.shopName = config.atm.name;
            if (config.atm.broadcast) entity.SetFlag(BaseEntity.Flags.Reserved4, true, true);
            entity.SendNetworkUpdate();
            entity.UpdateMapMarker();
            if (!machines.Contains(entity)) machines.Add(entity);
        }
        void AttachCardReader(VendingMachine entity) {
            var reader = GameManager.server.CreateEntity("assets/prefabs/io/electric/switches/cardreader.prefab", new Vector3(-0.22f, -0.21f, 0.38f), Quaternion.Euler(-0f, -0f, 0f)) as CardReader;
            reader.accessLevel = 2;
            reader.SetFlag(IOEntity.Flag_HasPower, true);
            reader.SetParent(entity);
            reader.Spawn();
            if (!readers.Contains(reader)) readers.Add(reader);
        }
        bool TakeFromInventory(BasePlayer player, string shortname, int amount, ulong skinid = 0) {
            if (player == null) return false;
            var item = ItemManager.FindItemDefinition(shortname);
            if (item == null) {
                SendReply(player, "Plugin configuration error, please let server admin know about it.");
                Puts($"{shortname} is not valid shortname");
                return false;
            }
            if (GetAmount(player, shortname, skinid) < amount) return false;
            if (RemoveItem(player, amount, shortname, skinid)) return true;
            return false;
        }
        [ConsoleCommand("testg")]
        private void testg(ConsoleSystem.Arg arg) {
            Stopwatch stopwatch = new Stopwatch();
            var player = arg?.Player();
            stopwatch.Start();
            Puts($"[{stopwatch.ElapsedMilliseconds}ms] Player has {GetAmount(player, "paper", 2570661100)} of paper");
            RemoveItem(player, 10, "paper", 2570661100);
            Puts($"[{stopwatch.ElapsedMilliseconds}ms] Removing 10 paper from player's inventory");
            Puts($"[{stopwatch.ElapsedMilliseconds}ms] Amount left now:{GetAmount(player, "paper", 2570661100)} paper");
            timer.Every(0.1f, () => {
                if (stopwatch.ElapsedMilliseconds > 2000) {
                    return;
                }
                Puts($"[{stopwatch.ElapsedMilliseconds}ms] Amount left now:{GetAmount(player, "paper", 2570661100)} paper");
            }
            );
        }
        int GetAmount(BasePlayer player, string shortname, ulong? skin) {
            var items = Facepunch.Pool.GetList<Item>();
            items.AddRange(player.inventory.containerBelt.itemList.Where(item => item.skin == skin && item.info.shortname == shortname));
            items.AddRange(player.inventory.containerMain.itemList.Where(item => item.skin == skin && item.info.shortname == shortname));
            var currentAmount = items.Sum(x => x.amount);
            Facepunch.Pool.FreeList(ref items);
            return currentAmount;
        }
        bool RemoveItem(BasePlayer player, int amount, string shortname, ulong? skin) {
            if (amount == 0) return false;
            var items = Facepunch.Pool.GetList<Item>();
            try {
                items.AddRange(player.inventory.containerBelt.itemList.Where(item => item.skin == skin && item.info.shortname == shortname));
                items.AddRange(player.inventory.containerMain.itemList.Where(item => item.skin == skin && item.info.shortname == shortname));
                var amountLeft = amount;
                foreach (var item in items) {
                    if (amountLeft <= 0) break;
                    item.MarkDirty();
                    var oldItemAmount = item.amount;
                    if (amountLeft >= item.amount) {
                        item.MarkDirty();
                        item.Remove();
                    }
                    else item.amount -= amountLeft;
                    amountLeft -= oldItemAmount;
                }
            }
            catch {
                SendReply(player, "Something failed while taking items, please let server admin know about it.");
                Puts($"Something failed while taking items from {player} -> (shortname:{shortname}/amount:{amount}/skin:{skin})");
                return false;
            }
            Facepunch.Pool.FreeList(ref items);
            return true;
        }
        void UpdateBalancesUI(BasePlayer player, bool forceZero = false) {
            if (stored_input.ContainsKey(player)) stored_input[player] = "0";
            else stored_input.Add(player, "0");
            var c = new CuiElementContainer();
            CuiHelper.DestroyUi(player, "atm_input_field");
            CuiHelper.DestroyUi(player, "atm_acc_cash_content");
            CuiHelper.DestroyUi(player, "atm_acc_balance_content");
            Create.Input(ref c, "atm_input_field", "atm_input_b", "1 1 1 0.7", 13, "0.1 -0.02", "1 1", "0", "robotocondensed-bold.ttf", "atm_input", TextAnchor.MiddleLeft, 9);
            if (forceZero) Create.Text(ref c, "atm_acc_cash_content", "atm_acc_cash", "1 1 1 0.75", $"$ 0", 13, "0.05 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            else Create.Text(ref c, "atm_acc_cash_content", "atm_acc_cash", "1 1 1 0.75", $"$ {GetAmount(player, config.currency.shortname, config.currency.skinID)}", 13, "0.05 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Text(ref c, "atm_acc_balance_content", "atm_acc_balance", "1 1 1 0.75", $"$ {Economics.Call<double>("Balance", player.UserIDString)}", 13, "0.05 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            CuiHelper.AddUi(player, c);
        }
        void PlayFx(BasePlayer player, string fx) {
            if (player == null) return;
            var EffectInstance = new Effect();
            EffectInstance.Init(Effect.Type.Generic, player, 0, Vector3.up, Vector3.zero);
            EffectInstance.pooledstringid = StringPool.Get(fx);
            NetWrite netWrite = Net.sv.StartWrite();
            netWrite.PacketID(Message.Type.Effect);
            EffectInstance.WriteToStream(netWrite);
            netWrite.Send(new SendInfo(player.net.connection));
            EffectInstance.Clear();
        }
        bool IsDigitsOnly(string str) {
            foreach (char c in str) {
                if (c < '0' || c > '9') return false;
            }
            return true;
        }
#endregion
#region Commands
        [ConsoleCommand("atm_input")]
        private void consolecmd_atminput(ConsoleSystem.Arg arg) {
            var player = arg?.Player();
            var args = arg.Args;
            if (player == null) return;
            if (args.Length != 1) {
                Notification(player, false, "INTERNAL PLUGIN ERROR");
                PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                return;
            }
            if (!IsDigitsOnly(args[0])) {
                Notification(player, false, gl("ui_input_only_digits"));
                PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                return;
            }
            if (stored_input.ContainsKey(player)) stored_input[player] = args[0];
            else stored_input.Add(player, args[0]);
        }
        [ConsoleCommand("atm_btn")]
        private void consolecmd_atmbtn(ConsoleSystem.Arg arg) {
            var player = arg?.Player();
            var args = arg.Args;
            if (player == null) return;
            if (args.Length != 1) {
                Notification(player, false, "INTERNAL PLUGIN ERROR");
                PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                return;
            }
            int amount = 0;
            try {
                amount = int.Parse(stored_input[player]);
            }
            catch {
                Notification(player, false, "INTERNAL PLUGIN ERROR");
                PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                return;
            }
            if (!stored_input.ContainsKey(player)) {
                Notification(player, false, "INTERNAL PLUGIN ERROR");
                PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                return;
            }
            if (amount <= 0) return;
            if (args[0] == "deposit") {
                bool forceZero = GetAmount(player, config.currency.shortname, config.currency.skinID) == amount;
                if (TakeFromInventory(player, config.currency.shortname, amount, config.currency.skinID)) {
                    Economics.Call("Deposit", player.UserIDString, (double)amount);
                    UpdateBalancesUI(player, forceZero);
                    Notification(player, true, gl("ui_deposit_success").Replace("{value}", amount.ToString()));
                    PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.updated.prefab");
                    return;
                }
                else {
                    Notification(player, false, gl("ui_deposit_fail_inv"));
                    PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                }
            }
            if (args[0] == "withdraw") {
                if (Economics.Call<double>("Balance", player.UserIDString) < (double)amount) {
                    Notification(player, false, gl("ui_withdraw_fail"));
                    PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                    return;
                }
                var item = ItemManager.CreateByName(config.currency.shortname, amount, config.currency.skinID);
                if (item != null) {
                    Economics.Call("Withdraw", player.UserIDString, (double)amount);
                    item.name = config.currency.displayName;
                    player.GiveItem(item);
                    UpdateBalancesUI(player);
                    Notification(player, true, gl("ui_withdraw_success").Replace("{value}", amount.ToString()));
                    PlayFx(player, "assets/prefabs/deployable/vendingmachine/effects/vending-machine-purchase-human.prefab");
                }
                else {
                    Notification(player, false, "INTERNAL PLUGIN ERROR");
                    PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                    Puts($"Something went wrong while giving {player} money -> (shortname:{config.currency.shortname}/amount:{amount}/skin:{config.currency.skinID})");
                }
            }
        }
        [ConsoleCommand("atm_closenotif")]
        private void consolecmd_atmclosenotif(ConsoleSystem.Arg arg) {
            var player = arg?.Player();
            if (player == null) return;
            CuiHelper.DestroyUi(player, "atm_notif_bg");
        }
        [ChatCommand("setatm")]
        private void chatcmd_setatm(BasePlayer player) {
            if (!player.IsAdmin) {
                SendReply(player, "You don't have permission to use this command.");
                return;
            }
            Vector3 ViewAdjust = new Vector3(0f, 1.5f, 0f);
            Vector3 position = player.transform.position + ViewAdjust;
            Vector3 rotation = Quaternion.Euler(player.serverInput.current.aimAngles) * Vector3.forward;
            RaycastHit hit;
            Physics.Raycast(position, rotation, out hit, 10);
            BaseEntity entity = hit.collider.GetComponentInParent<BaseEntity>();
            if (!(entity is VendingMachine)) {
                SendReply(player, "Entity you looking at is not vending machine.");
                PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                return;
            }
            var vending = entity as VendingMachine;
            ApplyATMPreset(vending);
            if (config.atm.card) AttachCardReader(vending);
            SendReply(player, $"Vending machine({vending.net.ID.Value}) is set to ATM.");
            PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.updated.prefab");
        }
        [ChatCommand("setreader")]
        private void chatcmd_setreader(BasePlayer player) {
            if (!player.IsAdmin) {
                SendReply(player, "You don't have permission to use this command.");
                return;
            }
            Vector3 ViewAdjust = new Vector3(0f, 1.5f, 0f);
            Vector3 position = player.transform.position + ViewAdjust;
            Vector3 rotation = Quaternion.Euler(player.serverInput.current.aimAngles) * Vector3.forward;
            RaycastHit hit;
            Physics.Raycast(position, rotation, out hit, 10);
            BaseEntity entity = hit.collider.GetComponentInParent<BaseEntity>();
            if (!(entity is CardReader)) {
                SendReply(player, "Entity you looking at is not card reader");
                PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                return;
            }
            var reader = entity as BaseEntity;
            reader.OwnerID = 1337;
            var reader_ = entity as CardReader;
            reader_.accessLevel = 2;
            reader_.SetFlag(IOEntity.Flag_HasPower, true);
            reader_.SendNetworkUpdateImmediate();
            SendReply(player, $"Card reader({reader.net.ID.Value}) is set to ATM.");
            PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.updated.prefab");
        }
        [ChatCommand("givepower")]
        private void chatcmd_givepower(BasePlayer player) {
            if (!player.IsAdmin) {
                SendReply(player, "You don't have permission to use this command.");
                return;
            }
            Vector3 ViewAdjust = new Vector3(0f, 1.5f, 0f);
            Vector3 position = player.transform.position + ViewAdjust;
            Vector3 rotation = Quaternion.Euler(player.serverInput.current.aimAngles) * Vector3.forward;
            RaycastHit hit;
            Physics.Raycast(position, rotation, out hit, 10);
            BaseEntity entity = hit.collider.GetComponentInParent<BaseEntity>();
            /* if (!(entity is CardReader))
            {
                SendReply(player, "Entity you looking at is not card reader");
                PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
                return;
            } */
            /*  var reader = entity as BaseEntity;
            reader.OwnerID = 1337; */
            /* var reader_ = entity as CardReader;
            reader_.accessLevel = 2; */
            entity.SetFlag(IOEntity.Flag_HasPower, true);
            entity.SendNetworkUpdateImmediate();
            PlayFx(player, "assets/prefabs/locks/keypad/effects/lock.code.updated.prefab");
        }
#endregion
#region User Interface
        void OpenInterface(BasePlayer player) {
            var c = new CuiElementContainer();
            // set input back to 0
            if (stored_input.ContainsKey(player)) stored_input[player] = "0";
            else stored_input.Add(player, "0");
            var cc = config.colors;
            // background
            Create.Panel(ref c, "atm_bg", "Overlay", cc.bg, "0 0", "1 1", true, 0.08f, 0.0f, "assets/content/ui/uibackgroundblur.mat");
            Create.Panel(ref c, "atm_offset", "atm_bg", "0 0 0 0", "0.5 0.5", "0.5 0.5", false, 0.0f, 0.0f, "assets/icons/iconmaterial.mat", "-680 -360", "680 360", true);
            // title
            Create.Text(ref c, "atm_title", "atm_offset", "1 1 1 1", gl("ui_title"), 12, "0.3485 0.690", "0.7 0.9", TextAnchor.LowerLeft, "robotocondensed-bold.ttf", 0.08f);
            // main panel
            Create.Panel(ref c, "atm_base", "atm_offset", cc.bg2, "0.35 0.30", "0.64 0.7", false, 0.08f, 0.0f, "assets/content/ui/uibackgroundblur.mat");
            // info panel assets/icons/info.png
            Create.Panel(ref c, "atm_info_t", "atm_offset", cc.pTitle, "0.352 0.665", "0.638 0.695", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Panel(ref c, "atm_info_b", "atm_offset", cc.pCon, "0.352 0.58", "0.638 0.665", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Text(ref c, "atm_info_title", "atm_info_t", "1 1 1 0.55", gl("ui_info_title"), 12, "0.06 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Asset(ref c, "atm_icon_info", "atm_info_t", "1 1 1 0.55", "assets/icons/info.png", 0.08f, 0f, "0.01 0.2", "0.045 0.8");
            Create.Text(ref c, "atm_info_text", "atm_info_b", "1 1 1 0.8", gl("ui_info"), 11, "0.015 0", "0.985 0.92", TextAnchor.UpperLeft, "robotocondensed-regular.ttf", 0.08f);
            // account panel
            Create.Panel(ref c, "atm_acc_t", "atm_offset", cc.pTitle, "0.352 0.54", "0.499 0.575", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Panel(ref c, "atm_acc_b", "atm_offset", cc.pCon, "0.352 0.305", "0.499 0.54", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Text(ref c, "atm_acc_title", "atm_acc_t", "1 1 1 0.55", gl("ui_account_title"), 12, "0.12 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Asset(ref c, "atm_icon_account", "atm_acc_t", "1 1 1 0.55", "assets/icons/bp-lock.png", 0.08f, 0f, "0.02 0.25", "0.1 0.8");
            Create.Panel(ref c, "atm_acc_name", "atm_offset", "0 0 0 0.5", "0.362 0.46", "0.489 0.50", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Text(ref c, "atm_acc_name_title", "atm_acc_name", "1 1 1 0.35", gl("ui_account_holder"), 10, "0.01 1.05", "1 2", TextAnchor.LowerLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Text(ref c, "atm_acc_name_content", "atm_acc_name", "1 1 1 0.55", $"{player.displayName}", 13, "0.05 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Panel(ref c, "atm_acc_balance", "atm_offset", "0 0 0 0.5", "0.362 0.39", "0.489 0.43", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Text(ref c, "atm_acc_balance_title", "atm_acc_balance", "1 1 1 0.35", gl("ui_balance"), 10, "0.01 1.05", "1 2", TextAnchor.LowerLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Text(ref c, "atm_acc_balance_content", "atm_acc_balance", "1 1 1 0.75", $"$ {Economics.Call<double>("Balance", player.UserIDString)}", 13, "0.05 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Panel(ref c, "atm_acc_cash", "atm_offset", "0 0 0 0.5", "0.362 0.32", "0.489 0.36", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Text(ref c, "atm_acc_cash_title", "atm_acc_cash", "1 1 1 0.35", gl("ui_cash"), 10, "0.01 1.05", "1 2", TextAnchor.LowerLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Text(ref c, "atm_acc_cash_content", "atm_acc_cash", "1 1 1 0.75", $"$ {GetAmount(player, config.currency.shortname, config.currency.skinID)}", 13, "0.05 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            // controls panel with input
            Create.Panel(ref c, "atm_controls_t", "atm_offset", cc.pTitle, "0.5015 0.54", "0.638 0.575", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Panel(ref c, "atm_controls_b", "atm_offset", cc.pCon, "0.5015 0.305", "0.638 0.54", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Text(ref c, "atm_controls_title", "atm_controls_t", "1 1 1 0.55", gl("ui_controls_title"), 12, "0.13 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Asset(ref c, "atm_icon_controls", "atm_controls_t", "1 1 1 0.55", "assets/icons/player_loot.png", 0.08f, 0f, "0.02 0.25", "0.1 0.8");
            Create.Panel(ref c, "atm_input_b", "atm_offset", "0 0 0 0.5", "0.51 0.46", "0.629 0.50", false, 0.08f, 0.0f, "assets/icons/iconmaterial.mat");
            Create.Text(ref c, "atm_input_title", "atm_input_b", "1 1 1 0.35", gl("ui_enter_amount"), 10, "0.01 1.1", "1 2", TextAnchor.LowerLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Text(ref c, "atm_input_symbol", "atm_input_b", "1 1 1 0.35", "$", 12, "0.05 0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.08f);
            Create.Input(ref c, "atm_input_field", "atm_input_b", "1 1 1 0.7", 13, "0.1 -0.02", "1 1", "0", "robotocondensed-bold.ttf", "atm_input", TextAnchor.MiddleLeft, 9);
            Create.Button(ref c, "atm_withdraw_btn", "atm_offset", cc.wBtn, gl("ui_btn_withdraw"), 12, "0.51 0.39", "0.629 0.435", "atm_btn withdraw", "", "1 1 1 1", 0.08f);
            Create.Button(ref c, "atm_withdraw_btn", "atm_offset", cc.dBtn, gl("ui_btn_deposit"), 12, "0.51 0.325", "0.629 0.37", "atm_btn deposit", "", "1 1 1 1", 0.08f);
            // close button
            Create.Button(ref c, "atm_close_btn", "atm_info_t", "0.631 0.282 0.22 1", "", 12, "0.945 0.1", "0.995 0.86", "", "atm_bg", "1 1 1 1", 0.08f);
            Create.Asset(ref c, "atm_icon_cross", "atm_close_btn", "1 1 1 0.8", "assets/icons/vote_down.png", 0.08f);
            CuiHelper.DestroyUi(player, "atm_bg");
            CuiHelper.AddUi(player, c);
        }
        void Notification(BasePlayer player, bool success, string text) {
            var c = new CuiElementContainer();
            string color = success ? config.colors.nSuccess : config.colors.nFail;
            string icon = success ? "assets/icons/vote_up.png" : "assets/icons/vote_down.png";
            Create.Panel(ref c, "atm_notif_bg", "atm_base", config.colors.bg2, "0 -0.15", "1 0", false, 0.3f, 0f);
            Create.Panel(ref c, "atm_notif_color", "atm_notif_bg", color, "0.008 0.1", "0.992 1", false, 0.3f, 0f);
            Create.Asset(ref c, "atm_icon_voteup", "atm_notif_bg", "1 1 1 0.65", icon, 0.3f, 0f, "0.015 0.2", "0.125 0.90");
            Create.Text(ref c, "atm_notif_text", "atm_notif_bg", "1 1 1 0.55", text, 12, "0.13 0.1", "1 1", TextAnchor.MiddleLeft, "robotocondensed-bold.ttf", 0.3f);
            c.Add(new CuiElement {
                Parent = "atm_notif_bg", Name = "atm_notif", Components = {
                    new CuiTextComponent {
                        Text = "", FontSize = 0, Align = TextAnchor.MiddleLeft, Color = "0 0 0 0", Font = "robotocondensed-regular.ttf",
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "0 0"
                    }
                    , new CuiCountdownComponent {
                        EndTime = 2, StartTime = 0, Command = "atm_closenotif"
                    }
                }
                , FadeOut = 0f
            }
            );
            CuiHelper.DestroyUi(player, "atm_notif_bg");
            CuiHelper.AddUi(player, c);
        }
        public class Create {
            public static void Panel(ref CuiElementContainer container, string name, string parent, string color, string anchorMinx, string anchorMax, bool cursorOn = false, float fade = 0f, float fadeOut = 0f, string material = "", string offsetMin = "", string offsetMax = "", bool keyboard = false) {
                container.Add(new CuiPanel {
                    Image = {
                        Color = color, Material = material, FadeIn = fade
                    }
                    , RectTransform = {
                        AnchorMin = anchorMinx, AnchorMax = anchorMax, OffsetMin = offsetMin, OffsetMax = offsetMax
                    }
                    , FadeOut = 0f, CursorEnabled = cursorOn, KeyboardEnabled = keyboard,
                }
                , parent, name);
            }
            public static void Image(ref CuiElementContainer container, string name, string parent, string image, string anchorMinx, string anchorMax, float fade = 0f, float fadeOut = 0f, string offsetMin = "", string offsetMax = "") {
                if (image.StartsWith("http") || image.StartsWith("www")) {
                    container.Add(new CuiElement {
                        Name = name, Parent = parent, FadeOut = 0f, Components = {
                            new CuiRawImageComponent {
                                Url = image, Sprite = "assets/content/textures/generic/fulltransparent.tga", FadeIn = fade
                            }
                            , new CuiRectTransformComponent {
                                AnchorMin = anchorMinx, AnchorMax = anchorMax, OffsetMin = offsetMin, OffsetMax = offsetMax
                            }
                        }
                    }
                    );
                }
                else {
                    container.Add(new CuiElement {
                        Parent = parent, Components = {
                            new CuiRawImageComponent {
                                Png = image, Sprite = "assets/content/textures/generic/fulltransparent.tga", FadeIn = fade
                            }
                            , new CuiRectTransformComponent {
                                AnchorMin = anchorMinx, AnchorMax = anchorMax
                            }
                        }
                    }
                    );
                }
            }
            public static void Text(ref CuiElementContainer container, string name, string parent, string color, string text, int size, string anchorMinx, string anchorMax, TextAnchor align = TextAnchor.MiddleCenter, string font = "robotocondensed-regular.ttf", float fade = 0f, float fadeOut = 0f, string _outlineColor = "0 0 0 0", string _outlineScale = "0 0") {
                container.Add(new CuiElement {
                    Parent = parent, Name = name, Components = {
                        new CuiTextComponent {
                            Text = text, FontSize = size, Font = font, Align = align, Color = color, FadeIn = fade,
                        }
                        , new CuiOutlineComponent {
                            Color = _outlineColor, Distance = _outlineScale
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = anchorMinx, AnchorMax = anchorMax
                        }
                    }
                    , FadeOut = 0f
                }
                );
            }
            public static void Button(ref CuiElementContainer container, string name, string parent, string color, string text, int size, string anchorMinx, string anchorMax, string command = "", string _close = "", string textColor = "0.843 0.816 0.78 1", float fade = 1f, TextAnchor align = TextAnchor.MiddleCenter, string font = "robotocondensed-bold.ttf", string material = "assets/content/ui/uibackgroundblur-ingamemenu.mat") {
                container.Add(new CuiButton {
                    Button = {
                        Close = _close, Command = command, Color = color, Material = material, FadeIn = fade
                    }
                    , RectTransform = {
                        AnchorMin = anchorMinx, AnchorMax = anchorMax
                    }
                    , Text = {
                        Text = text, FontSize = size, Align = align, Color = textColor, Font = font, FadeIn = fade
                    }
                }
                , parent, name);
            }
            public static void Asset(ref CuiElementContainer container, string name, string parent, string color, string sprite, float fadeIn = 0f, float fadeOut = 0f, string anchorMin = "0 0", string anchorMax = "1 1", string material = "assets/icons/iconmaterial.mat") {
                //assets/content/textures/generic/fulltransparent.tga MAT
                container.Add(new CuiElement {
                    Parent = parent, Name = name, Components = {
                        new CuiImageComponent {
                            Material = material, Sprite = sprite, Color = color, FadeIn = fadeIn
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = anchorMin, AnchorMax = anchorMax
                        }
                    }
                    , FadeOut = fadeOut
                }
                );
            }
            public static void Input(ref CuiElementContainer container, string name, string parent, string color, int size, string anchorMin, string anchorMax, string defaultText, string font = "permanentmarker.ttf", string command = "command.processinput", TextAnchor align = TextAnchor.MiddleCenter, int charsLimit = 200) {
                container.Add(new CuiElement {
                    Parent = parent, Name = name, Components = {
                        new CuiInputFieldComponent {
                            Text = defaultText, CharsLimit = charsLimit, Color = color, IsPassword = false, Command = command, Font = font, FontSize = size, Align = align, Autofocus = false, LineType = UnityEngine.UI.InputField.LineType.SingleLine
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = anchorMin, AnchorMax = anchorMax
                        }
                    }
                    ,
                }
                );
            }
        }
#endregion
#region Configuration
        private Configuration config;
        protected override void LoadConfig() {
            base.LoadConfig();
            config = Config.ReadObject<Configuration>();
            SaveConfig();
        }
        protected override void LoadDefaultConfig() {
            config = Configuration.CreateConfig();
        }
        protected override void SaveConfig() => Config.WriteObject(config);
        class Configuration {
            [JsonProperty(PropertyName = "ATM")]
            public ATM atm {
                get;
                set;
            }
            public class ATM {
                [JsonProperty("Skin ID")]
                public ulong skinID {
                    get;
                    set;
                }
                [JsonProperty("Use Card Reader")]
                public bool card {
                    get;
                    set;
                }
                [JsonProperty("Marker Name")]
                public string name {
                    get;
                    set;
                }
                [JsonProperty("Broadcast")]
                public bool broadcast {
                    get;
                    set;
                }
            }
            [JsonProperty(PropertyName = "Currency")]
            public Currency currency {
                get;
                set;
            }
            public class Currency {
                [JsonProperty("Shortname")]
                public string shortname {
                    get;
                    set;
                }
                [JsonProperty("Display name")]
                public string displayName {
                    get;
                    set;
                }
                [JsonProperty("Skin ID")]
                public ulong skinID {
                    get;
                    set;
                }
            }
            [JsonProperty(PropertyName = "Card")]
            public Card card {
                get;
                set;
            }
            public class Card {
                [JsonProperty("Skin ID")]
                public ulong skinID {
                    get;
                    set;
                }
                [JsonProperty("Display Name")]
                public string displayName {
                    get;
                    set;
                }
                [JsonProperty("Shortname")]
                public string shortname {
                    get;
                    set;
                }
                [JsonProperty("Receive card on spawn")]
                public bool onSpawn {
                    get;
                    set;
                }
                [JsonProperty("Destroy card on death")]
                public bool takeOnDeath {
                    get;
                    set;
                }
            }
            [JsonProperty(PropertyName = "UI Colors")]
            public Colors colors {
                get;
                set;
            }
            public class Colors {
                [JsonProperty("Background")]
                public string bg {
                    get;
                    set;
                }
                [JsonProperty("Main Panel Background")]
                public string bg2 {
                    get;
                    set;
                }
                [JsonProperty("Content Panel")]
                public string pCon {
                    get;
                    set;
                }
                [JsonProperty("Title Panel")]
                public string pTitle {
                    get;
                    set;
                }
                [JsonProperty("Withdraw Button")]
                public string wBtn {
                    get;
                    set;
                }
                [JsonProperty("Deposit Button")]
                public string dBtn {
                    get;
                    set;
                }
                [JsonProperty("Notification Success")]
                public string nSuccess {
                    get;
                    set;
                }
                [JsonProperty("Notification Fail")]
                public string nFail {
                    get;
                    set;
                }
            }
            public static Configuration CreateConfig() {
                return new Configuration {
                    atm = new ATMSystem.Configuration.ATM {
                        skinID = 3042408530, card = false, name = "ATM", broadcast = true
                    }
                    , currency = new ATMSystem.Configuration.Currency {
                        shortname = "paper", displayName = "Cash", skinID = 2570661100,
                    }
                    , card = new ATMSystem.Configuration.Card {
                        skinID = 2410672337, displayName = "Credit Card", shortname = "keycard_blue", onSpawn = false, takeOnDeath = false,
                    }
                    , colors = new ATMSystem.Configuration.Colors {
                        bg = "0 0 0 0.79", bg2 = "0.086 0.082 0.078 1", pCon = "0.357 0.357 0.357 0.25", pTitle = "0.357 0.357 0.357 0.40", wBtn = "0.337 0.424 0.196 1", dBtn = "0.082 0.369 0.482 1", nSuccess = "0.337 0.424 0.196 1", nFail = "0.631 0.282 0.22 1"
                    }
                }
                ;
            }
        }
#endregion
#region Localization
        protected override void LoadDefaultMessages() {
            lang.RegisterMessages(new Dictionary<string, string> {
                ["need_card"]
                = "You need card to access ATM.", ["no_perms"] = "You don't have permissions to use ATM.", ["ui_title"] = "<size=70><color=#ce422b>RUST</color> ATM</size>", ["ui_info_title"] = "INFORMATION", ["ui_info"] = "This field is used to explain how economy works with ATMs on your server, where money can be found etc...", ["ui_account_title"] = "ACCOUNT", ["ui_account_holder"] = "ACCOUNT HOLDER", ["ui_balance"] = "BALANCE", ["ui_cash"] = "CASH ON HAND", ["ui_controls_title"] = "CONTROLS", ["ui_enter_amount"] = "ENTER AMOUNT", ["ui_btn_withdraw"] = "<color=#bad56aff>WITHDRAW</color>", ["ui_btn_deposit"] = "<color=#66b4d3ff>DEPOSIT</color>", ["ui_withdraw_success"] = "You have withdrawn {value}$ from your account.", ["ui_withdraw_fail"] = "You don't have enough money in your account.", ["ui_deposit_success"] = "You have deposited {value}$ to your account.", ["ui_deposit_fail_inv"] = "You don't have enough money in your inventory.", ["ui_deposit_fail_inv_fail"] = "Something went wrong while giving you money.", ["ui_input_only_digits"] = "Invalid characters inside input field."
            }
            , this);
        }
        string gl(string _message) => lang.GetMessage(_message, this);
#endregion
    }
}

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