C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Globalization;
using System.IO;
using System.Linq;
using Facepunch.Extend;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using Global = Rust.Global;
namespace Oxide.Plugins
{
[Info("SkuliSkins", "Skuli Dropek", "1.6.3")]
public class SkuliSkins : RustPlugin
{
#region Cfg
private const bool En = true;
class DataPlayer
{
[JsonProperty(En ? "List of favorite skins" : "Список избранных скинов")]
public Dictionary<string, Dictionary<ulong, ItemData.SkinInfo>> _izvSkins =
new Dictionary<string, Dictionary<ulong, ItemData.SkinInfo>>();
[JsonProperty(En ? "List of default skins supplied" : "Список поставленных скинов по дефолту")]
public Dictionary<string, DefaultSkins> _defaultSkins =
new Dictionary<string, DefaultSkins>();
[NonSerialized]
public BaseEntity Prefab;
}
class DefaultSkins
{
[JsonProperty(En ? "SkinID" : "СкинАйди")]
public ulong skinId;
[JsonProperty(En ? "Information about the skin" : "Информация о скине")]
public ItemData.SkinInfo SkinInfo;
}
private Dictionary<ulong, DataPlayer> playersData = new Dictionary<ulong, DataPlayer>();
private static ConfigData cfg { get; set; }
private class ConfigData
{
internal class MarketSystem
{
[JsonProperty(En ? "Enabled(true = yes)" : "Включить?(true = да)")]
public bool IsEnabled = false;
[JsonProperty(En ? "How to pay?(Scrap, ServerRewards, Economics)" : "Чем платить?(Scrap, ServerRewards, Economics)")]
public string WhoMarket = "Scrap";
[JsonProperty(En ? "The price for opening the interface (If 0, then free)" : "Цена за открытие интерфейса(Если 0, то бесплатно)")]
public int costOpen = 10;
[JsonProperty(En ? "Price per change of one skin (If 0, then free)" : "Цена за смену одного скина(Если 0, то бесплатно)")]
public int costChange = 10;
}
internal class CuiBuilderSettings
{
[JsonProperty(En ? "Menu color" : "Цвет менюшки")]
public string MenuColor = "#535151";
[JsonProperty(En ? "Text color" : "Цвет текста")]
public string TextColor = "#beb5ac";
[JsonProperty(En ? "The number of pits displayed when using the /skinentity command" : "Количество ячек отображаемое при использования команды /skinentity")]
public byte EntityMenuCellsCount = 24;
[JsonProperty(En ? "The number of pits displayed when using the /skin command" : "Количество ячек отображаемое при использования команды /skin")]
public byte StandartMenuCellsCount = 24;
}
public CuiBuilderSettings MenuSettings = new CuiBuilderSettings();
[JsonProperty(En ? "Menu commands open" : "Команды открывающие менюшку")]
public List<string> MenuCommandsOpen = new List<string>();
[JsonProperty(En ? "Entity Menu commands open" : "Команды для открытия скинов при наведении на предмет")]
public List<string> EntityMenuCommandsOpen = new List<string>();
[JsonProperty(En ? "Add a skin to the cfg automatically?(true = yes)" : "Добавить в кфг автоматически скин?(true = да)")]
public bool IsApproved = false;
// [JsonProperty(En ? "Vip permision" : "Пермиссион для вип игроков")]
// public string VipPerm = "skuliskins.vip";
[JsonProperty(En ? "Rights to use the skins system" : "Права для использование системы скинов.")]
public string canuse = "skuliskins.use";
[JsonProperty(En ? "Install the skin automatically on items where there is already a skin?(true = yes)" : "Устанавилвать скин автоматически на предметы где уже есть скин?(true = да)")]
public bool SkinAuto = false;
[JsonProperty(En ? "Rights to use default skins" : "Права для использование скинов по дефолту")]
public string canusedefault = "skuliskins.usedefault";
[JsonProperty(En ? "Setting up payment for opening" : "Настройка оплаты за открытие")]
public MarketSystem Market = new MarketSystem();
[JsonProperty(En ? "Items with these skins cannot be exchanged." : "Предметы с этими скинами нельзя будет поменять.")]
public List<ulong> blackList = new List<ulong>();
[JsonProperty(En ? "Rights to use unique skins" : "Права для использование уникальных скинов")]
public Dictionary<string, List<ulong>> useSkins = new Dictionary<string, List<ulong>>();
public static ConfigData GetNewConf()
{
var newConfig = new ConfigData
{
MenuCommandsOpen = new List<string>() { "skin" },
EntityMenuCommandsOpen = new List<string>() { "skinentity" },
useSkins = new Dictionary<string, List<ulong>>()
{
["skuliskins.prem"] = new List<ulong>()
{
2668297561,
2649480126,
2599664731,
}
},
blackList = new List<ulong>()
{
12341234,
}
};
return newConfig;
}
}
class ItemData
{
public class SkinInfo
{
[JsonProperty(En ? "Enabled skin?(true = yes)" : "Включить скин?(true = да)")]
public bool IsEnabled = true;
[JsonProperty(En ? "Is this skin from the developers of rust or take it in a workshop?" : "Этот скин есть от разработчиков раста или принять в воркшопе??(true = да)")]
public bool IsApproved = true;
[JsonProperty(En ? "Name skin" : "Название скина")]
public string MarketName = "Warhead LR300";
[JsonProperty(En ? "Url" : "Сыссылка")]
public string Url = "";
}
public Dictionary<ulong, SkinInfo> _skinInfos = new Dictionary<ulong, SkinInfo>();
}
protected override void LoadDefaultConfig()
{
cfg = ConfigData.GetNewConf();
}
protected override void SaveConfig()
{
Config.WriteObject(cfg);
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
cfg = Config.ReadObject<ConfigData>();
}
catch
{
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
#endregion
#region Interface
private static string Layer = "UiSkuliSkins";
private static string Overlay = "Overlay";
private static string Regular = "robotocondensed-regular.ttf";
// private static string Sharp = "assets/content/ui/ui.background.tile.psd";
private void LoadIzbranoeUI(BasePlayer player, string weapon, uint itemId, int page)
{
DataPlayer weapons;
if (!playersData.TryGetValue(player.userID, out weapons)) return;
CuiHelper.DestroyUi(player, Layer + "-Izbranoe");
var cont = new CuiElementContainer();
cont.Add(new CuiPanel()
{
Image =
{
Color = "0 0 0 0"
},
RectTransform =
{
AnchorMin = "0.5 0",
AnchorMax = "0.5 0",
OffsetMin = $"{201} {111}",
OffsetMax = $"{571} {231}"
}
}, Overlay, Layer + "-Izbranoe");
if (!weapons._izvSkins.ContainsKey(weapon)) return;
var tSkinsList = weapons._izvSkins[weapon];
foreach (var keyValuePair in cfg.useSkins.Where(keyValuePair => !permission.UserHasPermission(player.UserIDString, keyValuePair.Key)))
{
keyValuePair.Value.ForEach(p =>
{
if (tSkinsList.ContainsKey(p))
{
tSkinsList.Remove(p);
}
});
}
for (int i = 0; i < 12; i++)
{
if (tSkinsList.Count - 1 >= i)
{
cont.Add(new CuiElement()
{
Parent = Layer + "-Izbranoe",
Components =
{
new CuiRawImageComponent()
{
Png = GetImage("SKULISKINS1"+ weapon +"_" + tSkinsList.ToList()[i].Key)
},
new CuiRectTransformComponent()
{
AnchorMin =
$"0 0.5",
AnchorMax =
$"0 0.5",
OffsetMin =
$"{2 + i * 62 - Math.Floor((double) i / 6) * 6 * 62} {5 - Math.Floor((double) i / 6) * 62}",
OffsetMax =
$"{52 + i * 62 - Math.Floor((double) i / 6) * 6 * 62} {55 - Math.Floor((double) i / 6) * 62}"
}
}
});
cont.Add(new CuiButton()
{
Button = {
Color = "1 1 1 0",
Command = $"uiskinmenu setskin {itemId} {tSkinsList.ToList()[i].Key}"
},
Text =
{
Text = ""
},
RectTransform =
{
AnchorMin =
$"0 0.5",
AnchorMax =
$"0 0.5",
OffsetMin =
$"{2 + i * 62 - Math.Floor((double) i / 6) * 6 * 62} {5- Math.Floor((double) i / 6) * 62}",
OffsetMax =
$"{52 + i * 62 - Math.Floor((double) i / 6) * 6 * 62} {55 - Math.Floor((double) i / 6) * 62}"
}
}, Layer + "-Izbranoe", Layer + "-Izbranoe" + i);
cont.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "0 1",
AnchorMax = "0 1",
OffsetMin = $"{-5} {-10}",
OffsetMax = $"{10} {5}"
},
Button =
{
Command = $"uiskinmenu setizbranoe {weapon} {tSkinsList.ToList()[i].Key} {page} {itemId}",
Color = HexToRustFormat("#dead39"),
Sprite = "assets/icons/favourite_servers.png",
},
Text = { Text = "" }
}, Layer + "-Izbranoe" + i);
if (permission.UserHasPermission(player.UserIDString, cfg.canusedefault))
{
if (playersData.TryGetValue(player.userID, out weapons) && weapons._defaultSkins.ContainsKey(weapon) && weapons._defaultSkins[weapon].skinId == tSkinsList.ToList()[i].Key)
{
cont.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "1 0",
AnchorMax = "1 0",
OffsetMin = $"{-10} {0}",
OffsetMax = $"{0} {10}"
},
Button =
{
Command = $"uiskinmenu setdefault {weapon} {tSkinsList.ToList()[i].Key} {page} {itemId}",
Color = HexToRustFormat("#369f47"),
Sprite = "assets/icons/power.png",
},
Text = { Text = "" }
}, Layer + "-Izbranoe" + i);
}
else
{
cont.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "1 0",
AnchorMax = "1 0",
OffsetMin = $"{-10} {0}",
OffsetMax = $"{0} {10}"
},
Button =
{
Command = $"uiskinmenu setdefault {weapon} {tSkinsList.ToList()[i].Key} {page} {itemId}",
Color = HexToRustFormat("#fb4f3b"),
Sprite = "assets/icons/power.png",
},
Text = { Text = "" }
}, Layer + "-Izbranoe" + i);
}
}
}
}
CuiHelper.AddUi(player, cont);
}
private void LoadWearUI(BasePlayer player)
{
CuiHelper.DestroyUi(player, Layer + "-Wear");
DataPlayer dataPlayer;
if (this.playersData.TryGetValue(player.userID, out dataPlayer) && dataPlayer.Prefab != null) return;
var cont = new CuiElementContainer
{
{
new CuiPanel()
{
Image =
{
Color = "0 0 0 0"
},
RectTransform =
{
AnchorMin = "0.5 0",
AnchorMax = "0.5 0",
OffsetMin = $"{-588} {115}",
OffsetMax = $"{-215} {169}"
}
},
Overlay,
Layer + "-Wear"
}
};
for (int i = 0; i < player.inventory.containerWear.capacity; i++)
{
var item = player.inventory.containerWear.GetSlot(i);
if (item == null)
continue;
if (!cfg.blackList.Contains(item.skin) &&
_loadData.ContainsKey(item.info.shortname))
{
cont.Add(new CuiButton()
{
Button = {
Color = "0.65 0.65 0.65 0",
Command = $"uiskinmenu weaponSelect {item.info.shortname} {item.uid}"
},
Text =
{
Text = ""
},
RectTransform =
{
AnchorMin =
$"0 0",
AnchorMax =
$"0 0",
OffsetMin = $"{0 + i * 54 - Math.Floor((double) i / 7) * 7 * 54} {0}",
OffsetMax = $"{50 + i * 54 - Math.Floor((double) i / 7) * 7 * 54} {50}"
}
}, Layer + "-Wear");
}
}
CuiHelper.AddUi(player, cont);
}
private void LoadMainUI(BasePlayer player)
{
CuiHelper.DestroyUi(player, Layer + "-Main");
DataPlayer dataPlayer;
if (this.playersData.TryGetValue(player.userID, out dataPlayer) && dataPlayer.Prefab != null) return;
var cont = new CuiElementContainer();
cont.Add(new CuiPanel()
{
Image =
{
Color = "0 0 0 0"
},
RectTransform =
{
AnchorMin = $"{0.5} {0}",
AnchorMax = $"{0.5} {0}",
OffsetMin = $"{-200 } {85}",
OffsetMax = $"{180} {337}"
}
}, Overlay, Layer + "-Main");
for (int i = 0; i < player.inventory.containerMain.capacity; i++)
{
var item = player.inventory.containerMain.GetSlot(i);
if (item == null)
{
continue;
}
if (!cfg.blackList.Contains(item.skin) &&
_loadData.ContainsKey(item.info.shortname))
{
cont.Add(new CuiButton()
{
Button = {
Color = "0.65 0.65 0.65 0",
Command = $"uiskinmenu weaponSelect {item.info.shortname} {item.uid}"
},
Text =
{
Text = ""
},
RectTransform =
{
AnchorMin =
$"0 1",
AnchorMax =
$"0 1",
OffsetMin =
$"{0 + i * 64- Math.Floor((double) i / 6) * 6 * 64} {-60 - Math.Floor((double) i / 6) * 63}",
OffsetMax =
$"{60 + i * 64 - Math.Floor((double) i / 6) * 6 * 64} {0 - Math.Floor((double) i / 6) * 63}"
}
}, Layer + "-Main");
}
}
CuiHelper.AddUi(player, cont);
}
private void LoadBeltUI(BasePlayer player)
{
CuiHelper.DestroyUi(player, Layer + "-Belt");
DataPlayer dataPlayer;
if (this.playersData.TryGetValue(player.userID, out dataPlayer) && dataPlayer.Prefab != null) return;
var cont = new CuiElementContainer();
cont.Add(new CuiPanel()
{
Image =
{
Color = "0 0 0 0"
},
RectTransform =
{
AnchorMin = "0.5 0",
AnchorMax = "0.5 0",
OffsetMin = $"{-200} {17}",
OffsetMax = $"{180} {79}"
}
}, Overlay, Layer + "-Belt");
for (int i = 0; i < 6; i++)
{
var item = player.inventory.containerBelt.GetSlot(i);
if (item == null)
continue;
if (!cfg.blackList.Contains(item.skin) &&
_loadData.ContainsKey(item.info.shortname))
{
cont.Add(new CuiButton()
{
Button =
{
Color = "0.65 0.65 0.65 0",
Command = $"uiskinmenu weaponSelect {item.info.shortname} {item.uid}"
},
Text =
{
Text = ""
},
RectTransform =
{
AnchorMin =
$"0 0",
AnchorMax =
$"0 0",
OffsetMin = $"{0 + i * 64 - Math.Floor((double) i / 6) * 6 * 64} {0}",
OffsetMax = $"{60+ i * 64 - Math.Floor((double) i / 6) * 6 * 64} {60}"
}
}, Layer + "-Belt");
}
}
CuiHelper.AddUi(player, cont);
}
[ConsoleCommand("uiskinmenu")]
void ConsoleCommand(ConsoleSystem.Arg arg)
{
var player = arg.Player();
if (player == null) return;
Effect Sound1 = new Effect("assets/bundled/prefabs/fx/notice/loot.drag.grab.fx.prefab", player, 0, new Vector3(), new Vector3());
string weapon;
ulong skinId;
int page;
int itemId;
DataPlayer playerData;
switch (arg.Args[0])
{
case "page":
EffectNetwork.Send(Sound1, player.Connection);
LoadSkinsUI(player, arg.Args[1], arg.Args[2].ToInt(), uint.Parse(arg.Args[3]));
LoadIzbranoeUI(player, arg.Args[1], uint.Parse(arg.Args[3]), arg.Args[2].ToInt());
break;
case "weaponSelect":
EffectNetwork.Send(Sound1, player.Connection);
LoadSkinsUI(player, arg.Args[1], 1, uint.Parse(arg.Args[2]));
LoadIzbranoeUI(player, arg.Args[1], uint.Parse(arg.Args[2]), 1);
break;
case "setizbranoe":
EffectNetwork.Send(Sound1, player.Connection);
if (!this.playersData.TryGetValue(player.userID, out playerData)) return;
weapon = arg.Args[1];
skinId = ulong.Parse(arg.Args[2]);
page = arg.Args[3].ToInt();
itemId = arg.Args[4].ToInt();
if (playerData._izvSkins.ContainsKey(weapon) && playerData._izvSkins[weapon].ContainsKey(skinId))
{
playerData._izvSkins[weapon].Remove(skinId);
}
else if (playerData._izvSkins.ContainsKey(weapon))
{
playerData._izvSkins[weapon].Add(skinId, _loadData[weapon][skinId]);
}
else
{
playerData._izvSkins.Add(weapon, new Dictionary<ulong, ItemData.SkinInfo>()
{
[skinId] = _loadData[weapon][skinId]
});
}
LoadSkinsUI(player, weapon, page, (uint)itemId);
LoadIzbranoeUI(player, weapon, (uint)itemId, page);
break;
case "setdefault":
EffectNetwork.Send(Sound1, player.Connection);
if (!this.playersData.TryGetValue(player.userID, out playerData)) return;
weapon = arg.Args[1];
skinId = ulong.Parse(arg.Args[2]);
page = arg.Args[3].ToInt();
itemId = arg.Args[4].ToInt();
if (playerData._defaultSkins.ContainsKey(weapon) && playerData._defaultSkins[weapon].skinId == skinId)
{
playerData._defaultSkins.Remove(weapon);
}
else if (playerData._defaultSkins.ContainsKey(weapon))
{
playerData._defaultSkins[weapon].skinId = skinId;
playerData._defaultSkins[weapon].SkinInfo = _loadData[weapon][skinId];
}
else
{
playerData._defaultSkins.Add(weapon, new DefaultSkins()
{
skinId = skinId,
SkinInfo = _loadData[weapon][skinId]
});
}
LoadSkinsUI(player, weapon, page, (uint)itemId);
LoadIzbranoeUI(player, weapon, (uint)itemId, page);
break;
case "setskin":
skinId = ulong.Parse(arg.Args[2]);
EffectNetwork.Send(Sound1, player.Connection);
if (cfg.Market.IsEnabled && !permission.UserHasPermission(player.UserIDString, cfg.canuse))
{
if (ChangeSkin(player) == false)
{
return;
}
}
if (!this.playersData.TryGetValue(player.userID, out playerData)) return;
if (playerData.Prefab == null)
{
var uid = arg.Args[1];
var item = player.inventory.FindItemUID(uint.Parse(uid));
item.skin = skinId;
var hend = item.GetHeldEntity();
if (hend != null)
{
hend.skinID = skinId;
hend.SendNetworkUpdate();
}
item.MarkDirty();
player.SendNetworkUpdate();
}
else
{
DefaultSkins skinData;
if (playerData.Prefab is BaseVehicle)
{
var vehicle = playerData.Prefab as BaseVehicle;
var shortname = vehicle.ShortPrefabName;
if (!playerData._defaultSkins.TryGetValue(shortname, out skinData)) return;
if (skinId == vehicle.skinID || skinId == 0) return;
BaseVehicle transport = GameManager.server.CreateEntity($"assets/content/vehicles/snowmobiles/{shortname}.prefab", vehicle.transform.position, vehicle.transform.rotation) as BaseVehicle;
transport.health = vehicle.health;
transport.skinID = skinId;
vehicle.Kill();
transport.Spawn();
Effect.server.Run("assets/prefabs/deployable/repair bench/effects/skinchange_spraypaint.prefab", transport.transform.localPosition);
}
else if (playerData.Prefab.OwnerID == player.userID || player.currentTeam != 0 && player.Team.members.Contains(playerData.Prefab.OwnerID))
{
if (shortnamesEntity.ContainsKey(playerData.Prefab.ShortPrefabName))
{
if (skinId == playerData.Prefab.skinID || skinId == 0) return;
playerData.Prefab.skinID = skinId;
playerData.Prefab.SendNetworkUpdate();
Effect.server.Run("assets/prefabs/deployable/repair bench/effects/skinchange_spraypaint.prefab", playerData.Prefab.transform.localPosition);
}
}
}
break;
case "":
break;
case "close":
if (this.playersData.TryGetValue(player.userID, out playerData))
playerData.Prefab = null;
CuiHelper.DestroyUi(player, Layer);
CuiHelper.DestroyUi(player, Layer + "-Wear");
CuiHelper.DestroyUi(player, Layer + "-Main");
CuiHelper.DestroyUi(player, Layer + "-Belt");
CuiHelper.DestroyUi(player, Layer + "-Izbranoe");
CuiHelper.DestroyUi(player, Layer + "-Search");
CuiHelper.DestroyUi(player, Layer + "-LableIzb");
openSkins.Remove(player.userID);
EffectNetwork.Send(Sound1, player.Connection);
player.EndLooting();
break;
}
}
private void LoadSkinsUI(BasePlayer player, string weapon, int page, uint itemId)
{
if (!_loadData.ContainsKey(weapon)) return;
DataPlayer dataPlayer;
if (!playersData.TryGetValue(player.userID, out dataPlayer)) return;
bool havePrefab = dataPlayer.Prefab == null;
int skinsCount = havePrefab ?
cfg.MenuSettings.StandartMenuCellsCount :
cfg.MenuSettings.EntityMenuCellsCount;
int pageXCount = havePrefab ? skinsCount / 3 : 4;
int pageYCount = havePrefab ? 3 : skinsCount / 4;
CuiHelper.DestroyUi(player, Layer + "-Search");
var container = new CuiElementContainer
{
{
new CuiPanel()
{
Image =
{
ImageType = Image.Type.Filled,
Png = "assets/standard assets/effects/imageeffects/textures/noise.png",
//Sprite = Sharp,
Color = HexToRustFormat($"#535151{(havePrefab ? "2C" : "00")}"),//
Material = "assets/icons/greyout.mat"
},
RectTransform =
{
AnchorMin = "0.5 0.5",
AnchorMax = "0.5 0.5",
OffsetMin = $"{-400} {-185}",
OffsetMax = $"{-400 + 90 * pageXCount} {115}"
}
},
Layer,
Layer + "-Search"
},
{
new CuiPanel()
{
Image =
{
ImageType = Image.Type.Filled,
Png = "assets/standard assets/effects/imageeffects/textures/noise.png",
// Sprite = Sharp,
Color = HexToRustFormat("#5351512C"),
Material = "assets/icons/greyout.mat"
},
RectTransform =
{
AnchorMin = "1 0.5",
AnchorMax = $"{1} 0.5",// + float.Parse($"0.{skinsCount}") / 2
OffsetMin = $"{15} 0", // * (skinsCount == 12 ? 8 : 4) + 90 * pageCount + 20} {-150}
OffsetMax = $"{15} 0" // + 90 * pageCount + 20} {150}
}
},
Layer + "-Search",
Layer + "-Page"
}
};
if (0 < _loadData[weapon].Count - skinsCount * page)
{
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "0.5 0.5",
AnchorMax = "0.5 0.5",
OffsetMin = $"{-10} {5}",
OffsetMax = $"{10} {143}"
},
Button =
{
Command = $"uiskinmenu page {weapon} {page + 1} {itemId}",
Color = HexToRustFormat("#5c80ba")
},
Text =
{
Text = "»", Align = TextAnchor.MiddleCenter,
FontSize = (int) (20 )
}
}, Layer + "-Page");
}
else
{
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "0.5 0.5",
AnchorMax = "0.5 0.5",
OffsetMin = $"{-10} {5}",
OffsetMax = $"{10} {143}"
},
Button =
{
Command = $"",
Color = HexToRustFormat("#5c80bac3")
},
Text =
{
Text = "»", Align = TextAnchor.MiddleCenter,
FontSize = (int) (20),
Color = "0.65 0.65 0.65 0.65"
}
}, Layer + "-Page");
}
if (page > 1)
{
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "0.5 0.5",
AnchorMax = "0.5 0.5",
OffsetMin = $"{-10} {-137}",
OffsetMax = $"{10} {-5}"
},
Button =
{
Command = $"uiskinmenu page {weapon} {page - 1} {itemId}",
Color = HexToRustFormat("#5c80ba")
},
Text =
{
Text = "«", Align = TextAnchor.MiddleCenter, FontSize = (int) (20 )
}
}, Layer + "-Page");
}
else
{
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "0.5 0.5",
AnchorMax = "0.5 0.5",
OffsetMin = $"{-10} {-137}",
OffsetMax = $"{10} {-5}"
},
Button =
{
Command = $"",
Color = HexToRustFormat("#5c80bac3")
},
Text =
{
Text = "«", Align = TextAnchor.MiddleCenter, FontSize = (int) (20 ),
Color = "0.65 0.65 0.65 0.65"
}
}, Layer + "-Page");
}
//CuiHelper.AddUi(player, container);
//return;
var tSkinsList = _loadData[weapon].ToDictionary(keyValuePair => keyValuePair.Key, keyValuePair => keyValuePair.Value);
if (cfg.useSkins.Count >= 1)
foreach (var keyValuePair in cfg.useSkins.Where(keyValuePair =>
!permission.UserHasPermission(player.UserIDString, keyValuePair.Key)))
{
keyValuePair.Value.ForEach(p =>
{
if (tSkinsList.ContainsKey(p))
{
tSkinsList.Remove(p);
}
});
}
foreach (var skinItem in tSkinsList.Where(p => p.Value.IsEnabled).Select((i, t) => new { A = i, B = t - (page - 1) * skinsCount }).//
Skip((page - 1) * skinsCount).//skinsCount
Take(skinsCount)) //skinsCount
{
container.Add(new CuiElement()
{
Parent = Layer + "-Search",
Name = Layer + "-Search" + ".Player" + skinItem.B,
Components =
{
new CuiImageComponent()
{
Color = "0.35 0.35 0.35 0.65"
},
new CuiRectTransformComponent
{
AnchorMin = $"0 0.5",
AnchorMax = $"0 0.5",
OffsetMin = $"{4 + skinItem.B * 90 - Math.Floor((double) skinItem.B / pageXCount) * pageXCount * 90} {60 - Math.Floor((double) skinItem.B / pageXCount) * 98}",
OffsetMax = $"{90 + skinItem.B * 90 - Math.Floor((double) skinItem.B / pageXCount) * pageXCount * 90} {143 - Math.Floor((double) skinItem.B / pageXCount) * 98}"
}
}
});
container.Add(new CuiElement()
{
Parent = Layer + "-Search" + ".Player" + skinItem.B,
Components =
{
new CuiRawImageComponent()
{
Png = GetImage("SKULISKINS1"+ weapon +"_" + skinItem.A.Key)
},
new CuiRectTransformComponent()
{
AnchorMin = "0.5 0.5",
AnchorMax = "0.5 0.5",
OffsetMin = $"{-30} {-30}",
OffsetMax = $"{30} {30}"
}
}
});
container.Add(new CuiElement()
{
Parent = Layer + "-Search" + ".Player" + skinItem.B,
Components =
{
new CuiTextComponent()
{
Text = skinItem.A.Value.MarketName, Align = TextAnchor.MiddleCenter,
Font = Regular,
FontSize = 9
},
new CuiRectTransformComponent()
{
AnchorMin = "0.5 0",
AnchorMax = "0.5 0",
OffsetMin = $"{-40} {-15}",
OffsetMax = $"{40} {0}"
}
}
});
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "0.5 0.5",
AnchorMax = "0.5 0.5",
OffsetMin = $"{-30} {-30}",
OffsetMax = $"{30} {30}"
},
Button =
{
Command = $"uiskinmenu setskin {itemId} {skinItem.A.Key}",
Color = "0 0 0 0"
},
Text = { Text = "" }
}, Layer + "-Search" + ".Player" + skinItem.B);
if (dataPlayer._izvSkins.ContainsKey(weapon) &&
dataPlayer._izvSkins[weapon].ContainsKey(skinItem.A.Key))
{
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "0 1",
AnchorMax = "0 1",
OffsetMin = $"{1} {-18}",
OffsetMax = $"{18} {-1}"
},
Button =
{
Command = $"uiskinmenu setizbranoe {weapon} {skinItem.A.Key} {page} {itemId}",
Color = HexToRustFormat("#dead39"),
Sprite = "assets/icons/favourite_servers.png",
},
Text = { Text = "" }
}, Layer + "-Search" + ".Player" + skinItem.B);
}
else
{
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "0 1",
AnchorMax = "0 1",
OffsetMin = $"{1} {-18}",
OffsetMax = $"{18} {-1}"
},
Button =
{
Command = $"uiskinmenu setizbranoe {weapon} {skinItem.A.Key} {page} {itemId}",
Color = "1 1 1 1",
Sprite = "assets/icons/favourite_servers.png",
},
Text = { Text = "" }
}, Layer + "-Search" + ".Player" + skinItem.B);
}
if (permission.UserHasPermission(player.UserIDString, cfg.canusedefault))
{
if (playersData.TryGetValue(player.userID, out dataPlayer) && dataPlayer._defaultSkins.ContainsKey(weapon) && dataPlayer._defaultSkins[weapon].skinId == skinItem.A.Key)
{
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "1 1",
AnchorMax = "1 1",
OffsetMin = $"{-16} {-16}",
OffsetMax = $"{-5} {-5}"
},
Button =
{
Command = $"uiskinmenu setdefault {weapon} {skinItem.A.Key} {page} {itemId}",
Color = HexToRustFormat("#369f47"),
Sprite = "assets/icons/power.png",
},
Text = { Text = "" }
}, Layer + "-Search" + ".Player" + skinItem.B);
}
else
{
container.Add(new CuiButton()
{
RectTransform =
{
AnchorMin = "1 1",
AnchorMax = "1 1",
OffsetMin = $"{-16} {-16}",
OffsetMax = $"{-5} {-5}"
},
Button =
{
Command = $"uiskinmenu setdefault {weapon} {skinItem.A.Key} {page} {itemId}",
Color = HexToRustFormat("#fb4f3b"),
Sprite = "assets/icons/power.png",
},
Text = { Text = "" }
}, Layer + "-Search" + ".Player" + skinItem.B);
}
}
}
CuiHelper.AddUi(player, container);
}
#endregion
#region Hooks
bool ChangeSkin(BasePlayer player)
{
if (player == null || player.IsDead()) return false;
if (cfg.Market.costChange <= 0) return true;
switch (cfg.Market.WhoMarket)
{
case "Scrap":
{
var scrap = player.inventory.AllItems().FirstOrDefault(p =>
p.info.shortname == "scrap" && p.skin == 0 && p.amount >= cfg.Market.costChange);
if (scrap == null)
{
SendReply(player, lang.GetMessage("NEEDMORESCRAP", this, player.UserIDString));
return false;
}
if (scrap.amount == cfg.Market.costChange)
{
scrap.RemoveFromContainer();
scrap.RemoveFromWorld();
}
else
{
scrap.amount = (int)(scrap.amount - cfg.Market.costChange);
scrap.MarkDirty();
}
return true;
}
case "ServerRewards":
{
var checkPoint = ServerRewards?.Call("CheckPoints", player.userID);
if (checkPoint == null)
{
return false;
}
if ((int)checkPoint < cfg.Market.costChange)
{
SendReply(player, lang.GetMessage("NEEDMOREMONEY", this, player.UserIDString));
return false;
}
else
{
ServerRewards?.Call("TakePoints", player.userID, cfg.Market.costChange);
}
return true;
}
case "Economics":
{
double checkPoint = (double)Economics?.Call("Balance", player.userID);
if (checkPoint <= 0)
{
return false;
}
if (checkPoint < cfg.Market.costChange)
{
SendReply(player, lang.GetMessage("NEEDMOREMONEY", this, player.UserIDString));
return false;
}
else
{
Economics?.Call("Withdraw", player.userID, cfg.Market.costChange);
}
return true;
}
default:
return false;
}
}
bool OpenPay(BasePlayer player)
{
if (player == null || player.IsDead()) return false;
if (cfg.Market.costOpen <= 0) return true;
switch (cfg.Market.WhoMarket)
{
case "Scrap":
{
var scrap = player.inventory.AllItems().FirstOrDefault(p =>
p.info.shortname == "scrap" && p.skin == 0 && p.amount >= cfg.Market.costOpen);
if (scrap == null)
{
SendReply(player, lang.GetMessage("NEEDMORESCRAP", this, player.UserIDString));
return false;
}
if (scrap.amount == cfg.Market.costOpen)
{
scrap.RemoveFromContainer();
scrap.RemoveFromWorld();
}
else
{
scrap.amount = (int)(scrap.amount - cfg.Market.costOpen);
scrap.MarkDirty();
}
return true;
}
case "ServerRewards":
{
var checkPoint = ServerRewards?.Call("CheckPoints", player.userID);
if (checkPoint == null)
{
return false;
}
if ((int)checkPoint < cfg.Market.costOpen)
{
// ... [Code preview truncated due to length. Full source in attached file] ...