C#:
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Artefacts", "CASHR#6906", "1.0.0")]
internal class Artefacts : RustPlugin
{
#region Static
private static Artefacts _ins;
private Configuration _config;
private string Layer = "UI_ARTEFACTS_INFO";
#endregion
#region Config
object OnItemAction(Item item, string action, BasePlayer player)
{
if (action != "consume") return null;
if (!item.info.shortname.Contains("tea")) return null;
if (player.GetComponent<ArtefactBuff>() == null) return null;
player.ChatMessage("Нельзя использовать чай, при активном артефакте");
return false;
}
private class Configuration
{
[JsonProperty("Статичная картинка эффекта")]
public string Image = "";
[JsonProperty("Список артефактов")]
public Dictionary<int, Artefact> ArtefactsList = new Dictionary<int, Artefact>();
internal class Artefact
{
[JsonProperty("Отображать в интерфейсе")]
public bool inInterface = false;
[JsonProperty("Уровень артефакта")] public int ArtefactLevel;
[JsonProperty("Краткое описание")] public string LowDest;
[JsonProperty("Изображение артефакта")]
public string image;
[JsonProperty("Описание артефакта")] public string Desc;
[JsonProperty(
"Название артефакта(Для апгрейда артефакта у них должны быть одинаковые имена.(Всё остальное может быть разным))")]
public string ArtefactName;
[JsonProperty("Настройки типа артефакта")]
public ArtefactType ArtefactSetting;
[JsonProperty("Shortname предмета")] public string ArtefactShortname;
[JsonProperty("SkinID предмета")] public ulong ArtefactskinID;
[JsonProperty("Имя предмета")] public string DisplayName;
}
internal class ArtefactType
{
[JsonProperty("Множитель урона(1 = стандарт)")]
public float DamageScale;
[JsonProperty("Восполнение еды")] public int FoodRestore;
[JsonProperty("Множитель добываемых ресурсов(1 = стандарт)")]
public float GatheringMultiply;
[JsonProperty("Множитель для игрков(привилегия/рейт)")]
public Dictionary<string, float> PermList;
[JsonProperty("Множитель здоровья(0 = стандарт хп)")]
public float HealthPercent;
[JsonProperty("Кол-во восполняемого здоровья за 1 секунду")]
public float HealthRestore;
[JsonProperty("Промежуток времени, за который даётся одна радиация")]
public float RadiationTickRate;
[JsonProperty("Восполнение воды")] public int WaterRestore;
}
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
_config = Config.ReadObject<Configuration>();
if (_config == null) throw new Exception();
SaveConfig();
}
catch
{
PrintError("Your configuration file contains an error.Using default configuration values.");
LoadDefaultConfig();
}
}
protected override void SaveConfig()
{
Config.WriteObject(_config);
}
protected override void LoadDefaultConfig()
{
_config = new Configuration()
{
ArtefactsList = new Dictionary<int, Configuration.Artefact>()
{
[0] = new Configuration.Artefact()
{
ArtefactName = "Артефакт берсерка",
ArtefactShortname = "blood",
ArtefactskinID = 0,
ArtefactLevel = 1,
ArtefactSetting = new Configuration.ArtefactType()
{
HealthPercent = 2f,
PermList = new Dictionary<string, float>(),
DamageScale = 1.1f,
FoodRestore = 0,
WaterRestore = 0,
HealthRestore = 0,
GatheringMultiply = 1f,
RadiationTickRate = 1f
}
}
}
};
}
#endregion
#region OxideHooks
private void OnServerInitialized()
{
_ins = this;
LoadConfig();
foreach (var check in _config.ArtefactsList)
{
if (check.Value.inInterface)
ImageLibrary?.Call("AddImage", check.Value.image, check.Value.image);
}
ImageLibrary?.Call("AddImage", _config.Image,_config.Image);
foreach (var check in _config.ArtefactsList)
{
foreach (var perm in check.Value.ArtefactSetting.PermList)
{
permission.RegisterPermission(perm.Key, this);
}
}
}
private void Unload()
{
_ins = null;
var Player = GameObject.FindObjectsOfType<ArtefactBuff>();
foreach (var check in Player)
{
check?.Kill();
GameObject.Destroy(check);
}
}
private void OnItemAddedToContainer(ItemContainer container, Item item)
{
if (item == null || container == null) return;
var player = container.GetOwnerPlayer();
if (player == null) return;
if (container != player.inventory.containerBelt) return;
var artefact = ItemIsArtefact(item);
if (artefact == null) return;
PlayerSetBuff(player, artefact);
}
private void OnPlayerDeath(BasePlayer player, HitInfo info)
{
if (player == null) return;
if (player.gameObject.GetComponent<ArtefactBuff>() != null)
player.gameObject.GetComponent<ArtefactBuff>().Kill();
}
private void OnItemRemovedFromContainer(ItemContainer container, Item item)
{
if (item == null || container == null) return;
var player = container.GetOwnerPlayer();
if (player == null || container != player.inventory.containerBelt) return;
if (player.gameObject.GetComponent<ArtefactBuff>() != null && ItemIsArtefact(item) != null)
player.gameObject.GetComponent<ArtefactBuff>().Kill();
}
private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
{
if (entity == null || info == null || !(entity as BasePlayer) && !(entity as BaseNpc)) return;
var attacker = info.InitiatorPlayer;
if (attacker == null) return;
var comp = attacker.gameObject.GetComponent<ArtefactBuff>();
if (comp != null && attacker.HasPlayerFlag(BasePlayer.PlayerFlags.Unused1))
info.damageTypes.ScaleAll(comp.GetDamageScale());
}
private void OnDispenserGather(ResourceDispenser dispenser, BasePlayer player, Item item)
{
OnDispenserBonus(dispenser, player, item);
}
private void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item)
{
if (player == null) return;
var comp = player.gameObject.GetComponent<ArtefactBuff>();
if (comp != null && player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused2))
{
var amount = (int) (item.amount * comp.GetGatheringMultiply());
item.amount = amount > 1 ? amount : 1;
}
}
private object CanMoveItem(Item item, PlayerInventory playerLoot, uint targetContainer, int targetSlot,
int amount)
{
if (item == null || playerLoot == null) return null;
var player = playerLoot.GetComponent<BasePlayer>();
if (player == null) return null;
var container = playerLoot.FindContainer(targetContainer);
if (container == null) return null;
var targetItem = container.GetSlot(targetSlot);
if (targetItem == null) return null;
var artefact = ItemIsArtefact(item);
if (artefact == null) return null;
var art = ItemIsArtefact(targetItem);
if (art == null) return null;
if (art.ArtefactskinID != artefact.ArtefactskinID) return null;
if (art.ArtefactName == artefact.ArtefactName && art.ArtefactLevel == artefact.ArtefactLevel)
for (var i = 0; i < _config.ArtefactsList.Count; i++)
{
var findart = _config.ArtefactsList[i];
if (art.ArtefactName == findart.ArtefactName && artefact.ArtefactName == findart.ArtefactName && findart.ArtefactLevel == art.ArtefactLevel + 1)
{
item.DoRemove();
targetItem.DoRemove();
NextTick(()=>{
var NewArt = ItemManager.CreateByName(findart.ArtefactShortname, 1, findart.ArtefactskinID);
if (!string.IsNullOrEmpty(findart.DisplayName))
NewArt.name = findart.DisplayName;
player.GiveItem(NewArt);
});
return false;
}
}
return null;
}
#endregion
#region Interface
[PluginReference] private Plugin ImageLibrary;
private void ShowInfo(BasePlayer player)
{
var container = new CuiElementContainer();
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform =
{AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"-700 -400", OffsetMax = $"700 400"},
Image = {Color = "0 0 0 0.5", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"}
}, "Overlay", Layer);
container.Add(new CuiButton
{
RectTransform = {AnchorMin = $"0 0", AnchorMax = $"1 1"},
Button = {Color = "1 1 1 0", Close = Layer},
Text =
{
Text = "", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 18
}
}, Layer);
double posx = 0.008f;
var posy = 0.92;
var wight = 0.4;
var height = 0.22;
int a = 0;
container.Add(new CuiButton
{
RectTransform = {AnchorMin = $"0.1 0.1", AnchorMax = $"0.9 0.9"},
Button = {Color = "1 1 1 0"},
Text =
{
Text = "", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 18
}
}, Layer, Layer + ".ARTEFACT");
foreach (var check in _config.ArtefactsList)
{
if (!check.Value.inInterface) continue;
container.Add(new CuiButton
{
RectTransform = {AnchorMin = $"{posx} {posy - height}", AnchorMax = $"{posx + wight} {posy}"},
Button = {Color = "0 0 0 0.9"},
Text =
{
Text = "", Align = TextAnchor.MiddleLeft, Font = "robotocondensed-regular.ttf", FontSize = 18
}
}, Layer + ".ARTEFACT", Layer + $"{a}");
container.Add(new CuiElement
{
Parent = Layer + $"{a}",
Components =
{
new CuiRawImageComponent {Png = (string) ImageLibrary.Call("GetImage", check.Value.image)},
new CuiRectTransformComponent {AnchorMin = $"0 0", AnchorMax = $"0.28 1"}
}
});
container.Add(new CuiElement
{
Parent = Layer + $"{a}",
Components =
{
new CuiTextComponent
{
Text = $"{check.Value.Desc}", FontSize = 18, Font = "robotocondensed-regular.ttf",
Align = TextAnchor.UpperLeft
},
new CuiRectTransformComponent {AnchorMin = "0.3 0", AnchorMax = "1 0.95"},
new CuiOutlineComponent {Color = "0 0 0 1", Distance = "0.5 -0.5"}
}
});
a++;
posx = posx + wight + 0.02;
posy = posy - height/2 - 0.01F;
if (a == 2 || a == 4 || a == 6 || a == 8)
{
posx = 0.008f;
}
}
container.Add(new CuiButton
{
Button = {Color = "0 0 0 0.8",Command = "chat.say /menu",Close = Layer},
Text =
{
Text = "НАЗАД В МЕНЮ", Font = "robotocondensed-bold.ttf", FontSize = 24, Align = TextAnchor.MiddleCenter,
Color = "1 1 1 1"
},
RectTransform = {AnchorMin = "0.61 0.05", AnchorMax = "0.8 0.13"}
}, Layer);
container.Add(new CuiButton
{
Button = {Color = "0 0 0 0",Close = Layer},
Text =
{
Text = "АРТЕФАКТЫ", Font = "robotocondensed-bold.ttf", FontSize = 60, Align = TextAnchor.MiddleCenter,
Color = "1 1 1 1"
},
RectTransform = {AnchorMin = "0.5 0.8", AnchorMax = "0.8 0.9"}
}, Layer);
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, container);
}
#endregion
#region Function
private Configuration.Artefact ItemIsArtefact(Item item)
{
for (var i = 0; i < _config.ArtefactsList.Count; i++)
{
var art = _config.ArtefactsList[i];
if (item.info.shortname == art.ArtefactShortname && item.skin == art.ArtefactskinID)
return art;
}
return null;
}
[ChatCommand("artefacts")]
void cmdGiveArtefacts(BasePlayer player, string com, string[] args)
{
if (!player.IsAdmin) return;
foreach(var art in _config.ArtefactsList)
{
var item = ItemManager.CreateByName(art.Value.ArtefactShortname, 1, art.Value.ArtefactskinID);
player.GiveItem(item);
}
}
private void PlayerSetBuff(BasePlayer player, Configuration.Artefact artefact)
{
var componentPLayer = player.GetComponent<ArtefactBuff>();
if (componentPLayer != null)
{
componentPLayer.Kill();
player.ChatMessage("Нельзя использовать два артефакта одновременно!Баффы отключены");
return;
}
player.gameObject.AddComponent<ArtefactBuff>();
var newComponenPlayer = player.gameObject.GetComponent<ArtefactBuff>();
newComponenPlayer.ArtefactBuffcfg = artefact;
newComponenPlayer.ArtefactActivate();
}
[ConsoleCommand("SHOWSTATART")]
private void cmdChatSHOWSTATART(ConsoleSystem.Arg arg)
{
var player = arg.Player();
if (player == null || player.GetComponent<ArtefactBuff>() == null) return;
player.GetComponent<ArtefactBuff>().ShowText();
}
private class ArtefactBuff : FacepunchBehaviour
{
public Configuration.Artefact ArtefactBuffcfg;
private BasePlayer player;
private void Awake()
{
player = GetComponent<BasePlayer>();
player.modifiers.RemoveAll();
}
public void ArtefactActivate()
{
var modifiers = new List<ModifierDefintion>();
modifiers.Clear();
var ArtSettings = ArtefactBuffcfg.ArtefactSetting;
var HealthPercent = ArtSettings.HealthPercent;
var RadiationTickRate = ArtSettings.RadiationTickRate;
if (HealthPercent != 1)
{
var modifier = new ModifierDefintion()
{
type = Modifier.ModifierType.Max_Health, duration = 86400, source = Modifier.ModifierSource.Tea,
value = HealthPercent,
};
modifiers.Add(modifier);
player.modifiers.Add(modifiers);
}
if (ArtSettings.DamageScale != 1)
if (!player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused1))
player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused1, true);
if (ArtSettings.FoodRestore != 0) InvokeRepeating(FoodRestoration, 1f, 1f);
if (ArtSettings.WaterRestore != 0) InvokeRepeating(WaterRestoration, 1f, 1f);
if (ArtSettings.HealthRestore != 0) InvokeRepeating(HealthRestoration, 1f, 1f);
if (ArtSettings.GatheringMultiply != 1)
if (!player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused2))
player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused2, true);
// if (RadiationTickRate != 0) InvokeRepeating(RadiationAdd, RadiationTickRate, RadiationTickRate);
ShowPanel();
}
private string Layer = "UI_ARTEFACTS_PANELLAYER";
private void ShowPanel()
{
var container = new CuiElementContainer();
container.Add(new CuiPanel
{
RectTransform =
{AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-245 30", OffsetMax = "-205 70"},
Image = {Color = "0 0 0 0", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"}
}, "Overlay", Layer);
container.Add(new CuiElement
{
Parent = Layer,
Name = Layer + "UPDATE",
Components =
{
new CuiRawImageComponent
{Png = (string) _ins.ImageLibrary.Call("GetImage", _ins._config.Image), Color = "1 1 1 0.7"},
new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 1"}
}
});
container.Add(new CuiButton
{
RectTransform = {AnchorMin = $"0 0", AnchorMax = $"1 1"},
Button = {Color = "0 0 0 0", Command = "SHOWSTATART"},
Text =
{
Text = "", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 18
}
}, Layer + "UPDATE");
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, container);
}
public void ShowText()
{
var container = new CuiElementContainer();
container.Add(new CuiButton
{
RectTransform = {AnchorMin = "-8.6 1.2", AnchorMax = "0.75 2"},
Button = {Color = "1 1 1 0.2"},
Text =
{
Text = ArtefactBuffcfg.LowDest, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 18
}
}, Layer, Layer + ".TEXT");
CuiHelper.DestroyUi(player, Layer + ".TEXT");
CuiHelper.AddUi(player, container);
Invoke(()=>{ CuiHelper.DestroyUi(player, Layer + ".TEXT");}, 5f);
}
private void FoodRestoration()
{
if (player.metabolism.calories.value >= player.metabolism.calories.max) return;
player.metabolism.calories.value += ArtefactBuffcfg.ArtefactSetting.FoodRestore;
}
private void WaterRestoration()
{
if (player.metabolism.hydration.value >= player.metabolism.hydration.max) return;
player.metabolism.hydration.value += ArtefactBuffcfg.ArtefactSetting.WaterRestore;
}
private void HealthRestoration()
{
if (player.health >= player._maxHealth) return;
player.health += ArtefactBuffcfg.ArtefactSetting.HealthRestore;
}
private void RadiationAdd()
{
player.metabolism.radiation_poison.value += 1 - player.baseProtection.amounts[17];
}
public float GetGatheringMultiply()
{
return GetRate();
}
private float GetRate()
{
var def = ArtefactBuffcfg.ArtefactSetting.GatheringMultiply;
foreach (var check in ArtefactBuffcfg.ArtefactSetting.PermList)
{
if (_ins.permission.UserHasPermission(player.UserIDString, check.Key))
def = check.Value;
}
return def;
}
public float GetDamageScale()
{
return ArtefactBuffcfg.ArtefactSetting.DamageScale;
}
public void Kill()
{
CuiHelper.DestroyUi(player, Layer);
CancelInvoke(FoodRestoration);
CancelInvoke(WaterRestoration);
CancelInvoke(HealthRestoration);
CancelInvoke(RadiationAdd);
player.modifiers.RemoveAll();
if (player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused1))
player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused1, false);
if (player.HasPlayerFlag(BasePlayer.PlayerFlags.Unused2))
player.SetPlayerFlag(BasePlayer.PlayerFlags.Unused2, false);
Destroy(this);
}
}
#endregion
}
}