C#:
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Sklad", "15FPS", "1.0.2")]
class Sklad : RustPlugin
{
[PluginReference] private Plugin ImageLibrary;
private static Sklad instance;
private const string storageLayer = "Storage";
private static PluginData _data;
private void SaveData() => Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject(Name, _data);
private void LoadData()
{
try
{
_data = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<PluginData>(Name);
}
catch (Exception e)
{
PrintError(e.ToString());
}
if (_data == null) _data = new PluginData();
}
private class PluginData
{
[JsonProperty(PropertyName = "Players Data", ObjectCreationHandling = ObjectCreationHandling.Replace)]
public Dictionary<ulong, List<DataItem>> PlayersData = new Dictionary<ulong, List<DataItem>>();
}
public class DataItem
{
[JsonProperty(PropertyName = "Тип предмета")]
public ItemTypes Type;
[JsonProperty(PropertyName = "Предмет")]
public ItemClass item;
[JsonProperty(PropertyName = "Команда")]
public string Command;
[JsonProperty(PropertyName = "Отображаемое имя (если ковычки - дефолт из игры)")]
public string DisplayName;
[JsonProperty(PropertyName = "Количество")]
public int Amount;
[JsonProperty(PropertyName = "Картинка (если пусто - по шортнейму)")]
public string ImageURL;
public Item ToItem()
{
var newItem = ItemManager.CreateByName(item.ShortName, Amount, item.SkinID);
if (newItem == null)
{
instance?.PrintError($"Error creating item with shortname '{item.ShortName}'");
return null;
}
if (!string.IsNullOrEmpty(DisplayName)) newItem.name = DisplayName;
return newItem;
}
public void GiveCmd(BasePlayer player)
{
string command = Command.Replace("\n", "|")
.Replace("%steamid%", player.UserIDString, StringComparison.OrdinalIgnoreCase).Replace("%username%",
player.displayName, StringComparison.OrdinalIgnoreCase);
instance?.Server.Command(command);
}
}
public enum ItemTypes
{
Item,
Command
}
public class ItemClass
{
[JsonProperty(PropertyName = "Короткое название предмета")]
public string ShortName;
[JsonProperty(PropertyName = "Skin ID предмета")]
public ulong SkinID;
}
private static List<DataItem> GetUserData(ulong userID)
{
if (!_data.PlayersData.ContainsKey(userID))
_data.PlayersData.Add(userID, new List<DataItem>());
return _data.PlayersData[userID];
}
private void CmdChatOpenStorage(BasePlayer player, string command, string[] args)
{
StorageUI(player);
}
private string GetMessage(string messageKey, string playerID, params object[] args) => string.Format(lang.GetMessage(messageKey, this, playerID), args);
[ChatCommand($"sklad")]
void CmdChatOpenStoragjjjde(BasePlayer player, string command, string[] args)
{
StorageUI(player);
}
private void StorageUI(BasePlayer player, int page = 0)
{
var userData = GetUserData(player.userID);
if (userData == null) return;
var container = new CuiElementContainer();
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform =
{AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-450 -255", OffsetMax = "450 255"},
Image = { Color = "0.024 0.017 0.17 0.76" }
}, "Overlay", storageLayer);
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "10 10", AnchorMax = "-10 -10" },
Text = { Text = "" },
Button = { Color = "0 0 0 0", Close = storageLayer }
}, storageLayer);
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "40 -65", OffsetMax = "-40 0" },
Text =
{
Text = GetMessage("UI.Storage", player.UserIDString), FontSize = 38,
Align = TextAnchor.MiddleCenter
}
}, storageLayer, storageLayer + ".Logo");
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 0", OffsetMax = "0 1" },
Image = { Color = "1 1 1 1" }
}, storageLayer + ".Logo", storageLayer + ".Logo.Line");
container.Add(new CuiElement
{
Name = storageLayer + ".Logo.Image",
Parent = storageLayer + ".Logo",
Components =
{
new CuiImageComponent {Png = ImageLibrary.Call<string>("GetImage", "ME_Logo_image")},
new CuiRectTransformComponent
{AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-142 -26", OffsetMax = "-90 26"}
}
});
if (userData.Count > 0)
{
var items = userData.Skip(page * 32).Take(32).ToList();
var tempList = items.Take(8).ToList();
var ySwitch = 180;
var xSwitch = -(((10 * (tempList.Count - 1)) + 90 * tempList.Count) / 2);
for (int i = 0; i < items.Count; i++)
{
var item = items[i];
if (item == null) continue;
container.Add(new CuiPanel
{
RectTransform =
{
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"{xSwitch} {ySwitch - 90}",
OffsetMax = $"{xSwitch + 90} {ySwitch}"
},
Image = { Color = "0.64 0.62 1 0.3" }
}, storageLayer, storageLayer + $".Item.{i}");
container.Add(new CuiElement
{
Parent = storageLayer + $".Item.{i}",
Components =
{
new CuiRawImageComponent
{
Png = ImageLibrary.Call<string>("GetImage",
!string.IsNullOrEmpty(item.ImageURL) ? item.ImageURL : item.item.ShortName)
},
new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 1"}
}
});
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
Text = { Text = "" },
Button =
{
Command = $"Sklad openmodal {page} {userData.IndexOf(item)}", Color = "0 0 0 0"
}
}, storageLayer + $".Item.{i}");
xSwitch += 100;
if ((i + 1) % 8 == 0)
{
ySwitch -= 100;
tempList = items.Skip(8).Take(8).ToList();
xSwitch = -(((10 * (tempList.Count - 1)) + 90 * tempList.Count) / 2);
}
}
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "40 10", OffsetMax = "120 35" },
Button = { Color = "0 0 0 0", Command = page - 1 >= 0 ? $"Sklad modalpage {page - 1}" : "" },
Text =
{
Text = GetMessage("UI.Back", player.UserIDString), FontSize = 20, Align = TextAnchor.LowerLeft,
Font = "robotocondensed-bold.ttf"
}
}, storageLayer);
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "1 0", AnchorMax = "1 0", OffsetMin = "-120 10", OffsetMax = "-40 35" },
Button =
{
Color = "0 0 0 0",
Command = userData.Count > (page + 1) * 32 ? $"Sklad modalpage {page + 1}" : ""
},
Text =
{
Text = GetMessage("UI.Next", player.UserIDString), FontSize = 20, Align = TextAnchor.LowerRight,
Font = "robotocondensed-bold.ttf"
}
}, storageLayer);
}
else
{
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
Text =
{
Text = GetMessage("UI.StorageEmpty", player.UserIDString), FontSize = 38,
Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
}
}, storageLayer);
}
CuiHelper.DestroyUi(player, storageLayer);
CuiHelper.AddUi(player, container);
}
private const string modalLayer = ".Modal.Give";
private void ModalGiveUI(BasePlayer player, int page, int itemid)
{
if (player == null) return;
var data = GetUserData(player.userID);
if (data == null || itemid < 0 || data.Count <= itemid) return;
var item = data[itemid];
if (item == null) return;
var container = new CuiElementContainer();
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
Button = { Close = modalLayer, Color = "0 0 0 0.95" },
Text = { Text = "" }
}, "Overlay", modalLayer);
container.Add(new CuiPanel
{
RectTransform =
{AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-150 -200", OffsetMax = "150 200"},
Image = { Color = "0.71 0.69 1 0.3" }
}, modalLayer, modalLayer + ".Main");
container.Add(new CuiElement
{
Parent = modalLayer + ".Main",
Components =
{
new CuiRawImageComponent
{
Png = ImageLibrary.Call<string>("GetImage",
!string.IsNullOrEmpty(item.ImageURL) ? item.ImageURL : item.item.ShortName)
},
new CuiRectTransformComponent
{AnchorMin = "0.5 0.75", AnchorMax = "0.5 0.75", OffsetMin = "-64 -64", OffsetMax = "64 64"}
}
});
var itemInfo = !string.IsNullOrEmpty(item.DisplayName)
? item.DisplayName
: ItemManager.FindItemDefinition(item.item.ShortName)?.displayName.translated ?? "";
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.1 0", AnchorMax = "1 0.45" },
Text =
{
Text = GetMessage("MODAL.ItemInfo", player.UserIDString, itemInfo, item.Amount),
Align = TextAnchor.UpperLeft, FontSize = 18, Color = "1 1 1 1",
Font = "robotocondensed-bold.ttf"
}
}, modalLayer + ".Main");
container.Add(new CuiButton
{
RectTransform =
{AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-100 20", OffsetMax = "100 70"},
Button = { Command = $"Sklad giveitem {page} {itemid}", Color = "1 1 1 0.3" },
Text =
{
Text = GetMessage("MODAL.Give", player.UserIDString), Align = TextAnchor.MiddleCenter,
FontSize = 18, Color = "1 1 1 1", Font = "robotocondensed-bold.ttf"
}
}, modalLayer + ".Main");
CuiHelper.DestroyUi(player, modalLayer);
CuiHelper.AddUi(player, container);
}
[ConsoleCommand("add")]
private void cmdg(ConsoleSystem.Arg arg)
{
switch (arg.Args[0].ToLower())
{
case "item":
//add item 76561199032370579 wood 666 0
{
var players = arg.Args[1];
string convertPlayer = players;
var d = _data;
ulong UserID = Convert.ToUInt64(convertPlayer);
var item = arg.Args[2];
var amounts = arg.Args[3];
string convertamounts = amounts;
int amount = Convert.ToInt32(convertamounts);
var skins = arg.Args[4];
string convertskins = skins;
ulong SkinID = Convert.ToUInt64(convertskins);
if (d.PlayersData.ContainsKey(UserID))
{
d.PlayersData[UserID].Add(new DataItem
{
Command = string.Empty,
item = new ItemClass { ShortName = item, SkinID = SkinID },
Amount = amount,
Type = ItemTypes.Item,
DisplayName = string.Empty,
ImageURL = string.Empty,
});
SaveData();
return;
}
d.PlayersData.Add(UserID, new List<DataItem>());
SaveData();
Server.Command($"add item {UserID} {item} {amount} {SkinID}");
break;
}
case "command":
// add command 76561199032370579 https://i.imgur.com/AL8UVUS.png bigBOI give %STEAMID% wood.use 7d
{
var players = arg.Args[1];
string convertPlayer = players;
var d = _data;
ulong UserID = Convert.ToUInt64(convertPlayer);
var url = arg.Args[2];
var name = arg.Args[3];
var msg = string.Empty;
for (var i = 4; i < arg.Args.Length; i++)
msg = $"{msg} {arg.Args[i]}";
if (d.PlayersData.ContainsKey(UserID))
{
d.PlayersData[UserID].Add(new DataItem
{
Command = msg,
item = new ItemClass { ShortName = string.Empty, SkinID = 0 },
Amount = 0,
Type = ItemTypes.Command,
DisplayName = name,
ImageURL = url,
});
SaveData();
return;
}
d.PlayersData.Add(UserID, new List<DataItem>());
SaveData();
Server.Command($"add command {UserID} {url} {name} {msg}");
break;
}
}
}
[ConsoleCommand("Sklad")]
private void CmdConsole(ConsoleSystem.Arg args)
{
var player = args.Player();
if (player == null) return;
if (!args.HasArgs())
{
player.SendConsoleCommand("chat.say /sklad");
return;
}
switch (args.Args[0].ToLower())
{
case "openmodal":
{
int page, itemid = 0;
if (!args.HasArgs(3) || !int.TryParse(args.Args[1], out page) ||
!int.TryParse(args.Args[2], out itemid)) return;
ModalGiveUI(player, page, itemid);
break;
}
case "modalpage":
{
var page = 0;
if (!args.HasArgs(2) || !int.TryParse(args.Args[1], out page)) return;
StorageUI(player, page);
break;
}
case "giveitem":
{
int page, itemid = 0;
if (!args.HasArgs(3) || !int.TryParse(args.Args[1], out page) ||
!int.TryParse(args.Args[2], out itemid)) return;
var dataItems = GetUserData(player.userID);
if (dataItems == null) return;
if (itemid >= 0 && dataItems.Count > itemid)
{
var item = dataItems[itemid];
if (item == null)
{
PrintError("Error getting item from data");
return;
}
GiveItem(player, item);
}
CuiHelper.DestroyUi(player, modalLayer);
StorageUI(player);
break;
}
}
}
private void GiveItem(BasePlayer player, DataItem item)
{
var userData = GetUserData(player.userID);
if (userData == null) return;
if (item.Type == ItemTypes.Command)
{
item.GiveCmd(player);
}
else
{
var toItem = item.ToItem();
if (toItem != null)
{
player.GiveItem(toItem, BaseEntity.GiveItemReason.PickedUp);
}
else
{
SendReply(player, GetMessage("ErrorItemCreating", player.UserIDString));
}
}
if (userData.Contains(item))
userData.Remove(item);
SaveData();
}
private void OnServerInitialized()
{
LoadData();
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
PrintWarning($" {Name} v{Version} loading");
if (!ImageLibrary)
{
PrintError(" Install plugin: 'ImageLibrary'");
Core.Interface.Oxide.UnloadPlugin(Title);
return;
}
PrintWarning(" Plugin loaded - OK");
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
ImageLibrary.Call("AddImage", "https://i.imgur.com/Okt1BMH.png", "ME_Background_image");
ImageLibrary.Call("AddImage", "https://i.imgur.com/DpLldC8.png", "ME_Logo_image");
foreach (var img in _data.PlayersData.SelectMany(p => p.Value))
{
if (!string.IsNullOrEmpty(img.ImageURL))
ImageLibrary.Call("AddImage", img.ImageURL, img.ImageURL);
}
}
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
{"UI.Back", "<b>BACK</b>"},
{"UI.Next", "<b>NEXT</b>"},
{"UI.Storage", "<b>STORAGE</b>"},
{"UI.StorageEmpty", "<b>STORAGE IS EMPTY</b>"},
{"MODAL.Give", "<b>TAKE</b>"},
{"MODAL.ItemInfo", "Name: {0}\n\nAmount: {1}"},
}, this);
lang.RegisterMessages(new Dictionary<string, string>
{
{"UI.Back", "<b>НАЗАД</b>"},
{"UI.Next", "<b>ДАЛЕЕ</b>"},
{"UI.Storage", "<b>СКЛАД</b>"},
{"UI.StorageEmpty", "<b>СКЛАД ПУСТ</b>"},
{"MODAL.Give", "<b>ЗАБРАТЬ</b>"},
{"MODAL.ItemInfo", "Название: {0}\n\nКоличество: {1}"},
}, this, "ru");
}
}
}