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

FREE RustyShop : 1.0.0 1.0.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
// Reference: Oxide.Core.RustyCore

using Oxide.Core;
using RustyCore.Utils;
using RustyCore;
using System.Collections.Generic;
using System.Linq;
using System;
using Newtonsoft.Json;
using Oxide.Core.Configuration;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using System.Collections;
using Oxide.Core.Plugins;

namespace Oxide.Plugins
{
    [Info("RustyShop", "bazuka5801", "1.0.0")]
    class RustyShop : RustPlugin
    {
        #region CLASSES

        class ShopItem
        {
            public string DisplayName;
            public string URL;
            public int ID;
            public int Amount;
            public ulong Skin;
            public int Cost;
        }

        class ShopPlayer
        {
            public int Points;
            public long TotalOnlineSeconds;
        }

        #endregion

        #region CONFIGURATION

        int hourPoints;

        protected override void LoadDefaultConfig()
        {
            Config.GetVariable("Кол-во поинтов за час", out hourPoints, 15);
            SaveConfig();
        }

        #endregion

        #region FIELDS

        RCore core = Interface.Oxide.GetLibrary<RCore>();
        Dictionary<ulong, ShopPlayer> players;
        List<ShopItem> items;
        CuiElementContainer itemsUI;
        List<ulong> subs = new List<ulong>();

        #endregion

        #region COMMANDS

        [ChatCommand("s")]
        void cmdChatS(BasePlayer player)
        {
            if (subs.Contains(player.userID))
            {
                subs.Remove(player.userID);
                DestroyUI(player);
            }
            else
            {
                if (InDuel(player)) return;
                subs.Add(player.userID);
                DrawUI(player);
            }
        }

        [ConsoleCommand("rustyshop.buy")]
        void cmdRustyShopBuy(ConsoleSystem.Arg arg)
        {
            if (arg.Connection == null) return;
            var player = arg.Player();
            var shopPlayer = players[player.userID];
            var itemIndex = int.Parse(arg.Args[0]);
            var buyItem = items[itemIndex];

            if (shopPlayer.Points < buyItem.Cost)
            {
                SendReply(player, "Недостаточно средств!");
                return;
            }
            if (InDuel(player)) return;

            shopPlayer.Points -= buyItem.Cost;

            var item = ItemManager.CreateByItemID(buyItem.ID, buyItem.Amount, buyItem.Skin);
            var container = player.inventory.containerMain;
            if (!item.MoveToContainer(container))
                item.Drop(container.dropPosition, container.dropVelocity);

            DestroyUI(player);
            DrawUI(player);
        }

        #endregion

        #region OXIDE HOOKS

        void Loaded()
        {
            LoadData();
        }

        void OnServerInitialized()
        {
            LoadDefaultConfig();
            CommunityEntity.ServerInstance.StartCoroutine(LoadImages());
            foreach (var player in BasePlayer.activePlayerList)
                AddShopPlayer(player.userID);

            timer.Every(1f, () => BasePlayer.activePlayerList.ForEach(p =>
            {
                var time = players[p.userID].TotalOnlineSeconds;
                if (++time%3600 == 0)
                    players[p.userID].Points += hourPoints;
                players[p.userID].TotalOnlineSeconds = time;
            }));
        }

        void Unload()
        {
            SaveData();
        }

        void OnPlayerConnected(Network.Message packet)
        {
            var userId = packet.connection.userid;
            AddShopPlayer(userId);
        }
        void OnPlayerDisconnected(BasePlayer player)
        {
            subs.Remove(player.userID);
        }

        #endregion

        #region CORE

        void AddShopPlayer(ulong userId)
        {
            if (!players.ContainsKey(userId))
                players[userId] = new ShopPlayer() { Points = 15, TotalOnlineSeconds = 0 };
        }

        #endregion

        #region UI

        void CreateItemsUI()
        {
            float gap = 0.014f;
            float width = 0.15f;
            float height = 0.17f;
            float startxBox = gap;
            float startyBox = 1f - height - 0.05f;

            float xmin = startxBox;
            float ymin = startyBox;
            itemsUI = new CuiElementContainer();
            int i = 0;
            var mainParent = itemsUI.Add(new CuiPanel() {Image = {Color = "0 0 0 0"}}, "rustyshop.items",
                "rustyshop.items.customui");

            foreach (var item in items)
            {
                var min = $"{xmin} {ymin}";
                var max = $"{xmin + width} {ymin + height}";
                var panelname = itemsUI.Add(new CuiPanel()
                {
                    Image = {Color = "0 0 0 0"},
                    RectTransform = {AnchorMin = min, AnchorMax = max}
                }, mainParent);


                itemsUI.Add(new CuiButton()
                {
                    Button = {Command = $"rustyshop.buy {i}", Color = "0.3 0.5 0.4 1"},
                    RectTransform = {AnchorMin = "0 0", AnchorMax = "1 0.25"},
                    Text =
                    {
                        Text =
                            $"<color=orange><color=#00ccff>{item.Amount}</color> за <color=#ffcc00>{item.Cost}</color> р.</color>",
                        FontSize = 16,
                        Align = TextAnchor.MiddleCenter
                    }
                }, panelname);

                itemsUI.Add(new CuiElement()
                {
                    Name = CuiHelper.GetGuid(),
                    Parent = panelname,
                    Components =
                    {
                        new CuiRawImageComponent()
                        {
                            Png = ImageStorage.FetchPng(item.DisplayName),
                            Sprite = "assets/content/textures/generic/fulltransparent.tga"
                        },
                        new CuiRectTransformComponent() {AnchorMin = "0 0.25", AnchorMax = "1 1"}
                    }
                });

                xmin += width + gap;
                if (xmin + width >= 1)
                {
                    xmin = startxBox;
                    ymin -= height + gap;
                }
                i++;
            }
        }

        void DrawUI(BasePlayer player)
        {
            var shopPlayer = players[player.userID];
                foreach (var we in itemsUI)
                    CuiHelper.DestroyUi(player, we.Name);
                core.DrawUIWithEx(player, "RustyShop", "menu", itemsUI, shopPlayer.Points,
                    core.TimeToString(shopPlayer.TotalOnlineSeconds));
        }

        void DestroyUI(BasePlayer player)
        {
            core.DestroyUI(player, "RustyShop", "menu");
        }
        IEnumerator LoadImages()
        {
            foreach (var item in items)
                yield return CommunityEntity.ServerInstance.StartCoroutine(ImageStorage.Store(item.DisplayName, item.URL));
            CreateItemsUI();
        }

        #endregion

        #region EXTERNAL CALLS

        [PluginReference] Plugin Duels;

        bool InDuel(BasePlayer player) => Duels?.Call<bool>("inDuel", player) ?? false;

        #endregion

        #region DATA

        private DynamicConfigFile itemsFile = Interface.Oxide.DataFileSystem.GetFile("RustyShop/Items");
        private DynamicConfigFile playersFile = Interface.Oxide.DataFileSystem.GetFile("RustyShop/Players");

        void OnServerSave()
        {
            SaveData();
        }

        void LoadData()
        {
            items = itemsFile.ReadObject<List<ShopItem>>();
            players = playersFile.ReadObject<Dictionary<ulong, ShopPlayer>>();
        }

        void SaveData()
        {
            Puts("SAVE PLAYERS!");
            playersFile.WriteObject(players);
        }

        #endregion
    }
}

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