C#:
using System;
using System.Collections.Generic;
using Oxide.Core;
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System.Collections;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
using Newtonsoft.Json.Converters;
using Facepunch;
using VLB;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Oxide.Core.SQLite.Libraries;
using Oxide.Core.Database;
using Oxide.Core.Libraries;
namespace Oxide.Plugins {
[Info("DailyCards", "EcoSmile", "1.0.3")]
class DailyCards : RustPlugin {
static DailyCards ins;
PluginConfig config;
[JsonConverter(typeof(StringEnumConverter))]
public enum CardType {
Normal, Rare, Legendary
}
public class PluginConfig {
[JsonProperty(PropertyName = "Steam API key (get one here https://steamcommunity.com/dev/apikey)")]
public string SteamAPIKey;
[JsonProperty("Интервал синхронизации базы данных")]
public float SyncTime;
[JsonProperty("Количество открытий каждый день")]
public int DailyOpenCard;
[JsonProperty("Максимум Легендарных карточек")]
public int MaxLegendaryCard;
[JsonProperty("Максимум Редких карточек")]
public int MaxRareCard;
[JsonProperty("Карточки")]
public List<CardSetting> Cards;
}
static System.Random rnd = new System.Random();
public class CardSetting {
[JsonProperty("Редкость карточки (Normal, Rare, Legendary)")]
public CardType Type;
[JsonProperty("Карточка считается Набором? (Будут выданы все предметы из списка)")]
public bool IsKit;
[JsonProperty("Карточка считается Кейсом? (Будет выдан случайный предмет из списка)")]
public bool IsCase;
[JsonProperty("Картинка для UI (если карточка является кейсом или набором)")]
public string ImageURL;
[JsonProperty("Предметы карточки (если Набор и Кейс - false будет выдан первый предмет из списка)")]
public List<CardItem> CardItems = new List<CardItem>();
[JsonProperty("Системный ID Карточки.Не менять.При добавлении новой карточки ставить 0")]
public ulong CardID;
public List<CardItem> GetItems() {
var itemList = new List<CardItem>();
if (IsKit) {
CardItems.ForEach(x => itemList.Add(x.Get()));
}
else if (IsCase) {
itemList.Add(CardItems.GetRandom().Get());
}
else itemList.Add(CardItems.FirstOrDefault().Get());
return itemList;
}
}
public class CardItem {
[JsonProperty("Шортнейм предмета")]
public string ShortName;
[JsonProperty("Исполняемая команда (%STEAMID% - ключ для вставки SteamID игрока)")]
public string Command;
[JsonProperty("Картинка для UI (если нужно)")]
public string ImageURL;
[JsonProperty("Имя предмета для UI (если нужно)")]
public string UIName;
[JsonProperty("Кастомное имя предмета")]
public string CustomName;
[JsonProperty("Минимальное количество предмета")]
public int MinAmount;
[JsonProperty("Максимальное количество предмета")]
public int MaxAmount;
[JsonProperty("SkinID предмета")]
public ulong SkinID;
public CardItem Get() {
var prize = new CardItem();
prize.ShortName = ShortName;
prize.Command = Command;
prize.ImageURL = ImageURL;
prize.UIName = UIName;
prize.CustomName = CustomName;
var amount = UnityEngine.Random.Range(MinAmount, MaxAmount);
prize.MinAmount = amount;
prize.MaxAmount = amount;
prize.SkinID = SkinID;
return prize;
}
}
protected override void LoadDefaultConfig() {
config = new PluginConfig {
SyncTime = 60, DailyOpenCard = 3, MaxRareCard = 4, MaxLegendaryCard = 3, Cards = new List<CardSetting>() {
new CardSetting() {
Type = CardType.Legendary, IsCase = true, IsKit = false, ImageURL = "https://i.imgur.com/ykUR9FN.png", CardItems = new List<CardItem>() {
new CardItem() {
ShortName = "ammo.rocket.basic", MinAmount = 5, MaxAmount = 10, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "explosive.timed", MinAmount = 2, MaxAmount = 5, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "explosive.satchel", MinAmount = 10, MaxAmount = 25, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "grenade.beancan", MinAmount = 20, MaxAmount = 30, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "explosives", MinAmount = 1000, MaxAmount = 1500, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
,
}
}
, new CardSetting() {
Type = CardType.Rare, IsCase = true, IsKit = false, ImageURL = "https://i.imgur.com/sN5dOH8.png", CardItems = new List<CardItem>() {
new CardItem() {
ShortName = "sulfur", MinAmount = 1000, MaxAmount = 2500, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "gunpowder", MinAmount = 500, MaxAmount = 1500, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "explosives", MinAmount = 100, MaxAmount = 500, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "fat.animal", MinAmount = 1000, MaxAmount = 2000, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "lowgradefuel", MinAmount = 500, MaxAmount = 1000, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "metal.refined", MinAmount = 100, MaxAmount = 500, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
,
}
}
, new CardSetting() {
Type = CardType.Legendary, IsCase = false, IsKit = true, ImageURL = "https://i.imgur.com/pmRwHsG.png", CardItems = new List<CardItem>() {
new CardItem() {
ShortName = "metal.facemask", MinAmount = 1, MaxAmount = 1, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "metal.plate.torso", MinAmount = 1, MaxAmount = 1, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "roadsign.kilt", MinAmount = 1, MaxAmount = 1, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "tactical.gloves", MinAmount = 1, MaxAmount = 1, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "hoodie", MinAmount = 1, MaxAmount = 1, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "pants", MinAmount = 1, MaxAmount = 1, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "shoes.boots", MinAmount = 1, MaxAmount = 1, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
}
}
, new CardSetting() {
Type = CardType.Rare, IsCase = false, IsKit = true, ImageURL = "https://i.imgur.com/ONzWs7c.png", CardItems = new List<CardItem>() {
new CardItem() {
ShortName = "stones", MinAmount = 500, MaxAmount = 1000, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "wood", MinAmount = 1000, MaxAmount = 1500, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
, new CardItem() {
ShortName = "metal.fragments", MinAmount = 1000, MaxAmount = 1500, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
}
}
, new CardSetting() {
Type = CardType.Normal, IsCase = false, IsKit = false, ImageURL = "", CardItems = new List<CardItem>() {
new CardItem() {
ShortName = "stones", MinAmount = 1000, MaxAmount = 2000, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
}
}
, new CardSetting() {
Type = CardType.Normal, IsCase = false, IsKit = false, ImageURL = "", CardItems = new List<CardItem>() {
new CardItem() {
ShortName = "wood", MinAmount = 1000, MaxAmount = 2000, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
}
}
, new CardSetting() {
Type = CardType.Normal, IsCase = false, IsKit = false, ImageURL = "", CardItems = new List<CardItem>() {
new CardItem() {
ShortName = "sulfur", MinAmount = 1000, MaxAmount = 2000, CustomName = "", UIName = "", ImageURL = "", Command = "",
}
}
}
}
}
;
}
protected override void LoadConfig() {
base.LoadConfig();
config = Config.ReadObject<PluginConfig>();
}
protected override void SaveConfig() {
Config.WriteObject(config);
}
void CheckConfigValue() {
if (config.Cards.Any(x => x.CardID == 0)) {
foreach (var card in config.Cards) {
if (card.CardID == 0) card.CardID = (ulong)rnd.Next(1111, 2000000);
}
SaveConfig();
}
}
SQLite sqlLisbrary;
Connection sqlConnection;
static string SqlDataFileName = "DailyCardData.db";
static string SqlTable = "DailyCards";
static string SqlBase = "playercarddata";
void LoadConnection() {
sqlLisbrary = Interface.GetMod().GetLibrary<Core.SQLite.Libraries.SQLite>();
sqlConnection = sqlLisbrary.OpenDb(SqlDataFileName, this);
if (sqlConnection == null) {
PrintError("Couldn't open the SQLite DailyCard Base.");
return;
}
var sql = $"CREATE TABLE IF NOT EXISTS `{SqlTable}`" + $"(`userID` bigint NOT NULL PRIMARY KEY, `CardIDs` text, `Opened` int NOT NULL, `OpenedToDay` text, `DailyCardList` text, `Day` int NOT NULL);";
sqlLisbrary.Insert(Core.Database.Sql.Builder.Append(sql), sqlConnection);
}
private void OnServerInitialized() {
ins = this;
CheckConfigValue();
LoadConnection();
foreach (CardSetting img in config.Cards) {
ImageLibrary.Call("AddImage", img.ImageURL, img.ImageURL);
foreach(var img2 in img.CardItems) ImageLibrary.Call("AddImage", img2.ImageURL, img2.ImageURL);
}
ImageLibrary.Call("AddImage", "https://i.imgur.com/mTfLh3i.png", "BackCard");
ImageLibrary.Call("AddImage", "https://i.imgur.com/tT1LmXT.png", "NormalCard");
ImageLibrary.Call("AddImage", "https://i.imgur.com/zW0ng9v.png", "RareCard");
ImageLibrary.Call("AddImage", "https://i.imgur.com/sUaYhWE.png", "LegendCard");
BasePlayer.activePlayerList.ToList().ForEach(OnPlayerConnected);
timer.Every(config.SyncTime, () => SincBase());
}
void Unload() {
ins = null;
rnd = null;
foreach (var player in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(player, "MainCardUI.BG");
UnloadPlayerBase(player);
}
}
void OnServerSave() {
}
void OnNewSave() {
}
public class OpenData {
public int Opened = 0;
public Dictionary<int, string> OpenedToDay = new Dictionary<int, string>();
public List<string> Cards = new List<string>();
public List<string> DailyList = new List<string>();
public int Day = 0;
public OpenData() {
Opened = 0;
OpenedToDay = new Dictionary<int, string>();
Cards = new List<string>();
DailyList = ins.GeneratedDailyList();
Day = DateTime.Now.Day;
}
public OpenData(int opened, Dictionary<int, string> openToDay, List<string> cards, List<string> dailyList, int day) {
Opened = opened;
OpenedToDay = openToDay;
Cards = cards;
DailyList = dailyList;
Day = day;
if (Day != DateTime.Now.Day) {
Opened = 0;
OpenedToDay = new Dictionary<int, string>();
DailyList = ins.GeneratedDailyList();
Day = DateTime.Now.Day;
}
}
}
private List<string> GeneratedDailyList() {
var list = new List<string>();
var lCount = config.MaxLegendaryCard;
var rCount = config.MaxRareCard;
var nCount = 12 - lCount - rCount;
var legendList = config.Cards.Where(x => x.Type == CardType.Legendary).ToList();
var rareList = config.Cards.Where(x => x.Type == CardType.Rare).ToList();
var normalList = config.Cards.Where(x => x.Type == CardType.Normal).ToList();
for (int i = 0; i < lCount; i++) {
list.Add(legendList.GetRandom().CardID.ToString());
}
for (int i = 0; i < rCount; i++) {
list.Add(rareList.GetRandom().CardID.ToString());
}
for (int i = 0; i < nCount; i++) {
list.Add(normalList.GetRandom().CardID.ToString());
}
list.Shuffle((uint)UnityEngine.Random.Range(1, 999));
return list;
}
Dictionary<BasePlayer, OpenData> PlayerCard = new Dictionary<BasePlayer, OpenData>();
void OnPlayerConnected(BasePlayer player) {
if (player.IsReceivingSnapshot) {
timer.In(1f, () => OnPlayerConnected(player));
return;
}
LoadPlayerBase(player);
}
void OnPlayerDisconnected(BasePlayer player, string reason) {
UnloadPlayerBase(player);
}
void LoadPlayerBase(BasePlayer player) {
sqlLisbrary.Query(Sql.Builder.Append($"SELECT * from {SqlTable} WHERE `userID` = '{player.userID}'"), sqlConnection, callBack => {
if (callBack != null && callBack.Count > 0) {
foreach (var data in callBack) {
PlayerCard[player] = new OpenData(Convert.ToInt32(data["Opened"]), GetOpenedCards(data["OpenedToDay"] as string), GetCardIDs(data["CardIDs"] as string), GetCardIDs(data["DailyCardList"] as string), Convert.ToInt32(data["Day"]));
}
}
else {
PlayerCard[player] = new OpenData();
}
}
);
}
void SincBase() {
foreach (var player in BasePlayer.activePlayerList) {
if (!PlayerCard.ContainsKey(player)) continue;
var ids = string.Join(",", PlayerCard[player]);
var opened = PlayerCard[player].Opened;
var dayList = string.Join(",", PlayerCard[player].DailyList);
string openToDay = "";
foreach (var crd in PlayerCard[player].OpenedToDay) {
openToDay += $"{crd.Key}:{crd.Value},";
}
string sql = $"INSERT OR REPLACE INTO `{SqlTable}` VALUES ('{player.userID}', '{ids}', '{opened}', '{openToDay}', '{dayList}', '{PlayerCard[player].Day}');";
sqlLisbrary.Insert(Core.Database.Sql.Builder.Append(sql), sqlConnection);
}
}
void UnloadPlayerBase(BasePlayer player) {
var ids = string.Join(",", PlayerCard[player].Cards);
var opened = PlayerCard[player].Opened;
var dayList = string.Join(",", PlayerCard[player].DailyList);
string openToDay = "";
foreach (var crd in PlayerCard[player].OpenedToDay) {
openToDay += $"{crd.Key}:{crd.Value},";
}
string sql = $"INSERT OR REPLACE INTO `{SqlTable}` VALUES ('{player.userID}', '{ids}', '{opened}', '{openToDay}', '{dayList}', '{PlayerCard[player].Day}');";
sqlLisbrary.Insert(Core.Database.Sql.Builder.Append(sql), sqlConnection);
PlayerCard.Remove(player);
}
List<string> GetCardIDs(string ids) {
var idList = new List<string>();
if (string.IsNullOrEmpty(ids)) return idList;
var reply = 0;
var idMass = ids.Split(',');
foreach (string id in idMass) {
if (config.Cards.Any(x => x.CardID.ToString() == id)) {
idList.Add(id);
}
}
if (reply == 0) {
}
return idList;
}
Dictionary<int, string> GetOpenedCards(string cards) {
var dict = new Dictionary<int, string>();
if (string.IsNullOrEmpty(cards)) return dict;
var dictString = cards.Split(',');
foreach (var card in dictString) {
var keyValueString = card.Split(':');
if (string.IsNullOrEmpty(keyValueString[0])) continue;
var key = Convert.ToInt32(keyValueString[0]);
if (string.IsNullOrEmpty(keyValueString[1])) continue;
var value = keyValueString[1];
if (config.Cards.Any(x => x.CardID.ToString() == value)) dict.Add(key, value);
}
return dict;
}
[ConsoleCommand("cards")]
void DrawMainUI_cmd(ConsoleSystem.Arg arg) => DrawMainUI(arg.Player());
[ChatCommand("cards")]
void DrawMainUI(BasePlayer player) {
var container = new CuiElementContainer();
var lg = lang.GetLanguage(player.UserIDString);
UI.AddImage(ref container, "Overlay", "MainCardUI.BG", "0.141 0.137 0.109 0.95", "assets/content/ui/ui.background.tiletex.psd", "assets/content/ui/uibackgroundblur-ingamemenu.mat", "0 0", "1 1", "", "");
UI.AddText(ref container, "MainCardUI.BG", "Header", "0.68 0.63 0.60 1", lg == "ru" ? $"ЕЖЕДНЕВНЫЕ КАРТОЧКИ" : "DAILY CARDS", TextAnchor.MiddleCenter, 38, "0.5 1", "0.5 1", "-250 -70", "250 -10");
UI.AddButton(ref container, "MainCardUI.BG", "Storage.BTN", "opencardstorage", "", "0.28 0.32 0.17 1", "assets/content/ui/capsule-background.png", "", "0.15 0", "0.15 0", "-64 14", "64 52");
UI.AddText(ref container, "Storage.BTN", "Storage.BTN.txt", "0.68 0.63 0.60 1", lg == "ru" ? $"СКЛАД" : "STORAGE", TextAnchor.MiddleCenter, 18, "0.5 0.5", "0.5 0.5", "-64 -15", "64 15");
UI.AddButton(ref container, "MainCardUI.BG", "Close.BTN", "", "MainCardUI.BG", "0.441 0.237 0.209 1", "assets/icons/close.png", "", "1 1", "1 1", "-40 -40", "-14 -14");
CuiHelper.DestroyUi(player, "MainCardUI.BG");
CuiHelper.AddUi(player, container);
DrawCardField(player);
DrawCurrentOpening(player);
}
void DrawCurrentOpening(BasePlayer player) {
var lg = lang.GetLanguage(player.UserIDString);
var container = new CuiElementContainer();
var opened = config.DailyOpenCard - PlayerCard[player].Opened;
UI.AddText(ref container, "MainCardUI.BG", "OependCount", "0.68 0.63 0.60 1", lg == "ru" ? $"ДОСТУПНО ОТКРЫТИЙ: <color=#f44e42>{(opened >= 0 ? opened.ToString() : "0")}</color>" : $"AVAILABLE OPENING: <color=#f44e42>{(opened >= 0 ? opened.ToString() : "0")}</color>", TextAnchor.LowerCenter, 22, "0.5 0", "0.5 0", "-250 55", "250 85");
if (opened <= 0) {
UI.AddText(ref container, "OependCount", "OependCount.2", "0.68 0.63 0.60 1", lg == "ru" ? $"ОТКРЫТИЯ ЗАКОНЧИЛИСЬ, ПРИХОДИТЕ ЗАВТРА" : $"THE OPENINGS ARE OVER, COME BACK TOMORROW", TextAnchor.LowerCenter, 16, "0.5 0", "0.5 0", "-250 -25", "250 -5");
UI.AddText(ref container, "OependCount.2", "OependCount.3", "0.68 0.63 0.60 1", lg == "ru" ? $"<color=#f44e42>ПОЛУЧИТЬ ДОП ОТКРЫТИЯ ИЛИ СБРОСИТЬ ОТКРЫТЫЕ КАРТОЧКИ МОЖНО В МАГАЗИНЕ</color>" : $"<color=#f44e42>ADD MORE OPENINGS OR RESET OPENED CARDS CAN IN THE STORE</color>", TextAnchor.LowerCenter, 14, "0.5 0", "0.5 0", "-350 -25", "350 -5");
}
CuiHelper.DestroyUi(player, "OependCount");
CuiHelper.AddUi(player, container);
}
void DrawCardField(BasePlayer player) {
var container = new CuiElementContainer();
UI.AddImage(ref container, "MainCardUI.BG", "CardField", "1 1 1 0", "", "", "0.5 0.5", "0.5 0.5", "-600 -300", "600 300");
var sHorisontal = 0.1;
var sVertical = 0.75;
var vertical = sVertical;
var horisontal = sHorisontal;
int i = 0;
var lg = lang.GetLanguage(player.UserIDString);
foreach (var crd in PlayerCard[player].DailyList) {
if (PlayerCard[player].OpenedToDay.ContainsKey(i)) {
UI.AddButton(ref container, "CardField", $"Card.{i}", "", "", "0 0 0 0", "", "", $"{horisontal} {vertical}", $"{horisontal} {vertical}", "-80 -120", "80 120");
var cardid = PlayerCard[player].OpenedToDay[i];
var card = config.Cards.FirstOrDefault(x => x.CardID.ToString() == cardid);
if (card != null) {
var rare = card.Type == CardType.Legendary ? GetItemImage("LegendCard") : card.Type == CardType.Rare ? GetItemImage("RareCard") : GetItemImage("NormalCard");
UI.AddRawImage(ref container, $"Card.{i}", "CardImg", rare, "1 1 1 1", "", "", "0.5 0.5", "0.5 0.5", "-80 -120", "80 120");
UI.AddImage(ref container, "CardImg", "bluur", "0 0 0.05", "", "assets/content/ui/uibackgroundblur.mat", "0 0", "1 1", "", "");
if (card.IsKit || card.IsCase) {
if (!string.IsNullOrEmpty(card.ImageURL)) {
UI.AddRawImage(ref container, $"CardImg", "Card.item", GetItemImage(card.ImageURL), "1 1 1 1", "", "", "0.5 0.5", "0.5 0.5", "-55 -55", "55 55");
}
}
else {
var item = card.CardItems.FirstOrDefault();
UI.AddRawImage(ref container, $"CardImg", "Card.item", GetItemImage(item.ShortName, item.SkinID), "1 1 1 1", "", "", "0.5 0.6", "0.5 0.6", "-55 -55", "55 55");
if (!string.IsNullOrEmpty(item.CustomName)) UI.AddText(ref container, $"Card.item", "ItemName", "0.68 0.63 0.60 1", $"{item.CustomName}", TextAnchor.MiddleCenter, 22, "0.5 1", "0.5 1", "-70 5", "70 45");
UI.AddText(ref container, $"Card.item", "MaxAmount", "0.68 0.63 0.60 1", $"MAX: x{item.MaxAmount}", TextAnchor.MiddleRight, 12, "1 0", "1 0", "-140 -25", "0 -5", "0 0 0 1", "robotocondensed-regular.ttf", "0.5 0.5");
UI.AddText(ref container, $"MaxAmount", "MinAmount", "0.68 0.63 0.60 1", $"MIN: x{item.MinAmount}", TextAnchor.MiddleRight, 12, "1 0", "1 0", "-140 -25", "0 -5", "0 0 0 1", "robotocondensed-regular.ttf", "0.5 0.5");
}
}
}
else {
UI.AddButton(ref container, "CardField", $"Card.{i}", $"opencard {crd} {i}", "", "0 0 0 0", "", "", $"{horisontal} {vertical}", $"{horisontal} {vertical}", "-80 -120", "80 120");
UI.AddRawImage(ref container, $"Card.{i}", "CardImg", GetItemImage("BackCard"), "1 1 1 1", "", "", "0.5 0.5", "0.5 0.5", "-80 -120", "80 120");
}
horisontal += 0.16f;
if (horisontal > 0.95) {
horisontal = sHorisontal;
vertical -= 0.5f;
}
i++;
}
UI.AddButton(ref container, "MainCardUI.BG", "Storage.BTN", "opencardstorage", "", "0.28 0.32 0.17 1", "assets/content/ui/capsule-background.png", "", "0.15 0", "0.15 0", "-64 14", "64 52");
UI.AddText(ref container, "Storage.BTN", "Storage.BTN.txt", "0.68 0.63 0.60 1", lg == "ru" ? $"СКЛАД" : "STORAGE", TextAnchor.MiddleCenter, 18, "0.5 0.5", "0.5 0.5", "-64 -15", "64 15");
UI.AddText(ref container, "MainCardUI.BG", "Header", "0.68 0.63 0.60 1", lg == "ru" ? $"ЕЖЕДНЕВНЫЕ КАРТОЧКИ" : "DAILY CARDS", TextAnchor.MiddleCenter, 38, "0.5 1", "0.5 1", "-250 -70", "250 -10");
CuiHelper.DestroyUi(player, "Header");
CuiHelper.DestroyUi(player, "Storage.BTN");
CuiHelper.DestroyUi(player, "CardField");
CuiHelper.AddUi(player, container);
DrawCurrentOpening(player);
}
void DrawStorage(BasePlayer player, int page) {
var container = new CuiElementContainer();
var sHorisontal = 0.1;
var sVertical = 0.75;
var vertical = sVertical;
var horisontal = sHorisontal;
var lg = lang.GetLanguage(player.UserIDString);
UI.AddImage(ref container, "MainCardUI.BG", "CardField", "1 1 1 0", "", "", "0.5 0.5", "0.5 0.5", "-600 -300", "600 300");
int i = page * 12;
foreach (var crd in PlayerCard[player].Cards.Skip(12 * page).Take(12)) {
var card = config.Cards.FirstOrDefault(x => x.CardID.ToString() == crd);
if (card != null) {
UI.AddButton(ref container, "CardField", $"Card.{i}", $"getcard {i} {page}", "", "0 0 0 0", "", "", $"{horisontal} {vertical}", $"{horisontal} {vertical}", "-80 -120", "80 120");
var rare = card.Type == CardType.Legendary ? GetItemImage("LegendCard") : card.Type == CardType.Rare ? GetItemImage("RareCard") : GetItemImage("NormalCard");
UI.AddRawImage(ref container, $"Card.{i}", "CardImg", rare, "1 1 1 1", "", "", "0.5 0.5", "0.5 0.5", "-80 -120", "80 120");
UI.AddImage(ref container, "CardImg", "bluur", "0 0 0.1", "", "assets/content/ui/uibackgroundblur.mat", "0 0", "1 1", "", "");
if (card.IsKit || card.IsCase) {
if (!string.IsNullOrEmpty(card.ImageURL)) {
UI.AddRawImage(ref container, $"CardImg", "Card.item", GetItemImage(card.ImageURL), "1 1 1 1", "", "", "0.5 0.5", "0.5 0.5", "-55 -55", "55 55");
}
}
else {
var item = card.CardItems.FirstOrDefault();
UI.AddRawImage(ref container, $"CardImg", "Card.item", GetItemImage(item.ShortName, item.SkinID), "1 1 1 1", "", "", "0.5 0.6", "0.5 0.6", "-55 -55", "55 55");
if (!string.IsNullOrEmpty(item.CustomName)) UI.AddText(ref container, $"Card.item", "ItemName", "0.68 0.63 0.60 1", $"{item.CustomName}", TextAnchor.MiddleCenter, 22, "0.5 1", "0.5 1", "-70 5", "70 45");
UI.AddText(ref container, $"Card.item", "MaxAmount", "0.68 0.63 0.60 1", $"MAX: x{item.MaxAmount}", TextAnchor.MiddleRight, 12, "1 0", "1 0", "-140 -25", "0 -5", "0 0 0 1", "robotocondensed-regular.ttf", "0.5 0.5");
UI.AddText(ref container, $"MaxAmount", "MinAmount", "0.68 0.63 0.60 1", $"MIN: x{item.MinAmount}", TextAnchor.MiddleRight, 12, "1 0", "1 0", "-140 -25", "0 -5", "0 0 0 1", "robotocondensed-regular.ttf", "0.5 0.5");
}
if (card.IsCase || card.IsKit) UI.AddButton(ref container, "CardImg", $"CardImfo.Btn.{i}", $"cardinfo {i}", "", card.Type == CardType.Legendary ? "0 0 0 1" : "1 1 1 1", "assets/icons/examine.png", "", $"1 1", $"1 1", "-35 -35", "-5 -5");
horisontal += 0.16f;
if (horisontal > 0.95) {
horisontal = sHorisontal;
vertical -= 0.5f;
}
}
i++;
}
if (page > 0) {
UI.AddButton(ref container, "CardField", "BackBtn", $"cardpage {page - 1}", "", "0.28 0.32 0.17 1", "assets/content/ui/capsule-background.png", "", "0 0", "0 0", "0 -30", "70 -5");
UI.AddText(ref container, $"BackBtn", "Text", "0.68 0.63 0.60 0.50", "◄", TextAnchor.MiddleCenter, 24, "0.5 0.5", "0.5 0.5", "-30 -15", "30 15");
}
if (PlayerCard[player].Cards.Skip(page * 12).Count() > 12) {
UI.AddButton(ref container, "CardField", "BackBtn", $"cardpage {page + 1}", "", "0.28 0.32 0.17 1", "assets/content/ui/capsule-background.png", "", "1 0", "1 0", "-70 -30", "0 -5");
UI.AddText(ref container, $"BackBtn", "Text", "0.68 0.63 0.60 0.50", "►", TextAnchor.MiddleCenter, 24, "0.5 0.5", "0.5 0.5", "-30 -15", "30 15");
}
UI.AddButton(ref container, "MainCardUI.BG", "Storage.BTN", "backtocards", "", "0.341 0.137 0.109 0.8", "assets/content/ui/capsule-background.png", "", "0.15 0", "0.15 0", "-64 14", "64 52");
UI.AddText(ref container, "Storage.BTN", "Storage.BTN.txt", "0.68 0.63 0.60 1", lg == "ru" ? $"НАЗАД" : "BACK", TextAnchor.MiddleCenter, 18, "0.5 0.5", "0.5 0.5", "-64 -15", "64 15");
UI.AddText(ref container, "MainCardUI.BG", "Header", "0.68 0.63 0.60 1", lg == "ru" ? $"ВАШ СКЛАД" : "STORAGE", TextAnchor.MiddleCenter, 38, "0.5 1", "0.5 1", "-250 -70", "250 -10");
CuiHelper.DestroyUi(player, "Header");
CuiHelper.DestroyUi(player, "OependCount");
CuiHelper.DestroyUi(player, "Storage.BTN");
CuiHelper.DestroyUi(player, "CardField");
CuiHelper.AddUi(player, container);
}
void DrawCardInfo(BasePlayer player, CardSetting card) {
var container = new CuiElementContainer();
var lg = lang.GetLanguage(player.UserIDString);
UI.AddButton(ref container, "MainCardUI.BG", "CardInfo.BG", "", "CardInfo.BG", "0 0 0 0.5", "", "assets/content/ui/uibackgroundblur.mat", "0 0", "1 1", "", "");
var panelHeight = 32f;
var multiplauer = (float)Math.Ceiling(card.CardItems.Count / 6f);
if (multiplauer >= 2f) panelHeight = 35f;
panelHeight *= multiplauer;
UI.AddImage(ref container, "CardInfo.BG", "CardInfo.Field", "1 1 1 0.3", "", "", "0.5 0.5", "0.5 0.5", $"-210 -{panelHeight}", $"210 {panelHeight}");
UI.AddText(ref container, "CardInfo.Field", "CardInfo.Hedaer", "0.68 0.63 0.60 1", lg == "ru" ? $"{(card.IsCase ? "СЛУЧАЙНЫЙ ПРЕДМЕТ" : "НАБОР ПРЕДМЕТОВ")}" : $"{(card.IsCase ? "RANDOM ITEM" : "SET OF ITEMS")}", TextAnchor.MiddleCenter, 32, "0.5 1", "0.5 1", "-250 5", "250 55");
var sHorisontal = 0f;
var sVertical = 1f;
var vertical = sVertical;
var horisontal = sHorisontal;
float gapH = 0;
float gapV = 0;
foreach (var it in card.CardItems) {
UI.AddRawImage(ref container, "CardInfo.Field", "CardInfo.item", $"{(string.IsNullOrEmpty(it.ImageURL) ? GetItemImage(it.ShortName, it.SkinID) : GetItemImage(it.ImageURL))}", "1 1 1 1", "", "", $"{horisontal} {vertical}", $"{horisontal} {vertical}", $"{gapH} -{64 + gapV}", $"{64 + gapH} -{gapV}");
if (it.MaxAmount > it.MinAmount) UI.AddText(ref container, "CardInfo.item", "CardInfo.maxmin", "1 1 1 1", $"MIN: x{it.MinAmount}\nMAX: x{it.MaxAmount}", TextAnchor.LowerRight, 10, "0 0", "1 1", "", "", "0 0 0 1", "robotocondensed-regular.ttf", "0.1 0.1");
else UI.AddText(ref container, "CardInfo.item", "CardInfo.maxmin", "1 1 1 1", $"x{it.MinAmount}", TextAnchor.LowerRight, 10, "0 0", "1 1", "", "", "0 0 0 1", "robotocondensed-regular.ttf", "0.1 0.1");
gapH += 70;
if(gapH >= 420) {
gapH = 0;
gapV += 70;
}
}
CuiHelper.DestroyUi(player, "CardInfo.BG");
CuiHelper.AddUi(player, container);
}
[ConsoleCommand("cardinfo")]
void CardInfo(ConsoleSystem.Arg arg) {
var player = arg.Player();
var index = arg.GetInt(0);
var cardID = PlayerCard[player].Cards[index];
var card = config.Cards.FirstOrDefault(x => x.CardID.ToString() == cardID);
DrawCardInfo(player, card);
}
[ConsoleCommand("getcard")]
void GetCard(ConsoleSystem.Arg arg) {
var player = arg.Player();
var index = arg.GetInt(0);
var page = arg.GetInt(1);
var cardID = PlayerCard[player].Cards[index];
var card = config.Cards.FirstOrDefault(x => x.CardID.ToString() == cardID);
PlayerCard[player].Cards.RemoveAt(index);
var items = card.GetItems();
if (page > 0 && PlayerCard[player].Cards.Skip(page * 12).Count() <= 0) {
page--;
}
DrawStorage(player, page);
foreach (var it in items) {
if (!string.IsNullOrEmpty(it.Command)) {
string cmd = "";
cmd = it.Command.Replace("%STEAMID%", player.UserIDString);
rust.RunServerCommand(cmd);
}
if (!string.IsNullOrEmpty(it.ShortName)) {
var amount = UnityEngine.Random.Range(it.MinAmount, it.MaxAmount + 1);
Item item = ItemManager.CreateByName(it.ShortName, amount, it.SkinID);
player.GiveItem(item);
}
}
}
[ConsoleCommand("opencard")]
void OpenCard_cmd(ConsoleSystem.Arg arg) {
var player = arg.Player();
if (PlayerCard[player].Opened >= config.DailyOpenCard) return;
PlayerCard[player].Opened++;
var cardID = arg.Args[0];
var index = arg.GetInt(1);
var card = config.Cards.FirstOrDefault(x => x.CardID.ToString() == cardID);
PlayerCard[player].OpenedToDay.Add(index, cardID);
PlayerCard[player].Cards.Add(cardID);
DrawCardField(player);
EffectNetwork.Send(new Effect(card.Type== CardType.Legendary ? "assets/prefabs/misc/halloween/lootbag/effects/gold_open.prefab" : "assets/prefabs/misc/easter/painted eggs/effects/gold_open.prefab", player.transform.position, Vector3.zero), player.net.connection);
}
[ConsoleCommand("backtocards")]
void BackToCards(ConsoleSystem.Arg arg) {
var player = arg.Player();
DrawCardField(player);
}
[ConsoleCommand("opencardstorage")]
void OpenCardStorage(ConsoleSystem.Arg arg) {
var player = arg.Player();
DrawStorage(player, 0);
}
[ConsoleCommand("cardpage")]
void CardPage_cmd(ConsoleSystem.Arg arg) {
var player = arg.Player();
var page = arg.GetInt(0);
DrawStorage(player, page);
}
[ConsoleCommand("addopentry")]
void AddOpenTry(ConsoleSystem.Arg arg) {
if (arg.Connection != null && arg.Connection.authLevel < 2) return;
if (arg.Args == null || arg.Args.Length < 2) {
Puts("Use: addopentry STEAMID count");
return;
}
var userID = arg.GetUInt64(0);
var count = arg.GetInt(1);
var player = BasePlayer.activePlayerList.FirstOrDefault(x => x.userID == userID);
PlayerCard[player].Opened-= count;
var lg = lang.GetLanguage(player.UserIDString);
var opened = config.DailyOpenCard - PlayerCard[player].Opened;
SendReply(player, lg == "ru" ? $"Вы получили {count} доп.открытие карточек.\nДоступно открытий: <color=#f44e42>{(opened >= 0 ? opened.ToString() : "0")}</color>\nВведите /cards чтобы открыть карточки." : $"You have received {count} additional card opening.\nAvailable opening: <color=#f44e42>{(opened >= 0 ? opened.ToString() : "0")}</color>\nEnter /cards to open the cards.");
}
[ConsoleCommand("resetcard")]
void ResetCard(ConsoleSystem.Arg arg) {
if (arg.Connection != null && arg.Connection.authLevel < 2) return;
if (arg.Args == null || arg.Args.Length < 1) {
Puts("Use: resetcard STEAMID");
return;
}
var userID = arg.GetUInt64(0);
var player = BasePlayer.activePlayerList.FirstOrDefault(x => x.userID == userID);
PlayerCard[player].DailyList = GeneratedDailyList();
PlayerCard[player].OpenedToDay = new Dictionary<int, string>();
var lg = lang.GetLanguage(player.UserIDString);
var opened = config.DailyOpenCard - PlayerCard[player].Opened;
SendReply(player, lg == "ru" ? $"Вы сбросили открытые за сегодня карточки.\nВведите /cards чтобы открыть карточки." : $"You have discarded the cards you opened today.\nEnter /cards to open the cards.");
}
[ConsoleCommand("fullreset")]
void ResetCardAndOpenings(ConsoleSystem.Arg arg) {
if (arg.Connection != null && arg.Connection.authLevel < 2) return;
if (arg.Args == null || arg.Args.Length < 1) {
Puts("Use: fullreset STEAMID");
return;
}
var userID = arg.GetUInt64(0);
var player = BasePlayer.activePlayerList.FirstOrDefault(x => x.userID == userID);
PlayerCard[player].Opened = 0;
PlayerCard[player].DailyList = GeneratedDailyList();
PlayerCard[player].OpenedToDay = new Dictionary<int, string>();
var lg = lang.GetLanguage(player.UserIDString);
var opened = config.DailyOpenCard - PlayerCard[player].Opened;
SendReply(player, lg == "ru" ? $"Вы выполнили полный сброс карточек за сегодня.\nДоступно открытий: <color=#f44e42>{(opened >= 0 ? opened.ToString() : "0")}</color>\nВведите /cards чтобы открыть карточки." : $"You have completed a full card reset for today.\nAvailable opening: <color=#f44e42>{(opened >= 0 ? opened.ToString() : "0")}</color>\nEnter /cards to open the cards.");
}
public static class UI {
public static void AddImage(ref CuiElementContainer container, string parrent, string name, string color, string sprite, string mat, string aMin, string aMax, string oMin, string oMax, string outline = "", string dist = "") {
if (!string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiImageComponent {
Color = color, Sprite = sprite, Material = mat
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
);
if (!string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat) && !string.IsNullOrEmpty(outline)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiImageComponent {
Color = color, Sprite = sprite, Material = mat
}
, new CuiOutlineComponent {
Color = outline, Distance = dist
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
);
if (!string.IsNullOrEmpty(sprite) && string.IsNullOrEmpty(mat) && !string.IsNullOrEmpty(outline)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiImageComponent {
Color = color, Sprite = sprite
}
, new CuiOutlineComponent {
Color = outline, Distance = dist
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
);
if (string.IsNullOrEmpty(sprite) && string.IsNullOrEmpty(mat) && !string.IsNullOrEmpty(outline)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiImageComponent {
Color = color
}
, new CuiOutlineComponent {
Color = outline, Distance = dist
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
);
if (string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiImageComponent {
Color = color, Material = mat
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
);
if (!string.IsNullOrEmpty(sprite) && string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiImageComponent {
Color = color, Sprite = sprite
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
);
if (string.IsNullOrEmpty(sprite) && string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiImageComponent {
Color = color
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
);
}
public static void AddRawImage(ref CuiElementContainer container, string parrent, string name, string png, string color, string sprite, string mat, string aMin, string aMax, string oMin, string oMax) {
if (!string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiRawImageComponent {
Color = color, Sprite = sprite, Material = mat, Png = png
}
, new CuiNeedsCursorComponent {
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
);
if (string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
Parent = parrent, Name = name, Components = {
new CuiRawImageComponent {
Color = color, Material = mat, Png = png
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
}
}
}
// ... [Code preview truncated due to length. Full source in attached file] ...