C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using UnityEngine;
using Oxide.Core;
using System.Collections.Generic;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Plugins;
using ConVar;
using Oxide.Core.Libraries.Covalence;
using Newtonsoft.Json;
using System.Linq;
using System;
namespace Oxide.Plugins {
[Info("XLevels", "MONSTER", "1.1.12")]
class XLevels : RustPlugin {
private void Message(BasePlayer player, string Messages) {
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiLabel {
FadeOut = 0.5f, RectTransform = {
AnchorMin = "1 0", AnchorMax = "1 0", OffsetMin = "-250 0", OffsetMax = "-200 26"
}
, Text = {
FadeIn = 0.5f, Text = $"{Messages}", Align = TextAnchor.MiddleRight, Font = "robotocondensed-regular.ttf", FontSize = 13, Color = "1 1 1 0.4"
}
}
, ".GUIProgress", ".Message", ".Message");
CuiHelper.AddUi(player, container);
timer.Once(2.5f, () => {
CuiHelper.DestroyUi(player, ".Message");
}
);
}
private void OnPluginUnloaded(Plugin name) {
if(name.Title == "Better Chat" && config.Setting.ChatPrefix) Subscribe(nameof(OnPlayerChat));
}
private void OnPluginLoaded(Plugin name) {
if(name.Title == "Better Chat") Unsubscribe(nameof(OnPlayerChat));
}
[ConsoleCommand("level")]
private void ccmdOpenMenu(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
Effect x = new Effect("assets/bundled/prefabs/fx/notice/loot.drag.grab.fx.prefab", player, 0, new Vector3(), new Vector3());
switch (arg.Args[0].ToLower()) {
case "page_lvl" : {
int Page = int.Parse(arg.Args[2]);
switch (arg.Args[1]) {
case "next" : {
RewardMenu(player, Page + 1);
break;
}
case "back" : {
RewardMenu(player, Page - 1);
break;
}
}
break;
}
case "page_inv" : {
int Page = int.Parse(arg.Args[2]);
switch (arg.Args[1]) {
case "next" : {
InventoryRewardMenu(player, Page + 1);
break;
}
case "back" : {
InventoryRewardMenu(player, Page - 1);
break;
}
}
break;
}
case "exchangeinfo" : {
if(!config.Setting.CouponsValide) return;
ExchangeInfo(player);
break;
}
case "exchange" : {
if(!config.Setting.CouponsValide) return;
CouponExchange(player, int.Parse(arg.Args[1]));
break;
}
case "info" : {
Info(player);
break;
}
case "inventory" : {
InventoryRewardMenu(player);
break;
}
case "top" : {
if(permission.UserHasPermission(player.UserIDString, permTop)) Top(player);
break;
}
}
EffectNetwork.Send(x, player.Connection);
}
private void OnLootEntityEnd(BasePlayer player, NPCVendingMachine machine) {
if(config.Vending.VendingUse) {
CuiHelper.DestroyUi(player, ".Level_Overlay");
CuiHelper.DestroyUi(player, ".Button");
}
}
[ConsoleCommand("x_levels")]
private void ccmdMenuOpen(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
GUIOpen(player);
}
private void RewardMenuFon(BasePlayer player) {
CuiElementContainer container = new CuiElementContainer();
bool couponsvalide = config.Setting.CouponsValide;
bool vipvalide = config.Setting.VIPValide;
var colorO = config.GUI.ColorBackgroundO;
var colorT = config.GUI.ColorBackgroundT;
container.Add(new CuiPanel {
CursorEnabled = true, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-532.5 -140", OffsetMax = "532.5 150"
}
, Image = {
Color = colorO, Material = "assets/icons/greyout.mat"
}
}
, "Overlay", ".Level_Overlay", ".Level_Overlay");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 5", OffsetMax = "-5 -5"
}
, Image = {
Color = colorT
}
}
, ".Level_Overlay", ".LevelO_Overlay");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-532.5 -105", OffsetMax = "532.5 -100"
}
, Image = {
Color = colorO, Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".LevelO_Overlay");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = vipvalide ? "-132.5 -140" : "-327.5 -140", OffsetMax = vipvalide ? "-127.5 -105" : "-322.5 -105"
}
, Image = {
Color = colorO, Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".LevelO_Overlay");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "327.5 -140", OffsetMax = "332.5 -105"
}
, Image = {
Color = colorO, Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".LevelO_Overlay");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "5 5", OffsetMax = "195 30"
}
, Button = {
Color = "0.35 0.45 0.25 1", Command = "level inventory"
}
, Text = {
Text = lang.GetMessage("OPENINV", this, player.UserIDString), Align = TextAnchor.MiddleCenter, FontSize = 16, Font = "robotocondensed-regular.ttf", Color = "0.75 0.95 0.41 1"
}
}
, ".LevelO_Overlay");
bool permvip = permission.UserHasPermission(player.UserIDString, permVip);
bool permtop = permission.UserHasPermission(player.UserIDString, permTop);
if(vipvalide) if(permvip) container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "200 5", OffsetMax = "390 30"
}
, Button = {
Color = "0.35 0.45 0.25 1"
}
, Text = {
Text = lang.GetMessage("VIPYES", this, player.UserIDString), Align = TextAnchor.MiddleCenter, FontSize = 16, Font = "robotocondensed-regular.ttf", Color = "0.75 0.95 0.41 1"
}
}
, ".LevelO_Overlay");
else container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "200 5", OffsetMax = "390 30"
}
, Button = {
Color = "0.65 0.29 0.24 1"
}
, Text = {
Text = lang.GetMessage("VIPNO", this, player.UserIDString), Align = TextAnchor.MiddleCenter, FontSize = 16, Font = "robotocondensed-regular.ttf", Color = "0.92 0.79 0.76 1"
}
}
, ".LevelO_Overlay");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-375 150", OffsetMax = "375 210"
}
, Image = {
Color = colorO, Material = "assets/icons/greyout.mat"
}
}
, ".Level_Overlay", ".Title");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 5", OffsetMax = "-5 -5"
}
, Image = {
Color = colorT
}
}
, ".Title", ".T_Title");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-365 -20", OffsetMax = "-325 20"
}
, Button = {
Color = "1 1 1 0.75", Sprite = "assets/icons/warning.png", Command = "level info"
}
, Text = {
Text = ""
}
}
, ".T_Title");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-320 -25", OffsetMax = "-315 25"
}
, Image = {
Color = colorO, Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".T_Title");
if(couponsvalide) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-310 -20", OffsetMax = "-270 20"
}
, Button = {
Color = "1 1 1 0.75", Sprite = "assets/icons/refresh.png", Command = "level exchangeinfo"
}
, Text = {
Text = ""
}
}
, ".T_Title");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-265 -25", OffsetMax = "-260 25"
}
, Image = {
Color = colorO, Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".T_Title");
}
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "325 -20", OffsetMax = "365 20"
}
, Button = {
Color = "1 1 1 0.75", Sprite = "assets/icons/close.png", Close = ".Level_Overlay"
}
, Text = {
Text = ""
}
}
, ".T_Title");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "315 -25", OffsetMax = "320 25"
}
, Image = {
Color = colorO, Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".T_Title");
if(permtop) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "270 -20", OffsetMax = "310 20"
}
, Button = {
Color = "1 1 1 0.75", Sprite = "assets/icons/community_servers.png", Command = "level top"
}
, Text = {
Text = ""
}
}
, ".T_Title");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "260 -25", OffsetMax = "265 25"
}
, Image = {
Color = colorO, Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".T_Title");
}
container.Add(new CuiLabel {
RectTransform = {
AnchorMin = "0.5 0", AnchorMax = "0.5 1", OffsetMin = couponsvalide ? "-260 0" : "-315 0", OffsetMax = permtop ? "260 0" : "315 0"
}
, Text = {
Text = lang.GetMessage("LevelTitle", this, player.UserIDString), Align = TextAnchor.MiddleCenter, FontSize = 18, Color = "1 1 1 0.75"
}
}
, ".T_Title");
CuiHelper.AddUi(player, container);
RewardMenu(player);
}
protected override void SaveConfig() => Config.WriteObject(config);
private void OnServerInitialized() {
PrintWarning("\n-----------------------------\n" + " Author - https://discord.gg/jPz48g7XXY\n" + " VK - https://discord.gg/jPz48g7XXY\n" + " Discord - https://discord.gg/jPz48g7XXY\n" + " \n" + "-----------------------------");
InitializeLang();
if(BetterChat || !config.Setting.ChatPrefix) Unsubscribe(nameof(OnPlayerChat));
foreach(var i in config.Award) {
var award = i.Value;
string imgName = award.Shortname + award.SkinID;
if(award.URLImage != String.Empty) ImageLibrary.Call("AddImage", award.URLImage, imgName + 151);
else if(award.SkinID != 0) ImageLibrary.Call("AddImage", $"http://api.skyplugins.ru/api/getskin/{award.SkinID}/{150}", imgName + 150);
else ImageLibrary.Call("AddImage", $"http://api.skyplugins.ru/api/getimage/{award.Shortname}/{150}", imgName + 150);
}
foreach(var i in config.AwardVip) {
var award = i.Value;
string imgName = award.Shortname + award.SkinID;
if(award.URLImage != String.Empty) ImageLibrary.Call("AddImage", award.URLImage, imgName + 151);
else if(award.SkinID != 0) ImageLibrary.Call("AddImage", $"http://api.skyplugins.ru/api/getskin/{award.SkinID}/{150}", imgName + 150);
else ImageLibrary.Call("AddImage", $"http://api.skyplugins.ru/api/getimage/{award.Shortname}/{150}", imgName + 150);
}
foreach(var i in config.Coupon) ImageLibrary.Call("AddImage", $"http://api.skyplugins.ru/api/getskin/{i.SkinID}/{150}", i.SkinID.ToString());
if(Interface.Oxide.DataFileSystem.ExistsDatafile("XDataSystem/XLevels/XLevels")) StoredData = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, XLevelsData>>("XDataSystem/XLevels/XLevels");
BasePlayer.activePlayerList.ToList().ForEach(OnPlayerConnected);
timer.Every(90, () => {
if(StoredData != null) Interface.Oxide.DataFileSystem.WriteObject("XDataSystem/XLevels/XLevels", StoredData);
BasePlayer.activePlayerList.ToList().ForEach(SaveData);
}
).Callback();
foreach(string command in config.Setting.CommandList) cmd.AddChatCommand(command, this, cmdMenuOpen);
permission.RegisterPermission(permVip, this);
permission.RegisterPermission(permTop, this);
foreach(var perm in config.XPRate.XPRatePermisssion) permission.RegisterPermission(perm.Key, this);
foreach(var perm in config.Online.Permisssion) permission.RegisterPermission(perm.Key, this);
if(config.Online.OnlineXP) timer.Every(config.Online.TimeXP, () => BasePlayer.activePlayerList.ToList().ForEach(OGiveXP));
}
private void Info(BasePlayer player) {
CuiHelper.DestroyUi(player, ".ExchangeInfo");
CuiHelper.DestroyUi(player, ".Top");
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
, Image = {
Color = "0.21 0.22 0.20 1", Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".LevelO_Overlay", ".Info", ".Info");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
, Button = {
Color = "0 0 0 0", Close = ".Info"
}
, Text = {
Text = ""
}
}
, ".Info");
container.Add(new CuiLabel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-225 -75", OffsetMax = "225 75"
}
, Text = {
Text = lang.GetMessage("Info", this, player.UserIDString), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 22, Color = "1 1 1 0.5"
}
}
, ".Info");
CuiHelper.AddUi(player, container);
}
private string API_GetPlayerPrefix(BasePlayer player) => GetPlayerPrefix(player.userID);
private object OnBetterChat(Dictionary<string, object> chat) {
IPlayer player = chat["Player"] as IPlayer;
string prefix = GetPlayerPrefix(Convert.ToUInt64(player.Id));
if(!config.Setting.ChatPrefix || String.IsNullOrEmpty(prefix)) return chat;
string name = $"{prefix} " + chat["Username"];
chat["Username"] = name;
return chat;
}
private class LevelConfig {
[JsonProperty(LanguageEnglish ? "Coupons for XP" : "Купоны на ХР")]
public List<Coupons> Coupon;
[JsonProperty(LanguageEnglish ? "VIP level reward" : "Вип награда за уровни")]
public Dictionary<int, Awards> AwardVip;
internal class OnlineSetting {
[JsonProperty(LanguageEnglish ? "Enable issuing XP to online players" : "Включить выдачу XP онлайн игрокам")]
public bool OnlineXP;
[JsonProperty(LanguageEnglish ? "XP issue interval (in sec.)" : "Интервал выдачи XP (в сек.)")]
public float TimeXP;
[JsonProperty(LanguageEnglish ? "Setting up permissions.[ Permission | XP ]" : "Настройка пермишенов.[ Пермишен | XP ]")]
public Dictionary<string, float> Permisssion;
}
[JsonProperty(LanguageEnglish ? "Issuing XP for online" : "Выдача XP за онлайн")]
public OnlineSetting Online = new OnlineSetting();
internal class GUISetting {
[JsonProperty("AnchorMin")]
public string AnchorMin;
[JsonProperty("AnchorMax")]
public string AnchorMax;
[JsonProperty("OffsetMin")]
public string OffsetMin;
[JsonProperty("OffsetMax")]
public string OffsetMax;
[JsonProperty(LanguageEnglish ? "Show mini-bar" : "Отображать мини-панель")]
public bool EnablePanel;
[JsonProperty(LanguageEnglish ? "Color background_1" : "Цвет фона_1")]
public string ColorBackgroundO = "";
[JsonProperty(LanguageEnglish ? "Color background_2" : "Цвет фона_2")]
public string ColorBackgroundT = "";
[JsonProperty(LanguageEnglish ? "Display reward container - [ True - Only when there is a reward in the level | False - Always ]" : "Отображать контейнер наград - [ True - Только когда есть награда на уровне | False - Всегда ]")]
public bool ContainerReward;
[JsonProperty(LanguageEnglish ? "Display required reward level" : "Отображать требуемый уровень наград")]
public bool RewardNumber;
[JsonProperty(LanguageEnglish ? "Display required VIP reward level" : "Отображать требуемый уровень ВИП наград")]
public bool RewardNumberVIP;
}
[JsonProperty(LanguageEnglish ? "XP multiplier" : "Множитель XP")]
public XPRateSetting XPRate = new XPRateSetting();
[JsonProperty(LanguageEnglish ? "Vendings settings" : "Настройки магазинов")]
public VendingSetting Vending = new VendingSetting();
internal class XPSetting {
[JsonProperty(LanguageEnglish ? "XP for the pickup of resources" : "ХР за подбор ресурсов")]
public Dictionary<string, float> PickupXP;
[JsonProperty(LanguageEnglish ? "XP for harvest" : "ХР за сбор урожая")]
public Dictionary<string, float> HarvestXP;
[JsonProperty(LanguageEnglish ? "XP for bonus resources" : "ХР за бонусную добычу")]
public Dictionary<string, float> GatherBonusXP;
[JsonProperty(LanguageEnglish ? "XP for kill / destroy barrel" : "ХР за убийство / разбитие бочек")]
public Dictionary<string, float> KillXP;
[JsonProperty(LanguageEnglish ? "XP for opening crates" : "ХР за открытие ящиков")]
public Dictionary<string, float> CrateXP;
}
[JsonProperty(LanguageEnglish ? "Settings levels" : "Настройка уровней")]
public LevelSetting Level = new LevelSetting();
internal class VendingSetting {
[JsonProperty(LanguageEnglish ? "Open the level menu.[ True - Immediately after the opening of the NPC shop | False - UI button ]" : "Открывать меню уровней.[ True - Сразу после открытия НПС магазина | False - Через UI кнопку ]")]
public bool VendingOpen;
[JsonProperty(LanguageEnglish ? "Access to the level menu is only through the NPC shops.[ True - NPC shop | False - Command ]" : "Доступ к меню уровней только через магазины НПС.[ True - Магазины НПС | False - Команда ]")]
public bool VendingUse;
[JsonProperty(LanguageEnglish ? "List of NPC shops in which you can open the level menu (shop name)" : "Список магазинов НПС в которых можно открыть меню уровней (Имя магазина)")]
public List<string> ListNPCVending;
}
internal class Coupons {
[JsonProperty(LanguageEnglish ? "Coupon name" : "Имя купона")]
public string Name;
[JsonProperty(LanguageEnglish ? "Coupon text" : "Текст купона")]
public string Text;
[JsonProperty(LanguageEnglish ? "Coupon skin" : "Скин купона")]
public ulong SkinID;
[JsonProperty(LanguageEnglish ? "XP amount" : "Кол-во ХР")]
public int XP;
[JsonProperty(LanguageEnglish ? "Setting the chance of falling out of crates/barrels" : "Настройка шанса выпадения из ящиков/бочек")]
public List<Crates> Crate;
public Coupons(string name, string text, ulong skinid, int xp, List<Crates> crates) {
Name = name;
Text = text;
SkinID = skinid;
XP = xp;
Crate = crates;
}
}
[JsonProperty(LanguageEnglish ? "General settings" : "Общие настройки")]
public GeneralSetting Setting = new GeneralSetting();
internal class GeneralSetting {
[JsonProperty(LanguageEnglish ? "List of commands to open the menu" : "Список команд для открытия меню")]
public List<string> CommandList;
[JsonProperty(LanguageEnglish ? "XP for the pickup of resources" : "Зачислять ХР за подбор ресурсов")]
public bool PickupValide;
[JsonProperty(LanguageEnglish ? "Display the level in prefix" : "Отображать уровень в префиксе")]
public bool ChatPrefixLevel;
[JsonProperty(LanguageEnglish ? "XP for opening crates" : "Зачислять ХР за открытие ящиков")]
public bool CrateValide;
[JsonProperty(LanguageEnglish ? "List of available ranks - [ Level - Rank ] ( If the list is empty, then the rank will not be displayed in the menu )" : "Список доступных рангов - [ Уровень - Ранг ] ( Если список пуст, то ранг не будет отображаться в меню )")]
public Dictionary<int, string> RankList;
[JsonProperty(LanguageEnglish ? "XP for kill" : "Зачислять ХР за убийство")]
public bool KillValide;
[JsonProperty(LanguageEnglish ? "Display the rank in prefix" : "Отображать ранг в префиксе")]
public bool ChatPrefixRank;
[JsonProperty(LanguageEnglish ? "Include messages of received rewards in chat" : "Включить сообщения полученных наград в чат")]
public bool ChatTakeMessages;
[JsonProperty(LanguageEnglish ? "Enable prefix in chat - [ Set to False if the prefix should be disabled or the prefix is used by a third party chat plugin ]" : "Включить префикс в чате - [ Установите False, если префикс нужно отключить или префикс используется сторонним плагином для чата ]")]
public bool ChatPrefix;
[JsonProperty(LanguageEnglish ? "There is a plugin for custom loot" : "Есть плагин на кастомный лут")]
public bool PluginCLoot;
[JsonProperty(LanguageEnglish ? "XP for harvest" : "Зачислять ХР за сбор урожая")]
public bool HarvestValide;
[JsonProperty(LanguageEnglish ? "Reset the level and XP of the player after reaching the maximum level - [ Players will re-open levels and receive rewards ]" : "Обнулять уровень и ХР игрока после достижения максимального уровня - [ Игроки повторно будет открывать уровни и получать награды ]")]
public bool ClearAll;
[JsonProperty(LanguageEnglish ? "Profile SteamID for custom avatar" : "SteamID профиля для кастомной аватарки")]
public ulong SteamID;
[JsonProperty(LanguageEnglish ? "Take VIP Reward - [ True - take only with permission | False - take at any time without permission ]" : "Забрать ВИП награду - [ True - забрать только с пермишеном | False - забрать в любое время без пермишена ]")]
public bool TakeReward;
[JsonProperty(LanguageEnglish ? "Get VIP reward - [ True - only with permission | False - without permission ]" : "Получить ВИП награду - [ True - только с пермишеном | False - без пермишена ]")]
public bool MoveReward;
[JsonProperty(LanguageEnglish ? "Enable VIP rewards" : "Включить ВИП награды")]
public bool VIPValide;
[JsonProperty(LanguageEnglish ? "XP for bonus resources" : "Зачислять ХР за бонусные ресурсы")]
public bool BonusValide;
[JsonProperty(LanguageEnglish ? "Include level up messages in chat" : "Включить сообщения повышения уровня в чат")]
public bool ChatLevelMessages;
[JsonProperty(LanguageEnglish ? "Exchange coupons if you have already reached the maximum level - [ Suitable for top players ]" : "Обменивать купоны если уже достигнут максимальный уровень - [ Подходит для топа игроков ]")]
public bool GiveXPCoupon;
[JsonProperty(LanguageEnglish ? "Add XP if the maximum level is already reached - [ Suitable for top players ]" : "Засчитывать ХР если уже достигнут максимальный уровень - [ Подходит для топа игроков ]")]
public bool GiveXP;
[JsonProperty(LanguageEnglish ? "Enable coupons" : "Включить купоны")]
public bool CouponsValide;
}
[JsonProperty(LanguageEnglish ? "XP settings | Shortname : ValueXP" : "Настройка ХР | Shortname : ValueXP")]
public XPSetting XP = new XPSetting();
[JsonProperty(LanguageEnglish ? "Level reward" : "Награда за уровни")]
public Dictionary<int, Awards> Award;
public static LevelConfig GetNewConfiguration() {
return new LevelConfig {
Setting = new GeneralSetting {
PickupValide = true, HarvestValide = true, BonusValide = true, KillValide = true, CrateValide = true, ChatTakeMessages = true, ChatLevelMessages = true, CouponsValide = true, VIPValide = true, MoveReward = true, TakeReward = true, GiveXP = false, GiveXPCoupon = false, ClearAll = false, PluginCLoot = false, SteamID = 0, CommandList = new List<string> {
"level", "lvl", "pass"
}
, ChatPrefix = true, ChatPrefixLevel = true, ChatPrefixRank = true, RankList = LanguageEnglish ? new Dictionary<int, string> {
[0]
= "CAP-Х", [1] = "IRON-1", [2] = "IRON-2", [3] = "IRON-3", [4] = "BRONZE-1", [5] = "BRONZE-2", [6] = "BRONZE-3", [7] = "SILVER-1", [8] = "SILVER-2", [9] = "SILVER-3", [10] = "GOLD-1", [11] = "GOLD-2", [12] = "GOLD-3", [13] = "PLATINUM-1", [14] = "PLATINUM-2", [15] = "PLATINUM-3", [16] = "DIAMOND-1", [17] = "DIAMOND-2", [18] = "DIAMOND-3", [19] = "IMMORTAL-1", [20] = "IMMORTAL-2", [21] = "IMMORTAL-3", [22] = "RADIANT-1", [23] = "RADIANT-2", [24] = "RADIANT-3", [25] = "GOD"
}
: new Dictionary<int, string> {
[0]
= "КЕПКА-Х", [1] = "ЖЕЛЕЗО-1", [2] = "ЖЕЛЕЗО-2", [3] = "ЖЕЛЕЗО-3", [4] = "БРОНЗА-1", [5] = "БРОНЗА-2", [6] = "БРОНЗА-3", [7] = "СЕРЕБРО-1", [8] = "СЕРЕБРО-2", [9] = "СЕРЕБРО-3", [10] = "ЗОЛОТО-1", [11] = "ЗОЛОТО-2", [12] = "ЗОЛОТО-3", [13] = "ПЛАТИНА-1", [14] = "ПЛАТИНА-2", [15] = "ПЛАТИНА-3", [16] = "АЛМАЗ-1", [17] = "АЛМАЗ-2", [18] = "АЛМАЗ-3", [19] = "БЕССМЕРТНЫЙ-1", [20] = "БЕССМЕРТНЫЙ-2", [21] = "БЕССМЕРТНЫЙ-3", [22] = "РАДИАНТ-1", [23] = "РАДИАНТ-2", [24] = "РАДИАНТ-3", [25] = "БОГ"
}
}
, Vending = new VendingSetting {
VendingOpen = false, VendingUse = false, ListNPCVending = new List<string> {
"Black Market"
}
}
, XPRate = new XPRateSetting {
XPRateCoupon = false, XPRatePermisssion = new Dictionary<string, float> {
["xlevels.125p"]
= 2.25f, ["xlevels.75p"] = 1.75f, ["xlevels.10p"] = 1.1f
}
}
, Online = new OnlineSetting {
OnlineXP = false, TimeXP = 15.0f, Permisssion = new Dictionary<string, float> {
["xlevels.default"]
= 5.0f
}
}
, GUI = new GUISetting {
AnchorMin = "1 0", AnchorMax = "1 0", OffsetMin = "-403 16", OffsetMax = "-210 42", EnablePanel = true, ColorBackgroundO = "0.51 0.52 0.50 0.95", ColorBackgroundT = "0.21 0.22 0.20 0.95", ContainerReward = false, RewardNumber = true, RewardNumberVIP = true
}
, Level = new LevelSetting {
LevelMax = 25, LevelXP = 100, LevelXPUP = 25
}
, XP = new XPSetting {
PickupXP = new Dictionary<string, float> {
["stones"]
= 10.0f, ["sulfur.ore"] = 15.0f, ["metal.ore"] = 12.5f
}
, HarvestXP = new Dictionary<string, float> {
["potato.entity"]
= 2.5f, ["corn.entity"] = 1.75f, ["hemp.emtity"] = 0.25f
}
, GatherBonusXP = new Dictionary<string, float> {
["stones"]
= 5.0f, ["sulfur.ore"] = 10.0f, ["metal.ore"] = 7.5f
}
, KillXP = new Dictionary<string, float> {
["boar"]
= 10.0f, ["loot-barrel-1"] = 7.5f, ["heavyscientist"] = 2.5f
}
, CrateXP = new Dictionary<string, float> {
["crate_normal"]
= 5.0f, ["crate_normal_2"] = 1.0f, ["crate_tools"] = 3.5f
}
}
, Coupon = LanguageEnglish ? new List<Coupons> {
new Coupons("Coupon 5ХР", "Coupon for 5ХР\n\nExchange them and get XP to level up!\n\nCommand for exchange - /level", 2925118427, 5, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 3)
}
), new Coupons("Coupon 10ХР", "Coupon for 10ХР\n\nExchange them and get XP to level up!\n\nCommand for exchange - /level", 2925118536, 10, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 3)
}
), new Coupons("Coupon 25ХР", "Coupon for 25ХР\n\nExchange them and get XP to level up!\n\nCommand for exchange - /level", 2925118910, 25, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 2)
}
), new Coupons("Coupon 50ХР", "Coupon for 50ХР\n\nExchange them and get XP to level up!\n\nCommand for exchange - /level", 2925119087, 50, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 2)
}
), new Coupons("Coupon 100ХР", "Coupon for 100ХР\n\nExchange them and get XP to level up!\n\nCommand for exchange - /level", 2925119157, 100, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 1)
}
), new Coupons("Coupon 200ХР", "Coupon for 200ХР\n\nExchange them and get XP to level up!\n\nCommand for exchange - /level", 2925119248, 200, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 1)
}
), new Coupons("Coupon 500ХР", "Coupon for 500ХР\n\nExchange them and get XP to level up!\n\nCommand for exchange - /level", 2925119644, 500, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 1)
}
)
}
: new List<Coupons> {
new Coupons("Купон 5ХР", "Купон на 5ХР\n\nОбменяйте его и получите ХР для повышения уровня!\n\nКоманда для обмена - /level", 2925118427, 5, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 3)
}
), new Coupons("Купон 10ХР", "Купон на 10ХР\n\nОбменяйте его и получите ХР для повышения уровня!\n\nКоманда для обмена - /level", 2925118536, 10, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 3)
}
), new Coupons("Купон 25ХР", "Купон на 25ХР\n\nОбменяйте его и получите ХР для повышения уровня!\n\nКоманда для обмена - /level", 2925118910, 25, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 2)
}
), new Coupons("Купон 50ХР", "Купон на 50ХР\n\nОбменяйте его и получите ХР для повышения уровня!\n\nКоманда для обмена - /level", 2925119087, 50, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 2)
}
), new Coupons("Купон 100ХР", "Купон на 100ХР\n\nОбменяйте его и получите ХР для повышения уровня!\n\nКоманда для обмена - /level", 2925119157, 100, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 1)
}
), new Coupons("Купон 200ХР", "Купон на 200ХР\n\nОбменяйте его и получите ХР для повышения уровня!\n\nКоманда для обмена - /level", 2925119248, 200, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 1)
}
), new Coupons("Купон 500ХР", "Купон на 500ХР\n\nОбменяйте его и получите ХР для повышения уровня!\n\nКоманда для обмена - /level", 2925119644, 500, new List<Crates> {
new Crates("crate_normal_2", 50.0f, 1, 1)
}
)
}
, Award = new Dictionary<int, Awards> {
[1]
= new Awards("wood", "Wood", 1250, 0, "", "", false), [2] = new Awards("charcoal", "Charcoal", 1500, 0, "", "", false), [3] = new Awards("metal.ore", "Metal ore", 1000, 0, "", "", false), [4] = new Awards("metal.fragments", "Metal fragments", 750, 0, "", "", false), [5] = new Awards("sulfur.ore", "Sulfur ore", 500, 0, "", "", false), [6] = new Awards("sulfur", "Sulfur", 300, 0, "", "", false), [7] = new Awards("gunpowder", "Gunpowder", 400, 0, "", "", false), [8] = new Awards("hq.metal.ore", "HQM ore", 25, 0, "", "", false), [9] = new Awards("metal.refined", "HQM", 20, 0, "", "", false), [10] = new Awards("scrap", "Scrap", 50, 0, "", "", false)
}
, AwardVip = new Dictionary<int, Awards> {
[1]
= new Awards("wood", "Wood", 1250, 0, "", "", false), [2] = new Awards("charcoal", "Charcoal", 1500, 0, "", "", false), [3] = new Awards("metal.ore", "Metal ore", 1000, 0, "", "", false), [4] = new Awards("metal.fragments", "Metal fragments", 750, 0, "", "", false), [5] = new Awards("sulfur.ore", "Sulfur ore", 500, 0, "", "", false), [6] = new Awards("sulfur", "Sulfur", 300, 0, "", "", false), [7] = new Awards("gunpowder", "Gunpowder", 400, 0, "", "", false), [8] = new Awards("hq.metal.ore", "HQM ore", 25, 0, "", "", false), [9] = new Awards("metal.refined", "HQM", 20, 0, "", "", false), [10] = new Awards("scrap", "Scrap", 50, 0, "", "", false)
}
}
;
}
internal class Crates {
[JsonProperty(LanguageEnglish ? "Name crate/barrel" : "Имя ящика/бочки")]
public string NameCrate;
[JsonProperty(LanguageEnglish ? "Drop chance" : "Шанс выпадения")]
public float ChanceDrop;
[JsonProperty(LanguageEnglish ? "Minimum amount of coupons" : "Минимальное количество купона")]
public int CouponMin;
[JsonProperty(LanguageEnglish ? "Maximum number of coupons" : "Максимальное количество купона")]
public int CouponMax;
public Crates(string namecrate, float chancedrop, int cmin, int cmax) {
NameCrate = namecrate;
ChanceDrop = chancedrop;
CouponMin = cmin;
CouponMax = cmax;
}
}
internal class LevelSetting {
[JsonProperty(LanguageEnglish ? "Maximum level" : "Максимальный уровень")]
public int LevelMax;
[JsonProperty(LanguageEnglish ? "Number of XP to upgrade one level" : "Кол-во ХР для повышения одного уровня")]
public float LevelXP;
[JsonProperty(LanguageEnglish ? "How much to increase the number of XP with each level" : "На сколько увеличивать кол-во ХР с каждым уровнем")]
public float LevelXPUP;
}
[JsonProperty(LanguageEnglish ? "Mini-bar location / Main menu settings" : "Расположение мини-панели / Настройки главного меню")]
public GUISetting GUI = new GUISetting();
internal class XPRateSetting {
[JsonProperty(LanguageEnglish ? "Enable XP multiplier when exchanging coupons - [ This parameter affects only the multipliers for the exchange of coupons ]" : "Включить множитель XP при обмене купонов - [ Данный параметр влияет только на множители для обмена купонов ]")]
public bool XPRateCoupon;
[JsonProperty(LanguageEnglish ? "Setting up permissions for XP multipliers for the exchange of coupons and other actions.[ Permission | XP multiplier ]" : "Настройка пермишенов для умножителей ХР на обмен купонов и других действий.[ Пермишен | Множитель XP ]")]
public Dictionary<string, float> XPRatePermisssion = new Dictionary<string, float>();
}
internal class Awards {
[JsonProperty(LanguageEnglish ? "Item shortname / custom reward name [ Must not be empty ]" : "Шортнейм предмета / имя кастомной награды [ Не должно быть пустым ]")]
public string Shortname;
[JsonProperty(LanguageEnglish ? "Reward display name" : "Отображаемое имя награды")]
public string Name;
[JsonProperty(LanguageEnglish ? "Item quantity" : "Количество предмета")]
public int Amount;
[JsonProperty(LanguageEnglish ? "Item skin" : "Скин предмета")]
public ulong SkinID;
[JsonProperty(LanguageEnglish ? "Command" : "Команда")]
public string Command;
[JsonProperty(LanguageEnglish ? "Link to custom image" : "Ссылка на кастомную картинку")]
public string URLImage;
[JsonProperty(LanguageEnglish ? "Hide reward - [ Reward will not be displayed until the player reaches this level ]" : "Скрыть награду - [ Награда не будет отображаться пока игрок не достигнет данного уровня ]")]
public bool Hide;
public Awards(string shortname, string name, int amount, ulong skinid, string command, string urlimage, bool hide) {
Shortname = shortname;
Name = name;
Amount = amount;
SkinID = skinid;
Command = command;
URLImage = urlimage;
Hide = hide;
}
}
}
private void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
if(!config.Setting.KillValide) return;
if(entity == null) return;
BasePlayer player = info?.InitiatorPlayer;
if(player == null || player.IsNpc) return;
if(config.XP.KillXP.ContainsKey(entity.ShortPrefabName)) XPRateRerm(player, config.XP.KillXP[entity.ShortPrefabName]);
}
private int API_GetLevel(BasePlayer player) => StoredData.ContainsKey(player.userID) ? StoredData[player.userID].Level : 0;
private int API_GetLevel(ulong userID) => StoredData.ContainsKey(userID) ? StoredData[userID].Level : 0;
private void RewardMenu(BasePlayer player, int Page = 0) {
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "0 142.5", OffsetMax = "0 0"
}
, Image = {
Color = "0 0 0 0"
}
}
, ".LevelO_Overlay", ".Pass", ".Pass");
int count = Page * 10;
int x = 0, g = 0, z = 0 + count, zvip = 0 + count;
var data = StoredData[player.userID];
bool vipvalide = config.Setting.VIPValide;
for(int i = 1 + count; i <= 10 + count; i++) {
bool icon = data.Level >= i, contains = config.Award.ContainsKey(i), containerreward = config.GUI.ContainerReward;
if(!containerreward || containerreward && contains) {
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"{-475 + (x * 95)} {(vipvalide ? -31.25 : -82.5)}", OffsetMax = $"{-380 + (x * 95)} {(vipvalide ? 63.75 : 12.5)}"
}
, Image = {
Color = "0 0 0 0"
}
}
, ".Pass", ".Award");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "2.5 2.5", OffsetMax = "-2.5 -2.5"
}
, Image = {
Color = "0.41 0.42 0.40 0.95", Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".Award", ".Awards");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "45 -10", OffsetMax = "-45 -92.5"
}
, Image = {
Color = "0.41 0.42 0.40 0.95", Material = "assets/content/ui/uibackgroundblur.mat"
}
}
, ".Award");
if(contains) {
var award = config.Award[i];
if(award.Hide && !icon) container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "7.5 7.5", OffsetMax = "-7.5 -7.5"
}
, Image = {
Color = "0.31 0.32 0.30 0.8", Sprite = "assets/icons/blunt.png"
}
,
}
, ".Awards");
else {
container.Add(new CuiElement {
Parent = ".Awards", Components = {
new CuiRawImageComponent {
Png = (string) ImageLibrary.Call("GetImage", award.Shortname + award.SkinID + (award.URLImage == String.Empty ? 150 : 151))
// ... [Code preview truncated due to length. Full source in attached file] ...