C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Facepunch;
using Network;
using Network.Visibility;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Random = UnityEngine.Random;
namespace Oxide.Plugins {
[Info("Hydra", "15FPS", "0.0.1")]
[Description("Реализует систему закладок на сервере")]
public class Hydra : RustPlugin {
#region Classes
public class PlayerDrug {
[JsonProperty("Текущий баланс игрока")]
public int CurrentBalance {
get;
set;
}
}
public class CustomItem {
[JsonProperty("Отображаемое имя в инвентаре")]
public string DisplayName {
get;
set;
}
[JsonProperty("Заменяет предмет с названием")]
public string ReplaceName {
get;
set;
}
[JsonProperty("Изменить стандартный стак")]
public int Stack {
get;
set;
}
[JsonProperty("SkinID предмета для замены")]
public ulong SkinID {
get;
set;
}
public virtual Item CreateItem(int amount = 1) {
Item newDrug = ItemManager.CreateByPartialName(ReplaceName, amount);
if (DisplayName != null) {
newDrug.name = DisplayName;
}
newDrug.skin = SkinID;
return newDrug;
}
public void Take(BasePlayer player, int amount) {
var removed = 0;
foreach (var check in player.inventory.AllItems().Where(p => p.skin == SkinID)) {
if (check.amount > amount - removed) {
check.amount -= amount - removed;
}
else {
check.DoRemove();
}
removed += check.amount;
}
}
public int GetAmount(BasePlayer player) {
var examples = player.inventory.FindItemByItemID(ItemManager.FindItemDefinition(ReplaceName).itemid);
return examples.amount;
}
public bool IsThis(Item item) {
if (item.info.shortname == ReplaceName && item.skin == SkinID) return true;
return false;
}
}
public class Drug : CustomItem {
[JsonProperty("'Уровень' закладки (1-3)")]
public int Level {
get;
set;
}
[JsonProperty("Цена продажи закладки")]
public int Price {
get;
set;
}
}
public class Map : CustomItem {
[JsonProperty("'Уровень' закладки (1-3)")]
public int Level {
get;
set;
}
[JsonProperty("Шанс выпадения из бочки")]
public int DropChance {
get;
set;
}
[JsonProperty("Описание предмета (в разделе Note)")]
public string Description {
get;
set;
}
[JsonProperty("Названия магазинов (для интереса)")]
public List<string> Shops {
get;
set;
}
public override Item CreateItem(int amount = 1) {
Item x = base.CreateItem(amount);
x.text = Description;
if (Shops.Count > 0) {
x.text += $"\nW/ LOVE: {Shops.GetRandom().ToUpper()}";
}
return x;
}
}
private class Configuration {
public class ShopItem : CustomItem {
[JsonProperty("Количество предмета при покупке")]
public int Amount {
get;
set;
}
[JsonProperty("Цена покупки")]
public int Price {
get;
set;
}
}
[JsonProperty("Список доступных для нахождения наркотиков")]
public List<Drug> Drugs {
get;
private set;
}
[JsonProperty("Список доступных для выпадения карт")]
public List<Map> Maps {
get;
private set;
}
[JsonProperty("Предметы доступные для покупки")]
public List<ShopItem> ShopItems {
get;
private set;
}
[JsonProperty("Этапы загрузки текстом")]
public List<string> LoadSteps {
get;
private set;
}
[JsonProperty("Шанс выпадения карты из бочки")]
public int MapDropChance {
get;
private set;
}
[JsonProperty("Стартовый баланс у игроков")]
public int StartBalance {
get;
set;
}
public static Configuration NewConfiguration() {
Configuration newConfig = new Configuration();
newConfig.Drugs = new List<Drug>() {
new Drug {
DisplayName = "Гашиш", ReplaceName = "glue", Stack = 5, SkinID = 1553227150, Level = 1, Price = 100
}
, new Drug {
DisplayName = "ЛСД", ReplaceName = "glue", Stack = 5, SkinID = 1553226634, Level = 2, Price = 100
}
, new Drug {
DisplayName = "Кокаин", ReplaceName = "glue", Stack = 5, SkinID = 1553227047, Level = 3, Price = 100
}
, new Drug {
DisplayName = "Героин", ReplaceName = "syringe.medical", Stack = 5, SkinID = 1553227227, Level = 3, Price = 100
}
, new Drug {
DisplayName = "Экстази", ReplaceName = "glue", Stack = 5, SkinID = 1553227326, Level = 2, Price = 100
}
, new Drug {
DisplayName = "Ксанакс", ReplaceName = "antiradpills", Stack = 5, SkinID = 1553227460, Level = 1, Price = 100
}
,
}
;
newConfig.Maps = new List<Map>() {
new Map {
DisplayName = "Закладка лёгкого наркотика", Description = "It is near tree, few st. underground\nCoordinates: •2.3 ••.•• 42.••\n\n\nYou need research table to interact with this map!", Shops = new List<string> {
"GREEN SHOP", "JIMM GREEN", "WHITE WIDOW", "NORTHERN LIGHT"
}
, ReplaceName = "note", Stack = 1, SkinID = 1552262098, Level = 1, DropChance = 50
}
, new Map {
DisplayName = "Закладка среднего наркотика", Description = "It is in big hole, left from door\nCoordinates: 1•.• •2.6• •2.•6\n\n\nYou need research table to interact with this map!", Shops = new List<string> {
"ST. SHOP", "KLD GREEN", "AK-47 COURIERS", "Jesus Pong"
}
, ReplaceName = "note", Stack = 1, SkinID = 1553240872, Level = 2, DropChance = 50
}
, new Map {
DisplayName = "Закладка тяжёлого наркотика", Description = "It is in big hole, left from door\nCoordinates: 1•.• •2.6• •2.•6\n\n\nYou need research table to interact with this map!", Shops = new List<string> {
"COLUMBIAN TIER", "MEXICAINE"
}
, ReplaceName = "note", Stack = 1, SkinID = 1553241930, Level = 3, DropChance = 50
}
,
}
;
newConfig.ShopItems = new List<ShopItem>() {
new ShopItem {
ReplaceName = "rifle.ak", Amount = 1, SkinID = 0UL, Price = 50
}
,
}
;
newConfig.LoadSteps = new List<string> {
"OK", "ASUS P5KPL ACPI BIOS Revision 0603", "CPU: Intel (R) Quad Core E2180 @ 2.00GHz", "Speed: 2.51 GHz", "Initializing USB Controllers", "Checking RAM storage", "Validating HDD", "Detecting IDE drivers", "Memory Frequency 2132MHz", "Validating complete", "Immortal (C) 2018 Hougan Space, Inc",
}
;
newConfig.MapDropChance = 2;
foreach (var check in ItemManager.itemList.Take(90)) {
ShopItem x = new ShopItem();
x.ReplaceName = check.shortname;
newConfig.ShopItems.Add(x);
}
return newConfig;
}
}
private class MarkerStash : MonoBehaviour {
public VendingMachineMapMarker vendingMarker;
private bool IsDecaying;
public void Initialize(BasePlayer player, string name) {
vendingMarker = CreateMarker(player, transform.position, name);
}
public bool StartDecay() {
if (!IsDecaying) {
vendingMarker = ChangeMarker(vendingMarker, $"Заказ #{Random.Range(0, 100)} | Забрано");
Invoke(nameof(Destroy), 60f);
IsDecaying = true;
}
return IsDecaying;
}
public void Destroy() {
RemoveMarker(vendingMarker);
GetComponent<BaseEntity>().Kill();
}
}
private class NetCup {
public BaseEntity DroppedNet {
get;
set;
}
public NetCup() {
DroppedNet = null;
}
}
#endregion
#region Variables
private static Hydra m_Instance;
private Configuration Settings {
get;
set;
}
private Dictionary<ulong, PlayerDrug> PlayerDrugs {
get;
set;
}
private Dictionary<BaseNetworkable, NetCup> NetCups {
get;
set;
}
#endregion
#region Initialization
static String Api = "https://rustplugins.top/api/";
private void OnServerInitialized() {
foreach (var check in UnityEngine.Object.FindObjectsOfType<VendingMachineMapMarker>()) check.SendNetworkUpdate();
m_Instance = this;
if (Interface.Oxide.DataFileSystem.ExistsDatafile("Hydra/Data")) {
PlayerDrugs = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, PlayerDrug>>("Hydra/Data");
}
else {
PlayerDrugs = new Dictionary<ulong, PlayerDrug>();
}
if (Interface.Oxide.DataFileSystem.ExistsDatafile("Hydra/Cups")) {
List<uint> tryCup = Interface.Oxide.DataFileSystem.ReadObject<List<uint>>("Hydra/Cups");
NetCups = new Dictionary<BaseNetworkable, NetCup>();
foreach (var check in tryCup) {
BaseNetworkable entity = BaseNetworkable.serverEntities.Find(new NetworkableId(check));
if (entity != null && entity is RepairBench) {
NetCups.Add(entity, new NetCup());
CreateNet(entity, NetCups[entity]);
}
}
}
else {
NetCups = new Dictionary<BaseNetworkable, NetCup>();
}
foreach (var check in Settings.Drugs) ItemManager.FindItemDefinition(check.ReplaceName).stackable = check.Stack;
foreach (var check in Settings.Maps) ItemManager.FindItemDefinition(check.ReplaceName).stackable = check.Stack;
foreach (var check in Settings.ShopItems) ImageLibrary.Call("AddImage", Api +$"rust/{check.ReplaceName}.png", check.ReplaceName);
BasePlayer.activePlayerList.ToList().ForEach(OnPlayerInit);
timer.Every(60, SaveData);
}
private void OnPlayerInit(BasePlayer player) {
if (!PlayerDrugs.ContainsKey(player.userID)) PlayerDrugs.Add(player.userID, new PlayerDrug {
CurrentBalance = Settings.StartBalance
}
);
}
private void OnPlayerDisconnected(BasePlayer player, string reason) {
if (HashCoroutines.ContainsKey(player.userID)) {
ServerMgr.Instance.StopCoroutine(HashCoroutines[player.userID]);
HashCoroutines.Remove(player.userID);
}
}
protected override void LoadConfig() {
base.LoadConfig();
Settings = Config.ReadObject<Configuration>();
if (Settings?.Drugs == null) LoadDefaultConfig();
NextTick(SaveConfig);
}
protected override void SaveConfig() => Config.WriteObject(Settings);
protected override void LoadDefaultConfig() => Settings = Configuration.NewConfiguration();
private void SaveData() {
Interface.Oxide.DataFileSystem.WriteObject("Hydra/Data", PlayerDrugs);
if (NetCups.Count > 0) {
Interface.Oxide.DataFileSystem.WriteObject("Hydra/Cups", NetCups.Where(p => p.Key != null).Select(p => p.Key.net.ID).ToList());
}
}
#endregion
#region Functions
private static VendingMachineMapMarker CreateMarker(BasePlayer player, Vector3 position, string name) {
var newMarker = GameManager.server.CreateEntity("assets/prefabs/deployable/vendingmachine/vending_mapmarker.prefab", position);
var vendingMarker = newMarker.GetComponent<VendingMachineMapMarker>();
vendingMarker.OwnerID = player.userID;
vendingMarker.markerShopName = name;
vendingMarker.Spawn();
vendingMarker.enabled = false;
return vendingMarker;
}
private static VendingMachineMapMarker ChangeMarker(VendingMachineMapMarker marker, string name) {
marker.markerShopName = name;
marker.SendNetworkUpdate();
return marker;
}
private static void RemoveMarker(VendingMachineMapMarker marker) {
marker.Kill();
}
private void ProcessMap(BasePlayer player, Item item) {
var map = GetMapFromItem(item);
if (map != null) {
using (TimeWarning.New("Getting new position", 01)) {
var foundPosition = Vector3.zero;
for (int i = 0; i < 1000; i++) {
var generatePos = UnityEngine.Random.insideUnitCircle * World.Size / 2;
var targetPos = new Vector3(generatePos.x, 300, generatePos.y);
var hitInfo = RayPosition(targetPos);
var success = ProcessRay(hitInfo);
if (success != null && success is float) {
targetPos.y = Mathf.Max((float)success, TerrainMeta.HeightMap.GetHeight(targetPos));
foundPosition = targetPos;
break;
}
}
if (foundPosition == Vector3.zero) {
PrintError($"Failed to process map and find position from 1.000 tries!");
return;
}
BaseEntity entity = GameManager.server.CreateEntity("assets/prefabs/deployable/small stash/small_stash_deployed.prefab", foundPosition);
entity.OwnerID = 2281337;
entity.Spawn();
var hide = entity.GetComponent<StashContainer>();
if (hide != null) {
var drug = Settings.Drugs.Where(p => p.Level == map.Level).ToList().GetRandom();
drug.CreateItem().MoveToContainer(hide.inventory);
hide.SetFlag(BaseEntity.Flags.Reserved5, true, false);
entity.OwnerID = 2281337;
entity.SendNetworkUpdate();
entity.gameObject.AddComponent<MarkerStash>();
entity.GetComponent<MarkerStash>().Initialize(player, $"Заказ №{Random.Range(0, 100)} | {drug.DisplayName}");
player.ChatMessage($"На вашей карте отмечена точка закладки, прикоп два сантиметра!");
}
}
}
else {
PrintWarning($"Processing map failed, item is null [{player.userID}]!");
}
}
private Map GetMapFromItem(Item item) {
return Settings.Maps.FirstOrDefault(p => p.ReplaceName == item.info.shortname && p.SkinID == item.skin);
}
private object ProcessRay(RaycastHit hitInfo) {
if (hitInfo.collider != null) {
if (hitInfo.collider?.gameObject.layer == LayerMask.NameToLayer("Water")) return null;
if (hitInfo.collider?.gameObject.layer == LayerMask.NameToLayer("Prevent Building")) return null;
if (hitInfo.GetEntity() != null) {
return hitInfo.point.y;
}
if (hitInfo.collider?.name == "areaTrigger") return null;
if (hitInfo.collider?.GetComponentInParent<SphereCollider>() || hitInfo.collider?.GetComponentInParent<BoxCollider>()) {
return hitInfo.collider.transform.position + new Vector3(0, -1, 0);
}
}
return hitInfo.point.y;
}
private RaycastHit RayPosition(Vector3 sourcePos) {
RaycastHit hitInfo;
Physics.Raycast(sourcePos, Vector3.down, out hitInfo);
return hitInfo;
}
#endregion
#region Hooks
private void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
if (entity.PrefabName.Contains("barrel")) {
if (Oxide.Core.Random.Range(0, 100) > Settings.MapDropChance) return;
int totalSum = Settings.Maps.Sum(p => p.DropChance);
int current = Oxide.Core.Random.Range(0, totalSum);
int currentPoint = 0;
foreach (var check in Settings.Maps) {
if (check.DropChance + currentPoint >= current) {
check.CreateItem().Drop(entity.transform.position, Vector3.down);
return;
}
currentPoint += check.DropChance;
}
}
}
private void Unload() {
SaveData();
foreach (var check in NetCups) {
RemoveNet(check.Key, check.Value);
}
foreach (var check in UnityEngine.Object.FindObjectsOfType<MarkerStash>()) check.Destroy();
BasePlayer.activePlayerList.ToList().ForEach(p => CuiHelper.DestroyUi(p, MainLayer));
}
private void OnHealingItemUse(MedicalTool tool, BasePlayer player) {
if (tool.GetItem()?.skin == 1553227227) {
player.Heal(50);
player.metabolism.bleeding.SetValue(30);
}
return;
}
private bool? CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem) {
if (item.GetItem() == null || targetItem.GetItem() == null) return null;
if (item.GetItem().skin != targetItem.GetItem().skin) return false;
return null;
}
private object OnItemAction(Item item, string action) {
if (item == null || action == null || action != "consume") return null;
if (item.skin != 1553227460) return null;
BasePlayer player = item.GetRootContainer().GetOwnerPlayer();
if (player == null) return null;
player.metabolism.hydration.Add(150);
player.metabolism.calories.Add(150);
return null;
}
private Item OnItemSplit(Item item, int amount) {
var customItem = Settings.Drugs.FirstOrDefault(p => p.SkinID == item.skin && p.ReplaceName == item.info.shortname);
if (customItem != null) {
Item x = ItemManager.CreateByPartialName(customItem.ReplaceName, amount);
x.name = customItem.DisplayName;
x.skin = customItem.SkinID;
x.amount = amount;
item.amount -= amount;
item.MarkDirty();
return x;
}
return null;
}
private bool? CanStackItem(Item item, Item targetItem) {
if (item.skin != targetItem.skin) return false;
return null;
}
private object OnItemPickup(Item item, BasePlayer player) {
if (item.info.shortname.Contains("targeting.computer")) {
if (NetCups.Any(p => p.Value.DroppedNet.GetItem() == item)) {
UI_DrawMainInterface(player);
return false;
}
}
return null;
}
/*private void OnLootEntity(BasePlayer player, BaseEntity entity)
{
if (entity is RepairBench && NetCups.ContainsKey(entity))
{
UI_DrawMainInterface(player);
}
}*/
private void OnLootEntityEnd(BasePlayer player, BaseCombatEntity entity) {
var stash = entity.GetComponent<MarkerStash>();
if (stash != null && stash.StartDecay()) {
player.ChatMessage("Птичка в клетке! Бегите скорее домой, схрон самоуничтожится через минуту!");
}
}
private void OnHammerHit(BasePlayer player, HitInfo info) {
if (info == null || info.HitEntity == null) return;
var hitEntity = info.HitEntity;
if (hitEntity is RepairBench) {
if (NetCups.ContainsKey(hitEntity)) {
player.ChatMessage("На этом столе уже установлен компьютер!");
return;
}
else {
if (hitEntity.GetComponent<BaseCombatEntity>().SecondsSinceAttacked < 10) {
var computerId = ItemManager.FindItemDefinition("targeting.computer").itemid;
if (player.inventory.GetAmount(computerId) >= 1) {
player.inventory.Take(null, computerId, 1);
player.SendConsoleCommand("note.inv " + computerId + " -1");
NetCups.Add(hitEntity, new NetCup());
CreateNet(hitEntity, NetCups[hitEntity]);
}
else {
player.ChatMessage("У вас нету компьютера!");
return;
}
}
else {
player.ChatMessage($"Вы хотите установить компьютер на этот верстак?\n" + $"Для подтверждения повторите удар.");
hitEntity.GetComponent<BaseCombatEntity>().Hurt(0);
return;
}
}
}
}
private void CreateNet(BaseNetworkable net, NetCup cup) {
BaseEntity entity = net as BaseEntity;
if (entity == null || cup == null || cup.DroppedNet != null) return;
Item x = ItemManager.CreateByPartialName("targeting.computer", 1);
BaseEntity dropped = x.Drop(entity.transform.position + new Vector3(0, 1, 0), Vector3.down, entity.GetNetworkRotation());
UnityEngine.Object.Destroy(dropped.gameObject.GetComponent<Rigidbody>());
//dropped.GetComponent<DroppedItem>().allowPickup = false;
dropped.transform.eulerAngles = new Vector3(dropped.transform.eulerAngles.x, dropped.transform.eulerAngles.y + 180, dropped.transform.eulerAngles.z );
dropped.GetComponent<DroppedItem>().CancelInvoke(new Action(dropped.GetComponent<DroppedItem>().IdleDestroy));
dropped.SendNetworkUpdate();
entity.AddChild(dropped);
cup.DroppedNet = dropped;
}
private void RemoveNet(BaseNetworkable entity, NetCup cup) {
if (cup?.DroppedNet != null && !cup.DroppedNet.IsDestroyed) {
entity.RemoveChild(cup.DroppedNet);
cup.DroppedNet.Kill();
cup.DroppedNet = null;
}
else {
PrintWarning($"Try remove destroyed or not created item");
}
}
private object CanNetworkTo(BaseNetworkable entity, BasePlayer target) {
var mapComponent = entity.GetComponent<MapMarker>();
if (mapComponent != null) {
var x = mapComponent.GetComponent<VendingMachineMapMarker>();
if (x != null) {
if (x.server_vendingMachine != null) {
return null;
}
if (mapComponent.OwnerID != target.userID) {
return false;
}
}
}
return null;
}
ItemContainer.CanAcceptResult? CanAcceptItem(ItemContainer container, Item item, int targetPos) {
ResearchTable researchTable = container.entityOwner as ResearchTable;
if (GetMapFromItem(item) == null) return null;
if (researchTable != null) {
BasePlayer player = item.GetOwnerPlayer();
if (player != null) {
if (Settings.Maps.Any(p => p.IsThis(item))) {
researchTable.researchFinishedTime = UnityEngine.Time.realtimeSinceStartup + researchTable.researchDuration;
researchTable.Invoke(new Action(() => {
ProcessMap(player, researchTable.GetTargetItem());
researchTable.GetTargetItem().DoRemove();
researchTable.inventory.SetLocked(false);
Effect.server.Run(researchTable.researchSuccessEffect.resourcePath, researchTable, 0U, Vector3.zero, Vector3.zero, (Network.Connection) null, false);
researchTable.SetFlag(BaseEntity.Flags.On, false, false);
researchTable.researchFinishedTime = 0.0f;
researchTable.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
}
), researchTable.researchDuration);
researchTable.inventory.SetLocked(true);
researchTable.SetFlag(BaseEntity.Flags.On, true, false);
researchTable.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
player.inventory.loot.SendImmediate();
if (researchTable.researchStartEffect.isValid) {
Effect.server.Run(researchTable.researchStartEffect.resourcePath, researchTable, 0U, Vector3.zero, Vector3.zero, (Network.Connection) null, false);
}
}
}
return null;
}
return null;
}
#endregion
#region Interface
private Dictionary<ulong, Coroutine> HashCoroutines = new Dictionary<ulong, Coroutine>();
private const string MainLayer = "UI_MainLayerForComputer";
private const string ContentZone = "UI_ContentZone";
private void UI_DrawMainInterface(BasePlayer player) {
CuiHelper.DestroyUi(player, MainLayer);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
CursorEnabled = true, RectTransform = {
AnchorMin = "0.1666667 0.1666667", AnchorMax = "0.8333334 0.8333333", OffsetMax = "0 0"
}
, Image = {
Color = "0 0 0 0"
}
}
, "Overlay", MainLayer);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "-10 -10", AnchorMax = "10 10", OffsetMax = "0 0"
}
, Button = {
Color = "0 0 0 0.9", Material = "assets/content/ui/uibackgroundblur.mat"
}
, Text = {
Text = ""
}
}
, MainLayer);
container.Add(new CuiElement {
Parent = MainLayer, Components = {
new CuiImageComponent {
Color = HexToRustFormat("#444F39FF"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiElement {
Parent = MainLayer, Name = ContentZone, Components = {
new CuiImageComponent {
Color = "0 0 0 1", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "25 25", OffsetMax = "-25 -25"
}
,
}
}
);
CuiHelper.AddUi(player, container);
if (!HashCoroutines.ContainsKey(player.userID)) {
HashCoroutines.Add(player.userID, ServerMgr.Instance.StartCoroutine(UI_InitializeLoad(player)));
}
else {
CuiHelper.DestroyUi(player, MainLayer);
}
}
private const string LoaderLayer = "UI_MenuLaptopLoading";
private IEnumerator UI_InitializeLoad(BasePlayer player) {
CuiHelper.DestroyUi(player, LoaderLayer);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiElement {
Parent = ContentZone, Name = LoaderLayer, Components = {
new CuiImageComponent {
Color = "0 0 0 1", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
,
}
}
);
container.Add(new CuiLabel {
FadeOut = 0.3f, RectTransform = {
AnchorMin = "0.2905488 0.4861961", AnchorMax = "0.7094512 0.7466363", OffsetMax = "0 0"
}
, Text = {
Text = "ЗАГРУЗКА,\nПОДОЖДИТЕ", Font = "robotocondensed-bold.ttf", FontSize = 40, Align = TextAnchor.MiddleCenter
}
}
, LoaderLayer, LoaderLayer + ".WaitText");
container.Add(new CuiElement {
FadeOut = 0.3f, Parent = LoaderLayer, Name = LoaderLayer + ".SideBox", Components = {
new CuiImageComponent {
Color = HexToRustFormat("#FFFFFF64")
}
, new CuiRectTransformComponent {
AnchorMin = "0.3308594 0.3812508", AnchorMax = "0.6691406 0.4437501", OffsetMax = "0 0"
}
,
}
}
);
CuiHelper.AddUi(player, container);
for (int i = 0; i < 11; i++) {
CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox.CurrentPosition");
CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox.CurrentPosition.Text");
CuiElementContainer temp = new CuiElementContainer();
temp.Add(new CuiElement {
FadeOut = 0.3f, Parent = LoaderLayer + ".SideBox", Name = LoaderLayer + ".SideBox.CurrentPosition", Components = {
new CuiImageComponent {
FadeIn = 0.3f, Color = HexToRustFormat("#FFFFFFFF")
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = $"{(float) i / 10} 1", OffsetMax = "0 0"
}
,
}
}
);
temp.Add(new CuiLabel {
FadeOut = i == 10 ? 0.3f : 0f, RectTransform = {
AnchorMin = "0 -2", AnchorMax = "1 0", OffsetMax = "0 0"
}
, Text = {
Text = Settings.LoadSteps.ElementAt(i), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 10, Color = "1 1 1 1"
}
}
, LoaderLayer + ".SideBox", LoaderLayer + ".SideBox.CurrentPosition.Text");
CuiHelper.AddUi(player, temp);
if (i < 10) {
Effect.server.Run("assets/prefabs/npc/autoturret/effects/targetlost.prefab", player.transform.position);
}
if (i == 10) {
Effect.server.Run("assets/prefabs/npc/autoturret/effects/online.prefab", player.transform.position);
}
float waitTime = (float) Oxide.Core.Random.Range(0, 100) / 100;
if (i == 10) {
waitTime = 1f;
}
yield return new WaitForSeconds(waitTime);
}
CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox.CurrentPosition.Text");
CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox.CurrentPosition");
CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox");
CuiHelper.DestroyUi(player, LoaderLayer + ".WaitText");
timer.Once(1f, () => {
CuiHelper.DestroyUi(player, LoaderLayer);
UI_DrawUrl(player);
if (HashCoroutines.ContainsKey(player.userID)) HashCoroutines.Remove(player.userID);
}
);
}
private const string BrowserLayer = "UI_BrowserLayer";
private void UI_DrawUrl(BasePlayer player) {
CuiHelper.DestroyUi(player, BrowserLayer);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
FadeOut = 2f, CursorEnabled = true, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
, Image = {
FadeIn = 2f, Color = "0 0 0 1"
}
}
, ContentZone, BrowserLayer);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.02 0.9", AnchorMax = "0.18 0.96", OffsetMax = "0 0"
}
, Button = {
FadeIn = 2f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = "UI_ChangePage -1"
}
, Text = {
Text = "ПРОДАТЬ", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + ".Sell");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.2 0.9", AnchorMax = "0.8 0.96", OffsetMax = "0 0"
}
, Button = {
FadeIn = 2f, Color = HexToRustFormat("#FFFFFF15"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, Text = {
Text = "http://crimetalk.onion/items.php?page=1".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + ".Url");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.4 0.04", AnchorMax = "0.6 0.1", OffsetMax = "0 0"
}
, Button = {
FadeIn = 2f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, Text = {
Text = $"ВАШ БАЛАНС: {PlayerDrugs[player.userID].CurrentBalance} BTC".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + ".Balance");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.82 0.9", AnchorMax = "0.98 0.96", OffsetMax = "0 0"
}
, Button = {
FadeIn = 2f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = "UI_ChangePage -999"
}
, Text = {
Text = "ВЫЙТИ", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + ".Close");
CuiHelper.AddUi(player, container);
UI_DrawContent(player, 1, true);
}
private const string ItemsLayer = "UI_ItemsLayer";
private void UI_DrawContent(BasePlayer player, int page = 1, bool first = false) {
CuiHelper.DestroyUi(player, SellLayer);
CuiElementContainer container = new CuiElementContainer();
CuiHelper.DestroyUi(player, BrowserLayer + ".Url");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.2 0.9", AnchorMax = "0.8 0.96", OffsetMax = "0 0"
}
, Button = {
FadeIn = first ? 2f : 0f, Color = HexToRustFormat("#FFFFFF15"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, Text = {
Text = $"http://crimetalk.onion/items.php?page={page}".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + ".Url");
CuiHelper.DestroyUi(player, BrowserLayer + ".Back");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.02 0.04", AnchorMax = "0.18 0.1", OffsetMax = "0 0"
}
, Button = {
FadeIn = first ? 2f : 0f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = $"UI_ChangePage {page-1}"
}
, Text = {
Text = $"НАЗАД".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + ".Back");
CuiHelper.DestroyUi(player, BrowserLayer + ".Forward");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.82 0.04", AnchorMax = "0.98 0.1", OffsetMax = "0 0"
}
, Button = {
FadeIn = first ? 2f : 0f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = $"UI_ChangePage {page+1}"
}
, Text = {
Text = $"ВПЕРЁД".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + ".Forward");
CuiHelper.DestroyUi(player, BrowserLayer + ".Balance");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.4 0.04", AnchorMax = "0.6 0.1", OffsetMax = "0 0"
}
, Button = {
Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, Text = {
Text = $"ВАШ БАЛАНС: {PlayerDrugs[player.userID].CurrentBalance} BTC".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + ".Balance");
for (int i = 0; i < 32; i++) {
CuiHelper.DestroyUi(player, BrowserLayer + $".{i}.Img");
CuiHelper.DestroyUi(player, BrowserLayer + $".{i}");
}
foreach (var check in Settings.ShopItems.Select((i, t) => new {
A = i, B = t - (page - 1) * 32
}
).Skip((page - 1) * 32).Take(32)) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"{0.08282828 + check.B * 0.105 - Math.Floor((double) check.B / 8) * 8 * 0.105} {0.6818062 - Math.Floor((double) check.B / 8) * 0.18}", AnchorMax = $"{0.1834845 + check.B * 0.105 - Math.Floor((double) check.B / 8) * 8 * 0.105} {0.8554174 - Math.Floor((double) check.B / 8) * 0.18}", OffsetMax = "0 0"
}
, Button = {
Color = "1 1 1 0.01", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = $"UI_ChangePage buy {check.A.ReplaceName}"
}
, Text = {
Text = $"", Align = TextAnchor.LowerRight, Font = "robotocondensed-bold.ttf", FontSize = 15
}
}
, BrowserLayer, BrowserLayer + $".{check.B}");
container.Add(new CuiElement {
FadeOut = 0.3f, Parent = BrowserLayer + $".{check.B}", Name = BrowserLayer + $".{check.B}.Img", Components = {
new CuiRawImageComponent {
FadeIn = 0.3f, Png = (string) ImageLibrary.Call("GetImage", check.A.ReplaceName, (ulong) check.A.SkinID)
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 1", OffsetMax = "-5 -1"
}
}
}
);
container.Add(new CuiElement {
FadeOut = 0.3f, Parent = BrowserLayer + $".{check.B}", Name = BrowserLayer + $".{check.B}.Txt", Components = {
new CuiTextComponent {
Text = $"x{check.A.Amount}", Align = TextAnchor.LowerRight, Font = "robotocondensed-bold.ttf", FontSize = 15, Color = "1 1 1 0.6"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 1", OffsetMax = "-5 -1"
}
}
}
);
container.Add(new CuiElement {
FadeOut = 0.3f, Parent = BrowserLayer + $".{check.B}", Name = BrowserLayer + $".{check.B}.Txt2", Components = {
new CuiTextComponent {
Text = $"{check.A.Price} BTC", Color = HexToRustFormat("#4D6540FF"), Align = TextAnchor.UpperCenter, Font = "robotocondensed-bold.ttf", FontSize = 15
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 1", OffsetMax = "-5 -1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.8", Distance = "2 2"
}
}
}
);
}
CuiHelper.AddUi(player, container);
}
private const string SellLayer = "UI_SellLAyer";
private IEnumerator UI_SellPage(BasePlayer player) {
CuiHelper.DestroyUi(player, SellLayer);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
CursorEnabled = true, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
, Image = {
FadeIn = 1f, Color = "0 0 0 1"
}
}
, BrowserLayer, SellLayer);
CuiHelper.AddUi(player, container);
yield return new WaitForSeconds(1f);
container = new CuiElementContainer();
container.Add(new CuiLabel {
FadeOut = 0.3f, RectTransform = {
AnchorMin = "0 0.4861961", AnchorMax = "1 0.7466363", OffsetMax = "0 0"
}
, Text = {
FadeIn = 1f, Text = "ПРОДАЖА НА ЧЁРНОМ РЫНКЕ", Font = "robotocondensed-bold.ttf", FontSize = 30, Align = TextAnchor.MiddleCenter
}
}
, SellLayer, SellLayer + ".WaitText");
if (Settings.Drugs.All(p => p.GetAmount(player) == 0)) {
container.Add(new CuiLabel {
FadeOut = 0.3f, RectTransform = {
AnchorMin = "0 0.4061961", AnchorMax = "1 0.6866363", OffsetMax = "0 0"
}
, Text = {
FadeIn = 1f, Text = "Перед тем как что-то продавать, надо это что-то найти", Font = "robotocondensed-regular.ttf", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.6"
}
}
, SellLayer, SellLayer + ".WaitText2");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.4 0.4", AnchorMax = "0.6 0.47", OffsetMax = "0 0"
}
, Button = {
FadeIn = 1f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = "UI_ChangePage 1"
}
, Text = {
Text = $"НАЗАД".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotoco
// ... [Code preview truncated due to length. Full source in attached file] ...