C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using UnityEngine;
using Random = UnityEngine.Random;
using System;
using Oxide.Core;
using Rust;
using Oxide.Core.Plugins;
using System.Collections;
using ru = Oxide.Game.Rust;
namespace Oxide.Plugins {
[Info("SkillRates", "fermens", "2.0.1")]
class SkillRates : RustPlugin {
const bool fermensEN = true;
// true - config in english | false - конфиг на русском
#region Images
[PluginReference]
private Plugin ImageLibrary, HaxBot, LootDefender;
public string GetImage(string shortname, ulong skin = 0) => (string)ImageLibrary.Call("GetImage", shortname, skin);
public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);
#endregion
#region Lang
private string GetLang(string key, string userid) {
return lang.GetMessage(key, this, userid);
}
#endregion
#region X2Rates
class modificator {
public float gather;
public float xp;
}
Dictionary<string, modificator> modificators = new Dictionary<string, modificator>();
void OnGroupPermissionGranted(string name, string perm) {
foreach (BasePlayer player in BasePlayer.allPlayerList) {
if (permission.UserHasGroup(player.UserIDString, name)) {
UPDATEMOD(player.UserIDString);
}
}
}
void OnGroupPermissionRevoked(string name, string perm) {
foreach (BasePlayer player in BasePlayer.allPlayerList) {
if (permission.UserHasGroup(player.UserIDString, name)) {
UPDATEMOD(player.UserIDString);
}
}
}
void OnUserGroupRemoved(string id, string groupName) {
NextTick(() => {
UPDATEMOD(id);
}
);
}
void OnUserGroupAdded(string id, string groupName) {
NextTick(() => {
UPDATEMOD(id);
}
);
}
void OnUserPermissionGranted(string id, string permName) {
UPDATEMOD(id);
TermLevelADD(id, permName);
}
void OnUserPermissionRevoked(string id, string permName) {
UPDATEMOD(id);
TermLevelRemove(id, permName);
}
private void TermLevelADD(string id, string permName) {
string perm = permName.ToLower();
if (!config.settings.Keys.Any(x => perm == "skillrates." + x)) return;
BasePlayer player = BasePlayer.FindByID(Convert.ToUInt64(id)) ?? BasePlayer.FindAwakeOrSleeping(id);
if(player == null) {
Debug.LogError($"[SkillRates] {id} player not found! <set max lvl>");
return;
}
string skill = perm.Replace("skillrates.", "");
SetMaxLvl(player, skill);
}
private void TermLevelRemove(string id, string permName) {
string perm = permName.ToLower();
if (!config.settings.Keys.Any(x => perm == "skillrates." + x)) return;
string skill = perm.Replace("skillrates.", "");
DelMaxLvl(id, skill);
}
#endregion
#region Cash
static string maxlevelstring;
class mod {
public float exp;
public Dictionary<MODIFICATOR, float> modificator;
}
Dictionary<int, mod> levels = new Dictionary<int, mod>();
enum SKILL {
miner, alchemist, woodcutter, hunter, marauder, technicist, jeweler, dustman, farmer
}
;
enum MODIFICATOR {
HQM, STONE, METAL, SULFUR, REMELTINGSPEED, REFINERYSPEED, WOOD, COALSHANCE, ANIMAL, ANIMALARMOR, ANIMALDAMAGE, NPC, NPCARMOR, NPCDAMAGE, MECH, MECHARMOR, MECHDAMAGE, AIR, LOCKEDCRATE, ELITE, BARREL, CRATE, GROWABLEVEGETABLES, GROWABLEBERRY
}
;
Dictionary<ulong, Dictionary<SKILL, mainskill>> players = new Dictionary<ulong, Dictionary<SKILL, mainskill>>();
class mainskill {
public float exp;
public int lvl;
public int lastlvl;
}
const string prefabstone = "stone";
const string prefabmetal = "metal";
const string prefabsulfur = "sulfur";
#endregion
#region Config
private PluginConfig config;
protected override void LoadDefaultConfig() {
config = new PluginConfig();
}
protected override void LoadConfig() {
base.LoadConfig();
config = Config.ReadObject<PluginConfig>();
}
protected override void SaveConfig() {
Config.WriteObject(config);
}
class INITLVLS {
[JsonProperty(fermensEN ? "Maximal lvl" : "Максимальный уровень")]
public int maxlevel;
[JsonProperty(fermensEN ? "Exp - 0 lvl" : "Опыт - 0 уровень")]
public float modificator_start;
[JsonProperty(fermensEN ? "Magnification" : "Увеличение")]
public float modificator_multiplication;
}
class EXPERIMENT {
[JsonProperty(fermensEN ? "Enable?" : "Включено?")]
public bool enable;
[JsonProperty(fermensEN ? "Amount crates" : "Количество ящиков")]
public int amount;
}
class setting2 {
[JsonProperty(fermensEN ? "First lvl" : "Первый уровень")]
public float first;
[JsonProperty(fermensEN ? "Last lvl" : "Последний уровень")]
public float last;
}
class setting {
[JsonProperty(fermensEN ? "Background" : "Фон")]
public string background;
[JsonProperty(fermensEN ? "Color - lvl" : "Цвет уровня")]
public string lvlcolor;
[JsonProperty(fermensEN ? "Color - progress, main" : "Цвет прогресса - Основной")]
public string mainbar;
[JsonProperty(fermensEN ? "Color - progress, background" : "Цвет прогресса - Фон")]
public string backbar;
[JsonProperty(fermensEN ? "Bonuses" : "Бонусы - настройка")]
public Dictionary<MODIFICATOR, setting2> mod;
[JsonProperty(fermensEN ? "Reward for reaching a certain level" : "Награда за достижение определенного уровня")]
public Dictionary<int, List<string>> reward;
}
class expelement {
[JsonProperty(fermensEN ? "Barrel" : "Бочка")]
public float barrel;
[JsonProperty(fermensEN ? "Regular box" : "Обычный ящик")]
public float crate;
[JsonProperty(fermensEN ? "Stone - mined" : "Камень - добытый")]
public float ore_stone;
[JsonProperty(fermensEN ? "Metal - mined" : "Метал - добытый")]
public float ore_metal;
[JsonProperty(fermensEN ? "Sulfur - mined" : "Сульфур - добытый")]
public float ore_sulfur;
[JsonProperty(fermensEN ? "Tree - downed" : "Дерево - поваленное")]
public float wood;
[JsonProperty(fermensEN ? "Helicopter - downed" : "Вертолет - сбитый")]
public float heli;
[JsonProperty(fermensEN ? "Stone - picked up" : "Камень - поднятый")]
public float grab_stone;
[JsonProperty(fermensEN ? "Metal - picked up" : "Метал - поднятый")]
public float grab_metal;
[JsonProperty(fermensEN ? "Sulfur - picked up" : "Сульфур - поднятый")]
public float grab_sulfur;
[JsonProperty(fermensEN ? "Wood - picked up" : "Дерево - поднятое")]
public float grab_wood;
[JsonProperty(fermensEN ? "Bradley - exploded" : "Танк - взорванный")]
public float tank;
[JsonProperty(fermensEN ? "Bradley - mining parts" : "Танк - добыча частей")]
public float tank_fleshed;
[JsonProperty(fermensEN ? "Helicopter - mining parts" : "Вертолет - добыча частей")]
public float heli_fleshed;
[JsonProperty(fermensEN ? "Helicopter - crate" : "Вертолет - ящик")]
public float heli_cont;
[JsonProperty(fermensEN ? "Bradley - crate" : "Танк - ящик")]
public float tank_cont;
[JsonProperty(fermensEN ? "Wolf - killed" : "Волк - убитый")]
public float wolf;
[JsonProperty(fermensEN ? "Boar - killed" : "Кабан - убитый")]
public float boar;
[JsonProperty(fermensEN ? "Horse - killed" : "Лошадь - убитая")]
public float horse;
[JsonProperty(fermensEN ? "Riding horse - killed" : "Верховая лошадь - убитая")]
public float ridablehorse;
[JsonProperty(fermensEN ? "Stag - killed" : "Олень - убитый")]
public float stag;
[JsonProperty(fermensEN ? "Chicken - killed" : "Курица - убитая")]
public float chicken;
[JsonProperty(fermensEN ? "Bear - killed" : "Медведь - убитый")]
public float bear;
[JsonProperty(fermensEN ? "Supply crate" : "Аир дроп")]
public float air;
[JsonProperty(fermensEN ? "Locked crate" : "Закрытый ящик")]
public float lockedcrate;
[JsonProperty(fermensEN ? "Elit crate" : "Элитный ящик")]
public float elite;
[JsonProperty(fermensEN ? "Wolf - fleshed" : "Волк - добытый")]
public float wolf_fleshed;
[JsonProperty(fermensEN ? "Horse - fleshed" : "Лошадь - добытая")]
public float horse_fleshed;
[JsonProperty(fermensEN ? "Boar - fleshed" : "Кабан - добытый")]
public float boar_fleshed;
[JsonProperty(fermensEN ? "Stag - fleshed" : "Олень - добытый")]
public float stag_fleshed;
[JsonProperty(fermensEN ? "Chicken - fleshed" : "Курица - добытая")]
public float chicken_fleshed;
[JsonProperty(fermensEN ? "Bear - fleshed" : "Медведь - добытый")]
public float bear_fleshed;
[JsonProperty(fermensEN ? "NPC - killed" : "Бот - убитый")]
public float npc;
[JsonProperty(fermensEN ? "NPC - looted" : "Бот - залутаный")]
public float npc_looted;
[JsonProperty(fermensEN ? "Vegetables - crop" : "Овощи - урожай")]
public float grow_vegetables;
[JsonProperty(fermensEN ? "Berry - harvest" : "Ягоды - урожай")]
public float grow_berrys;
[JsonProperty(fermensEN ? "Vegetables - planting" : "Овощи - посадка")]
public float planting_vegetables;
[JsonProperty(fermensEN ? "Berry - planting" : "Ягоды - посадка")]
public float planting_berrys;
}
class EXPBar {
[JsonProperty(fermensEN ? "Enable experience bar?" : "Включить полосу опыта?")]
public bool enable;
}
class UI {
public string anchor_min;
public string anchor_max;
public string offset_min;
public string offset_max;
public string fadein;
public string backgroundcolor;
}
private class PluginConfig {
public string chatcommand {
get;
set;
}
= "skill";
#region Exp bar
public EXPBar eXPBar {
get;
set;
}
= new EXPBar {
enable = true
}
;
#endregion
#region ui
[JsonProperty("UI")]
public UI uI {
get;
set;
}
= new UI {
fadein = "0.5", offset_min = "0 0", offset_max = "0 0", anchor_min = "0 0", anchor_max = "1 1", backgroundcolor = "0 0 0 0.9960784"
}
;
#endregion
#region lvl
[JsonProperty(fermensEN ? "Level generation" : "Генерация уровней")]
public INITLVLS lvl {
get;
set;
}
= new INITLVLS {
maxlevel = 100, modificator_start = 1f, modificator_multiplication = 1.05f
}
;
#endregion
#region carier
[JsonProperty(fermensEN ? "Quary rates - static" : "Рейты карьера - статика")]
public float carier {
get;
set;
}
= 5f;
#endregion
#region loottoheli
[JsonProperty(fermensEN ? "Additional boxes from helicopter and tank" : "Экспериментально - [доп ящики для вертолета с танка]")]
public EXPERIMENT loottoheli {
get;
set;
}
= new EXPERIMENT {
enable = true, amount = 2
}
;
#endregion
#region settings
[JsonProperty(fermensEN ? "Skills - setting" : "Навыки - настройка")]
public Dictionary<SKILL, setting> settings {
get;
set;
}
= new Dictionary<SKILL, setting> {
{
SKILL.miner, new setting {
lvlcolor = "0.73 0.87 0.745 1", mainbar = "0.21 0.42 0.26 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.STONE, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.METAL, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.HQM, new setting2 {
first = 10f, last = 20f
}
}
}
}
}
, {
SKILL.alchemist, new setting {
lvlcolor = "0.73 0.87 0.745 1", mainbar = "0.21 0.42 0.26 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.SULFUR, new setting2 {
first = 5f, last = 10f
}
}
, {
MODIFICATOR.REMELTINGSPEED, new setting2 {
first = 5f, last = 20f
}
}
}
}
}
, {
SKILL.woodcutter, new setting {
lvlcolor = "0.73 0.87 0.745 1", mainbar = "0.21 0.42 0.26 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.WOOD, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.COALSHANCE, new setting2 {
first = 0.75f, last = 1f
}
}
, {
MODIFICATOR.REFINERYSPEED, new setting2 {
first = 5f, last = 20f
}
}
}
}
}
, {
SKILL.hunter, new setting {
lvlcolor = "0.91 0.75 0.75 1", mainbar = "0.51 0.25 0.25 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.ANIMAL, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.ANIMALARMOR, new setting2 {
first = 0f, last = 0.25f
}
}
}
}
}
, {
SKILL.marauder, new setting {
lvlcolor = "0.91 0.75 0.75 1", mainbar = "0.51 0.25 0.25 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.NPC, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.NPCARMOR, new setting2 {
first = 0f, last = 0.1f
}
}
, {
MODIFICATOR.NPCDAMAGE, new setting2 {
first = 0f, last = 0.25f
}
}
}
}
}
, {
SKILL.technicist, new setting {
lvlcolor = "0.91 0.75 0.75 1", mainbar = "0.51 0.25 0.25 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.MECH, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.MECHARMOR, new setting2 {
first = 0f, last = 0.25f
}
}
, {
MODIFICATOR.MECHDAMAGE, new setting2 {
first = 0f, last = 0.1f
}
}
}
}
}
, {
SKILL.jeweler, new setting {
lvlcolor = "0.756 0.75 0.87 1", mainbar = "0.26 0.25 0.46 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.AIR, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.LOCKEDCRATE, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.ELITE, new setting2 {
first = 10f, last = 20f
}
}
}
}
}
, {
SKILL.dustman, new setting {
lvlcolor = "0.756 0.75 0.87 1", mainbar = "0.26 0.25 0.46 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.BARREL, new setting2 {
first = 10f, last = 20f
}
}
, {
MODIFICATOR.CRATE, new setting2 {
first = 10f, last = 20f
}
}
}
}
}
, {
SKILL.farmer, new setting {
lvlcolor = "0.756 0.75 0.87 1", mainbar = "0.26 0.25 0.46 1", backbar = "0.16 0.16 0.16 1", mod = new Dictionary<MODIFICATOR, setting2> {
{
MODIFICATOR.GROWABLEVEGETABLES, new setting2 {
first = 1f, last = 5f
}
}
, {
MODIFICATOR.GROWABLEBERRY, new setting2 {
first = 1f, last = 5f
}
}
}
}
}
}
;
#endregion
#region exp
[JsonProperty(fermensEN ? "Exp" : "Опыт")]
public expelement exp {
get;
set;
}
= new expelement {
barrel = 1.5f, crate = 2f, ore_stone = 1.5f, ore_metal = 1.5f, ore_sulfur = 2f, wood = 2f, grab_stone = 0.1f, grab_metal = 0.1f, grab_sulfur = 0.1f, grab_wood = 0.1f, heli = 50f, tank = 25f, tank_fleshed = 0.5f, heli_fleshed = 0.5f, heli_cont = 2f, tank_cont = 2f, wolf = 1f, stag = 0.75f, horse = 0.75f, ridablehorse = 0.1f, boar = 0.75f, chicken = 0.2f, bear = 1.5f, air = 2f, lockedcrate = 10f, elite = 3.5f, wolf_fleshed = 1.5f, horse_fleshed = 1.25f, boar_fleshed = 1.25f, stag_fleshed = 1.25f, chicken_fleshed = 0.4f, bear_fleshed = 3f, npc = 1.5f, npc_looted = 1f, grow_berrys = 0.75f, grow_vegetables = 0.5f
}
;
#endregion
#region broadcast
[JsonProperty(fermensEN ? "Show progress of other players in global chat" : "Отображать повышения уровней у других")]
public bool broadcast {
get;
set;
}
= false;
#endregion
#region boosters
[JsonProperty(fermensEN ? "Exp boosters : permissions" : "Бустеры - пермишены")]
public Dictionary<string, float> boosters {
get;
set;
}
= new Dictionary<string, float> {
{
"skillrates.x3boost", 3f
}
, {
"skillrates.x2boost", 2f
}
}
;
#endregion
#region gathers
[JsonProperty(fermensEN ? "Gather/loot boosters : permissions" : "Увеличители добычи - пермишены")]
public Dictionary<string, float> gathers {
get;
set;
}
= new Dictionary<string, float> {
{
"skillrates.x3", 3f
}
, {
"skillrates.x2", 2f
}
}
;
#endregion
}
#endregion
#region DAMAGETOMECH
Dictionary<BaseCombatEntity, Dictionary<BasePlayer, float>> mechdamage = new Dictionary<BaseCombatEntity, Dictionary<BasePlayer, float>>();
private void DAMAGETOMECH(BaseCombatEntity entity, BasePlayer player, float damage) {
if (!mechdamage.ContainsKey(entity)) mechdamage.Add(entity, new Dictionary<BasePlayer, float>());
if (!mechdamage[entity].ContainsKey(player)) mechdamage[entity].Add(player, damage);
else mechdamage[entity][player] += damage;
}
#endregion
#region SSS
private void OnPlayerDisconnected(BasePlayer player) {
if (modificators.ContainsKey(player.UserIDString)) modificators.Remove(player.UserIDString);
if (players.ContainsKey(player.userID)) Interface.Oxide.DataFileSystem.WriteObject("SKILLS/" + player.UserIDString, players[player.userID]);
}
private static SkillRates ins;
private void Init() {
ins = this;
}
private void OnContainerDropItems(ItemContainer container) {
LootContainer lootcont = container.entityOwner as LootContainer;
if (lootcont == null || lootcont.OwnerID != 0) return;
var player = lootcont?.lastAttacker?.ToPlayer();
if (lootcont.HasFlag(BaseEntity.Flags.Reserved7) || !lootcont.PrefabName.Contains("barrel")) return;
if (player != null) {
Dictionary<SKILL, mainskill> skill;
if (!players.TryGetValue(player.userID, out skill)) {
// Debug.Log("[OnContainerDropItems] skill id:" + player.UserIDString + " mini-error");
return;
}
UPRATELOOT(player, lootcont, MODGET(skill[SKILL.dustman].lvl, MODIFICATOR.BARREL));
ADDEXP(player, config.exp.barrel, SKILL.dustman);
}
else {
foreach (var item in lootcont.inventory.itemList.Where(x => x.info.stackable > 1)) {
item.amount = (int)(item.amount * MODGET(0, MODIFICATOR.BARREL));
}
}
}
private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
if (info == null || info.Initiator == null) return;
if (info.InitiatorPlayer != null) {
if (!IsNPC(info.InitiatorPlayer)) {
Dictionary<SKILL, mainskill> skill;
if (!players.TryGetValue(info.InitiatorPlayer.userID, out skill)) {
// Debug.Log("[OnEntityTakeDamage] skill id:" + info.InitiatorPlayer.UserIDString + " mini-error");
return;
}
if (entity is BaseAnimalNPC) {
info.damageTypes.ScaleAll(1f + MODGET(skill[SKILL.hunter].lvl, MODIFICATOR.ANIMALDAMAGE));
}
else if (entity is BaseHelicopter || entity is BradleyAPC) {
info.damageTypes.ScaleAll(1f + MODGET(skill[SKILL.technicist].lvl, MODIFICATOR.MECHDAMAGE));
DAMAGETOMECH(entity, info.InitiatorPlayer, info.damageTypes.Total());
}
else if (entity is BasePlayer) {
BasePlayer player = entity.ToPlayer();
if (player != null && IsNPC(player)) {
info.damageTypes.ScaleAll(1f + MODGET(skill[SKILL.marauder].lvl, MODIFICATOR.NPCDAMAGE));
}
}
}
else {
if (entity is BasePlayer) {
BasePlayer player = entity.ToPlayer();
if (player != null && !IsNPC(player)) {
Dictionary<SKILL, mainskill> skill;
if (!players.TryGetValue(player.userID, out skill)) {
// Debug.Log("[OnEntityTakeDamage] skill id:" + player.UserIDString + " mini-error");
return;
}
info.damageTypes.ScaleAll(1f - MODGET(skill[SKILL.marauder].lvl, MODIFICATOR.NPCARMOR));
}
}
}
}
else if (entity is BasePlayer) {
BasePlayer player = entity.ToPlayer();
if (player == null || IsNPC(player)) return;
Dictionary<SKILL, mainskill> skill;
if (!players.TryGetValue(player.userID, out skill)) {
//Debug.Log("[OnEntityTakeDamage] entity skill id:" + player.UserIDString + " mini-error");
return;
}
if (info.Initiator is BaseAnimalNPC) {
info.damageTypes.ScaleAll(1f - MODGET(skill[SKILL.hunter].lvl, MODIFICATOR.ANIMALARMOR));
}
else if (info.Initiator is BaseHelicopter || info.Initiator is BradleyAPC) {
info.damageTypes.ScaleAll(1f - MODGET(skill[SKILL.technicist].lvl, MODIFICATOR.MECHARMOR));
}
}
}
private void OnPlayerConnected(BasePlayer player) {
if (IsNewPlayer(player)) {
player.ChatMessage(GetLang("chat_welcome", player.UserIDString));
}
foreach (var x in config.settings) {
SetMaxLvl(player, x.Key.ToString());
}
UIRand(player);
}
private void UIRand(BasePlayer player) {
if (!config.eXPBar.enable) return;
int count = config.settings.Count;
int rand = Random.Range(0, count);
var x = config.settings.ElementAtOrDefault(rand);
Dictionary<SKILL, mainskill> skill;
if (!players.TryGetValue(player.userID, out skill)) {
IsNewPlayer(player);
skill = players[player.userID];
}
int mylevel = skill[x.Key].lvl;
mod level;
if (!levels.TryGetValue(mylevel, out level)) level = levels.LastOrDefault().Value;
UISkillBar(player, x.Key.ToString(), skill[x.Key].exp, level.exp, skill[x.Key].lvl);
UPDATEMOD(player.UserIDString);
}
private void UPDATEMOD(string id) {
modificator modificator;
if (!modificators.TryGetValue(id, out modificator)) {
modificators.Add(id, new modificator {
gather = GETGATHER(id), xp = GETBOOST(id)
}
);
return;
}
modificator.xp = GETBOOST(id);
modificator.gather = GETGATHER(id);
}
private float GETBOOST(string id) {
float value = 1f;
foreach (var z in config.boosters) {
if (permission.UserHasPermission(id, z.Key)) value *= z.Value;
}
return value;
}
private float GETGATHER(string id) {
foreach (var z in config.gathers) {
if (permission.UserHasPermission(id, z.Key)) return z.Value;
}
return 1f;
}
private string token = "030320221715fermens";
private string namer = "SkillRates";
private string UITEST = "[{\"name\":\"SkillBar\",\"parent\":\"Hud\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.1753284 0.1753284 0.1753284 0.4970338\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 0\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 10\"}]},{\"name\":\"LTSK\",\"parent\":\"SkillBar\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"assets/content/textures/generic/fulltransparent.tga\",\"color\":\"1 0.9058824 0.2039216 0.7843137\",\"png\":\"{png}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"0 0\",\"offsetmin\":\"2 -8\",\"offsetmax\":\"37 27\"}]},{\"name\":\"TextLTSK\",\"parent\":\"LTSK\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{lv}\",\"fontSize\":16,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmax\":\"0 0\"}]},{\"name\":\"ERrrq\",\"parent\":\"SkillBar\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{text}\",\"fontSize\":16, \"color\":\"1 1 1 0.7\",\"align\":\"MiddleLeft\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"0 0\",\"offsetmin\":\"43 0\",\"offsetmax\":\"300 39\"}]},{\"name\":\"_bar\",\"parent\":\"SkillBar\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"1 1 1 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.2\",\"anchormax\":\"1 0.7\",\"offsetmin\":\"43 0\",\"offsetmax\":\"0 0\"}]}]";
string barpanel = "{\"name\":\"barpanel\",\"parent\":\"_bar\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"{color}\"},{\"type\":\"RectTransform\",\"anchormin\":\"{min} 0\",\"anchormax\":\"{max} 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]}";
void DoBar(ref float x, ref string xx, float b = 0.095f) {
float max = x + b;
xx += (string.IsNullOrEmpty(xx) ? "" : ",") + barpanel.Replace("{color}", "1 0.9372549 0.4666667 " + max).Replace("{min}", x.ToString()).Replace("{max}", max.ToString());
x = max + 0.005f;
}
private void UISkillBar(BasePlayer player, string key, float exp, float needexp, int lvl) {
if (!config.eXPBar.enable) return;
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "DestroyUI", "SkillBar");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", UITEST.Replace("{text}", GetLang("expbar_main", player.UserIDString).Replace("{skillname}", GetLang(key, player.UserIDString)).Replace("{exp}", exp.ToString("0.0")).Replace("{needexp}", needexp.ToString("0.0"))).Replace("{png}", GetImage("https://i.ibb.co/jhXTp9f/b.png")).Replace("{lv}", lvl.ToString()));
float calculeted = (exp / needexp) * 10;
int rov = (int)Math.Floor(calculeted);
float ost = (calculeted - rov) / 10f;
float x = 0;
string xx = "";
for (int a = 0; a < rov; a++) DoBar(ref x, ref xx);
if (ost > 0f) DoBar(ref x, ref xx, ost);
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
connection = player.net.connection
}
, null, "AddUI", "[" + xx + "]");
}
private void OnServerInitialized() {
permission.RegisterPermission("skillrates.instant", this);
ServerMgr.Instance.StartCoroutine(GetCallback());
}
#region START
public string mainGui = "[{\"name\":\"TokenMenu\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"1 1 1 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"{anchormin}\",\"anchormax\":\"{anchormax}\",\"offsetmin\":\"{offsetmin}\",\"offsetmax\":\"{offsetmax}\"},{\"type\":\"NeedsCursor\"}]},{\"name\":\"TokenCLOSE2\",\"parent\":\"TokenMenu\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"close\":\"TokenMenu\",\"color\":\"0 0 0 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"-2000 -2000\",\"anchormax\":\"2000 2000\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"cui\",\"parent\":\"TokenMenu\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"{backgroundcolor}\",\"fadeIn\":{fadein}},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"TokenHEADER\",\"parent\":\"cui\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0.7490196 0.7490196 0.7490196 0.1647059\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.93\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"TokenHEADERTEXT\",\"parent\":\"TokenHEADER\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{header}\",\"fontSize\":26,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"TokenCLOSE\",\"parent\":\"TokenHEADER\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"close\":\"TokenMenu\",\"color\":\"0 0 0 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.9 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"TokenTEXT\",\"parent\":\"TokenCLOSE\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"fontSize\":16,\"color\":\"1 1 1 0.5\",\"text\":\"{closetext}\",\"align\":\"MiddleRight\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"-10 0\"}]}{main}]";
public string mainGui2 = "[{\"name\":\"TokenMenu\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"1 1 1 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"{anchormin}\",\"anchormax\":\"{anchormax}\",\"offsetmin\":\"{offsetmin}\",\"offsetmax\":\"{offsetmax}\"},{\"type\":\"NeedsCursor\"}]},{\"name\":\"cui\",\"parent\":\"TokenMenu\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"{backgroundcolor}\",\"fadeIn\":{fadein}},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]}{main}]";
public string mainBar = ",{\"name\":\"MAIN\",\"parent\":\"cui\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0 0 0 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"{minx} {miny}\",\"anchormax\":\"{maxx} {maxy}\",\"offsetmax\":\"0 0\"}]},{\"name\":\"MAINBAR\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"{backbar}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.055 0.09\",\"anchormax\":\"0.945 0.235\",\"offsetmax\":\"0 0\"}]},{\"name\":\"MAIIMAGE\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"assets/content/textures/generic/fulltransparent.tga\",\"png\":\"{png}\",\"color\":\"1 1 1 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmax\":\"0 0\"}]},{\"name\":\"NAMEFRAG\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{NAME}\",\"fontSize\":26,\"align\":\"MiddleLeft\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.02 0.7\",\"anchormax\":\"1 0.98\",\"offsetmin\":\"10 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"LEVEL\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{LVL}/{MAXLVL}\",\"fontSize\":26,\"align\":\"MiddleRight\",\"color\":\"{lvlcolor}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.6\",\"anchormax\":\"0.98 1\",\"offsetmax\":\"-10 0\"}]},{\"name\":\"ACTIVEBAR\",\"parent\":\"MAINBAR\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"{mainbar}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"{bar} 1\",\"offsetmax\":\"0 0\"}]},{\"name\":\"BONUSE\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{info}\",\"align\":\"MiddleLeft\",\"fontSize\":14,\"color\":\"1 1 1 0.787812\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.07 0.25\",\"anchormax\":\"1 0.65\",\"offsetmin\":\"10 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"SMALLINFO\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{smallinfo}\",\"fontSize\":12,\"align\":\"LowerLeft\",\"color\":\"1 1 1 0.4\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.02 0.68\",\"anchormax\":\"1 0.8\",\"offsetmin\":\"10 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"EXP\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{exp}\",\"fontSize\":12,\"align\":\"LowerLeft\",\"color\":\"1 1 1 0.4\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.07 0.127\",\"anchormax\":\"0.5 0.25\",\"offsetmin\":\"5 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"MAXEXP\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{maxexp}\",\"fontSize\":12,\"align\":\"LowerRight\",\"color\":\"1 1 1 0.4\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0.127\",\"anchormax\":\"0.92 0.25\",\"offsetmax\":\"-5 0\"}]}";
public string mainBar2 = ",{\"name\":\"MAIN\",\"parent\":\"cui\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"0 0 0 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"{minx} {miny}\",\"anchormax\":\"{maxx} {maxy}\",\"offsetmax\":\"0 0\"}]},{\"name\":\"MAINBAR\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"{backbar}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.055 0.09\",\"anchormax\":\"0.945 0.235\",\"offsetmax\":\"0 0\"}]},{\"name\":\"MAIIMAGE\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"assets/content/textures/generic/fulltransparent.tga\",\"png\":\"{png}\",\"color\":\"1 1 1 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmax\":\"0 0\"}]},{\"name\":\"NAMEFRAG\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{NAME}\",\"fontSize\":18,\"align\":\"MiddleLeft\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.02 0.7\",\"anchormax\":\"1 0.98\",\"offsetmin\":\"10 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"LEVEL\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{LVL}/{MAXLVL}\",\"fontSize\":18,\"align\":\"MiddleRight\",\"color\":\"{lvlcolor}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.7\",\"anchormax\":\"0.98 1\",\"offsetmax\":\"-10 0\"}]},{\"name\":\"ACTIVEBAR\",\"parent\":\"MAINBAR\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"color\":\"{mainbar}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"{bar} 1\",\"offsetmax\":\"0 0\"}]},{\"name\":\"BONUSE\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{info}\",\"align\":\"MiddleLeft\",\"fontSize\":10,\"color\":\"1 1 1 0.787812\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.07 0.25\",\"anchormax\":\"1 0.65\",\"offsetmin\":\"10 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"SMALLINFO\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{smallinfo}\",\"fontSize\":8,\"align\":\"LowerLeft\",\"color\":\"1 1 1 0.4\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.02 0.68\",\"anchormax\":\"1 0.8\",\"offsetmin\":\"10 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"EXP\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{exp}\",\"fontSize\":8,\"align\":\"LowerLeft\",\"color\":\"1 1 1 0.4\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.07 0.127\",\"anchormax\":\"0.5 0.25\",\"offsetmin\":\"5 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"MAXEXP\",\"parent\":\"MAIN\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{maxexp}\",\"fontSize\":8,\"align\":\"LowerRight\",\"color\":\"1 1 1 0.4\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0.127\",\"anchormax\":\"0.92 0.25\",\"offsetmax\":\"-5 0\"}]}";
public Dictionary<string, string> messagesRU = new Dictionary<string, string> {
{
"miner", "ШАХТЕР"
}
, {
"miner_hint", "добывай камень и железную руду"
}
, {
"miner_description", "<color=#5da86c>x{0}</color> добыча камня\n<color=#5da86c>x{1}</color> добыча железной руды\n<color=#5da86c>x{2}</color> добыча высококачественной железной руды"
}
, {
"alchemist", "АЛХИМИК"
}
, {
"alchemist_hint", "добывай сульфурную руду"
}
, {
"alchemist_description", "<color=#5da86c>x{0}</color> добыча сульфура\n<color=#5da86c>x{1}</color> скорость переплавки в печах"
}
, {
"woodcutter", "ДРОВОСЕК"
}
, {
"woodcutter_hint", "добывай дерево"
}
, {
"woodcutter_description_new", "<color=#5da86c>x{0}</color> добыча дерева\n<color=#5da86c>{1}%</color> шанс угля с дерева\n<color=#5da86c>x{2}</color> cкорость производства в НПЗ"
}
, {
"hunter", "ОХОТНИК"
}
, {
"hunter_hint", "убивай животных и потроши их"
}
, {
"hunter_description", "<color=#b76c6c>x{0}</color> получаемые ресурсы при потрошении\n<color=#b76c6c>{1}%</color> уменьшение урона от животных\n<color=#b76c6c>{2}%</color> увеличение урона по животным"
}
, {
"marauder", "МАРОДЕР"
}
, {
"marauder_hint", "убивай ботов и лутай их"
}
, {
"marauder_description", "<color=#b76c6c>x{0}</color> лут с ботов\n<color=#b76c6c>{1}%</color> уменьшение урона от ботов\n<color=#b76c6c>{2}%</color> увеличение урона по ботам"
}
, {
"technicist", "ТЕХНИК"
}
, {
"technicist_hint", "уничтожай технику и лутай ее"
}
, {
"technicist_description", "<color=#b76c6c>x{0}</color> лут с танка и вертолета\n<color=#b76c6c>{1}%</color> уменьшение урона от танка и вертолета\n<color=#b76c6c>{2}%</color> увеличение урона по танку и вертолету"
}
, {
"jeweler", "ЮВЕЛИР"
}
, {
"jeweler_hint", "облутывай аирдропы, закрытые и элитные ящики"
}
, {
"jeweler_description", "<color=#7773b4>x{0}</color> лут с аирдропов\n<color=#7773b4>x{1}</color> лут с закрытых ящиков\n<color=#7773b4>x{2}</color> лут с элитных ящиков"
}
, {
"dustman", "МУСОРЩИК"
}
, {
"dustman_hint", "лутай бочки, мусорки и обычные ящики"
}
, {
"dustman_description", "<color=#7773b4>x{0}</color> лут с бочек\n<color=#7773b4>x{1}</color> лут с обычных ящиков и мусорок"
}
, {
"farmer", "ФЕРМЕР"
}
, {
"farmer_hint", "собирай урожай"
}
, {
"farmer_description", "<color=#7773b4>x{0}</color> урожай овощей\n<color=#7773b4>x{1}</color> урожай ягод"
}
, {
"ui_exit", "ЗАКРЫТЬ"
}
, {
"ui_header", "НАВЫКИ"
}
, {
"expbar_main", "{skillname} ◉ EXP {exp}/{needexp}"
}
, {
"chat_uplevel", "Навык <color=#ccff66>{skill}</color> прокачался до <color=#ccff66>{level} ур.</color>\nВаши новые бонусы:\n{bonuses}\n\n<color=#ccff66>/skill</color> - список доступных навыков и их бонусы"
}
, {
"chat_welcome", "Добро пожаловать на сервер.\nНа сервере присутствует система прокачки навыков, команда <color=#ccff66>/skill</color>."
}
, {
"chat_broadcast", "<size=11>Игрок <color=#ccff99>{name}</color> повысил навык <color=#ccff66>{skill}</color> до <color=#ccff66>{level} ур.</color>\n<color=#ccff66>/skill</color></size>"
}
}
;
public Dictionary<string, string> messagesEN = new Dictionary<string, string> {
{
"miner", "MINER"
}
, {
"miner_hint", "mine stone and iron ore"
}
, {
"miner_description", "<color=#5da86c>x{0}</color> stone mining\n<color=#5da86c>x{1}</color> iron ore mining\n<color=#5da86c>x{2}</color> mining of high quality iron ore"
}
, {
"alchemist", "ALCHEMIS
// ... [Code preview truncated due to length. Full source in attached file] ...