- Языки
- Русский
- Английский
Данный плагин вам позволит удобно интегрировать возможности SkinDrops в ваш плагин, без необходимости в каждом новом плагине реализовывать API и разбираться в этом, за вас уже все сделали.
Данный плагин подходит в основном для разработчиков.
Плагин с примером будет прикреплен файлом, так же как и видео работы плагина-примера:
Данный плагин подходит в основном для разработчиков.
Для работы с плагином необходимо добавить референс непосредственно в заголовке .cs файла (там где вы обычно подключаете юзинги), сделать это можно таким образом:
В первую очередь нам нужен клиент с которым мы будем работать (их может быть неограниченное количество):
Теперь когда у нас есть клиент, можно приступать к работе, для начала надо проверить, какой статус у клиента с данным токеном:
Остальные методы клиента будут описаны ниже:
Получить предметы, которые в данный момент есть в инвентаре бота:
Получить определенный предмет по его id:
Отправить трейд оффер пользователю стим:
Получить все трейд офферы:
Получить определенный трейд оффер:
В первую очередь нам нужен клиент с которым мы будем работать (их может быть неограниченное количество):
C#:
// Requires: SkinDropsAPI
namespace Oxide.Plugins
{
public class MySkinDropsPlugin : RustPlugin
{
private SkinDropsAPI.Client client;
//секретный ключ вы можете вручную вписать, или же загрузить из конфигурации
private void Loaded() => client = new SkinDropsAPI.Client("secret");
}
}
Теперь когда у нас есть клиент, можно приступать к работе, для начала надо проверить, какой статус у клиента с данным токеном:
C#:
private void OnServerInitialized()
{
client.Status(result =>
{
if (result.Success) Puts($"Успешно, баланс пользователя: {result.User.Balance}");
else Puts($"Не удалось проверить статус аккаунта, проверьте токен!");
});
}
Остальные методы клиента будут описаны ниже:
Получить предметы, которые в данный момент есть в инвентаре бота:
C#:
void GetBotItems(double minPrice, double maxPrice, Action<BotItems> items, int pageSize = 25)
C#:
void GetBotItem(ulong id, Action<ItemData> result)
Отправить трейд оффер пользователю стим:
C#:
void SendTradeOffer(string tradeUrl, string item, Action<Offer> result)
C#:
void GetTradeOffers(Action<OfferList> result)
C#:
void GetTradeOffer(ulong id, Action<OfferData> result)
Плагин с примером будет прикреплен файлом, так же как и видео работы плагина-примера:
C#:
// Requires: SkinDropsAPI
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using static Oxide.Plugins.SkinDropsAPI;
namespace Oxide.Plugins
{
[Info("SkinDropsAPITest", "MaltrzD", "0.1")]
public class SkinDropsAPITest : RustPlugin
{
[PluginReference] private Plugin ImageLibrary;
SkinDropsAPI.Client client = new SkinDropsAPI.Client("secret");
[ChatCommand("c")]
private void Test(BasePlayer player)
{
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel
{
RectTransform =
{
AnchorMin = "0.202381 0.2619047",
AnchorMax = "0.7976192 0.7380952"
},
Image =
{
Color = "0.4 0.4 0.4 1"
}
}, "Overlay", "Panel");
container.Add(new CuiElement()
{
Parent = "Panel",
Name = "Text",
Components =
{
new CuiRectTransformComponent()
{
AnchorMin = "0.25 0.8060001",
AnchorMax = "0.7969998 0.9020001"
},
new CuiTextComponent()
{
Align = TextAnchor.MiddleCenter,
FontSize = 16,
Text = "Загрузка...",
Color = "0 1 0 1"
}
}
});
container.Add(new CuiElement()
{
Parent = "Panel",
Name = "Image",
Components =
{
new CuiRectTransformComponent()
{
AnchorMin = "0.3749999 0.25",
AnchorMax = "0.6250001 0.7500001"
},
new CuiRawImageComponent() { }
}
});
CuiHelper.AddUi(player, container);
client.GetBotItems(0, 0.5, items =>
{
if (items.Success && items.Count != 0)
{
var uniqueItems = items.Items
.GroupBy(item => item.Name)
.Select(group => group.First()).ToList();
ServerMgr.Instance.StartCoroutine(LoadImages(uniqueItems, 10, 1,
() => { ServerMgr.Instance.StartCoroutine(RollRoulette(player, uniqueItems)); }));
}
else
{
Puts("Не удалось получить список скинов бота!");
}
}, pageSize: 40);
}
private IEnumerator RollRoulette(BasePlayer player, List<BotItem> items, float updateRate = 1)
{
string GetItemName(string name) => name.Replace(' ', '_');
int count = 1;
foreach (var item in items)
{
string text = $"<color=yellow>{item.Name}</color> - <color=red>{item.Price}$</color>";
if (count >= items.Count)
{
// тут уже можете встроить отправку трейд оффера игроку, или продать например скин обратно
text = "Ваш выигрыш: " + text;
}
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiElement()
{
Parent = "Panel",
Name = "Image",
Update = true,
Components =
{
new CuiRectTransformComponent()
{
AnchorMin = "0.3749999 0.25",
AnchorMax = "0.6250001 0.7500001"
},
new CuiRawImageComponent()
{
Png = (string)ImageLibrary.Call("GetImage", GetItemName(item.Name))
}
}
});
container.Add(new CuiElement()
{
Parent = "Panel",
Name = "Text",
Update = true,
Components =
{
new CuiRectTransformComponent()
{
AnchorMin = "0.25 0.8060001",
AnchorMax = "0.7969998 0.9020001"
},
new CuiTextComponent()
{
Align = TextAnchor.MiddleCenter,
FontSize = 20,
Text = text
}
}
});
CuiHelper.AddUi(player, container);
count++;
yield return new WaitForSeconds(updateRate);
}
yield return new WaitForSeconds(5);
CuiHelper.DestroyUi(player, "Panel");
yield break;
}
private IEnumerator LoadImages(List<BotItem> items, int tryCount, float checkInterval, Action loaded)
{
int count = 0;
bool startLoading = false;
string GetItemName(string name) => name.Replace(' ', '_');
while (true)
{
if (!startLoading)
{
foreach (var img in items)
{
if (!ImageLibrary.Call<bool>("HasImage", GetItemName(img.Name)))
ImageLibrary.Call("AddImage", img.Image, GetItemName(img.Name));
}
startLoading = true;
}
else
{
foreach (var img in items)
{
if (!ImageLibrary.Call<bool>("HasImage", GetItemName(img.Name)))
{
yield return new WaitForSeconds(checkInterval);
}
else
{
loaded?.Invoke();
yield break;
}
}
}
if (count >= tryCount)
{
break;
}
count++;
yield return new WaitForSeconds(checkInterval);
}
loaded?.Invoke();
yield break;
}
}
}