C#:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
[Info("ClanTournament", "Molik", "0.0.1")]
public class ClanTournament : RustPlugin {
[PluginReference]
private Plugin Clans;
public class CupSettings {
public ulong ownerclan;
public bool isremove;
public uint build;
}
public List<CupSettings> ClanData = new List<CupSettings>();
[PluginReference]
private Plugin RustMap;
void AddMarker(CupSettings settings, string icon = "https://i.ibb.co/gj54RB5/1.png") {
if (string.IsNullOrEmpty(icon)) {
PrintWarning("Иконка нуль! Маркер не добавился!");
return;
}
RemoveMarker(settings);
string name = Clans?.Call("ClanAlready", settings.ownerclan) as string;
RustMap?.Call("ApiAddPointUrl", icon, $"priv{settings.build}", BaseNetworkable.serverEntities.Find(settings.build)?.transform.position, name, 0.06f);
}
void RemoveMarker(CupSettings settings) {
RustMap?.Call("ApiRemovePointUrl", $"priv{settings.build}");
}
void OnServerInitialized() {
try {
ClanData = Interface.GetMod().DataFileSystem.ReadObject<List<CupSettings>>(Name);
}
catch {
ClanData = new List<CupSettings>();
}
if (ClanData.Count > 0) {
foreach (var cup in ClanData) {
var entity = BaseNetworkable.serverEntities.Find(cup.build);
if (entity == null && cup.isremove == false) {
cup.isremove = true;
}
if (entity != null && cup.isremove == false) {
AddMarker(cup);
}
}
}
}
void OnServerSave() {
if (ClanData != null) Interface.Oxide.DataFileSystem.WriteObject(Name, ClanData);
}
void Unload() {
if (ClanData.Count > 0) {
foreach (var cup in ClanData) {
if (cup.isremove == false) {
RemoveMarker(cup);
}
}
}
if (ClanData != null) Interface.Oxide.DataFileSystem.WriteObject(Name, ClanData);
}
string CanRemove(BasePlayer player, BaseEntity entity) {
if (!(entity as BuildingPrivlidge)) return null;
var find = ClanData.FirstOrDefault(p => p.build == entity.net.ID);
if (find != null && find.isremove == false) {
return "Вы не имеете право удалять данный шкаф!";
}
return null;
}
object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
if (entity == null || info == null) return null;
if (info.InitiatorPlayer == null) return null;
if (entity as BuildingPrivlidge) {
var find = ClanData.FirstOrDefault(p => p.build == entity.net.ID);
if (find != null) {
var clan = Clans?.CallHook("CheckClans", entity.net.ID, info.InitiatorPlayer.OwnerID);
if (clan is bool && (bool)clan) {
info.InitiatorPlayer.ChatMessage("Вы не имеете право уничтожать турнирный шкаф своего же клана!");
info.damageTypes.ScaleAll(0f);
return false;
}
if (entity.OwnerID == info.InitiatorPlayer.userID) {
info.InitiatorPlayer.ChatMessage("Вы не имеете право уничтожать турнирный шкаф своего же клана!");
info.damageTypes.ScaleAll(0f);
return false;
}
}
}
return null;
}
bool CheckTournament(ulong owner) {
var find = ClanData.FirstOrDefault(p => p.ownerclan == owner);
if (find == null) {
return false;
}
if (find.isremove) {
return false;
}
return true;
}
void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
if (entity == null) return;
if (entity as BuildingPrivlidge && info != null && info.InitiatorPlayer != null) {
var find = ClanData.FirstOrDefault(p => p.build == entity.net.ID);
if (find != null) {
if (find.isremove == true) {
info.InitiatorPlayer.ChatMessage("Произошла критическая ошибка! Плагин не выдал очки");
return;
}
Clans?.CallHook("ScoreRemove", find.ownerclan, info.InitiatorPlayer.userID);
info.InitiatorPlayer.ChatMessage("<color=orange>Вы уничтожили турнирный шкаф чужого клана!</color>");
find.isremove = true;
string name = Clans?.Call("ClanAlready", find.ownerclan) as string;
string clanAttacker = Clans?.Call("ClanAlready", info.InitiatorPlayer.userID) as string;
foreach (var player13 in BasePlayer.activePlayerList) {
player13.ChatMessage($"Клан <color=orange>{clanAttacker}</color> взорвал шкаф клана <color=orange>{name}</color>");
}
RemoveMarker(find);
LogToFile("ClanTournament", $"Клан {name} вылетел из турнира в {DateTime.Now.ToString(CultureInfo.InvariantCulture)}", this);
}
}
}
public string CupLayer = "UI_CupLayer";
static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
static double CurrentTime() {
return DateTime.UtcNow.Subtract(epoch).TotalSeconds;
}
private double IsBlocked() {
var lefTime = SaveRestore.SaveCreatedTime.ToUniversalTime().Subtract(epoch).TotalSeconds + 93600 - CurrentTime();
return lefTime > 0 ? lefTime : 0;
}
private static T GetLookEntity<T>(BasePlayer player) {
RaycastHit hit;
if (Physics.Raycast(player.eyes.HeadRay(), out hit) == false) {
return default(T);
}
var entity = hit.GetEntity();
if (entity == null) {
return default(T);
}
return entity.GetComponent<T>();
}
[ChatCommand("regtc")]
void RegClanV2(BasePlayer player) {
var entity = GetLookEntity<BuildingPrivlidge>(player);
if (entity == null) {
player.ChatMessage("Для регистрации шкафа, вам надо навестись на него!");
return;
}
uint ent = entity.net.ID;
var build = entity.GetBuildingPrivilege(entity.WorldSpaceBounds()).GetBuilding();
int obj = 0;
var entities = player.GetBuildingPrivilege()?.GetBuilding()?.decayEntities;
if (entities != null) {
foreach (var entitys in entities) {
if (entitys.PrefabName.Contains("assets/prefabs/building core")) obj++;
}
}
object clans = Clans?.CallHook("ClanPoint", player.userID);
object clan = Clans?.CallHook("ClanCount", player.userID);
if (IsBlocked() == 0) {
player.ChatMessage("Прошло 26 часов.Вы опоздали!");
return;
}
if (clan is bool && !(bool)clan) {
player.ChatMessage("Либо вы не состоите в клане, либо вы не глава клана.");
return;
}
if (obj < 500) {
player.ChatMessage($"Нужно иметь больше 500 объектов!\nНа данный момент у вас {obj} объектов!");
return;
}
if (clans is int && (int)clans < 500) {
player.ChatMessage("Нужно иметь больше 500 очков!");
return;
}
var find = ClanData.FirstOrDefault(p => p.ownerclan == player.userID);
if (find != null) {
if (find.isremove == true) {
player.ChatMessage("Ваш шкаф был уничтожен!");
return;
}
player.ChatMessage("Вы уже участвуете в турнире!");
return;
}
CupSettings settings = new CupSettings() {
ownerclan = player.userID, isremove = false, build = ent
}
;
ClanData.Add(settings);
player.ChatMessage("Вы успешно зарегистрировались на турнир!");
AddMarker(settings);
string name = Clans?.Call("ClanAlready", settings.ownerclan) as string;
LogToFile("ClanTournament", $"Клан {name} зарегистрировались на турнир в {DateTime.Now.ToString(CultureInfo.InvariantCulture)}", this);
}
[ConsoleCommand("registration.clanssss")]
void RegClan(ConsoleSystem.Arg args) {
BasePlayer player = args.Player();
uint ent = uint.Parse(args.Args[0]);
CupSettings settings = new CupSettings() {
ownerclan = player.userID, isremove = false, build = ent
}
;
ClanData.Add(settings);
player.ChatMessage("Вы успешно зарегистрировались на турнир!");
CuiHelper.DestroyUi(player, CupLayer);
AddMarker(settings);
string name = Clans?.Call("ClanAlready", settings.ownerclan) as string;
LogToFile("ClanTournament", $"Клан {name} зарегистрировались на турнир в {DateTime.Now.ToString(CultureInfo.InvariantCulture)}", this);
}
private void OnLootEntity(BasePlayer player, BaseEntity entity) {
if (player == null || entity == null) return;
if (entity as BuildingPrivlidge) {
CuiHelper.DestroyUi(player, CupLayer);
if (entity.OwnerID != player.userID) return;
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
CursorEnabled = false, RectTransform = {
AnchorMin = "0.6505209 0.6833333", AnchorMax = "0.9473958 0.7722222"
}
, Image = {
Color = "0 0 0 0"
}
}
, "Overlay", CupLayer);
if (IsBlocked() == 0) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.3 0.3 0.3 1", Command = $""
}
, Text = {
Text = $"ПРОШЛО 26 ЧАСОВ!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 16
}
}
, CupLayer);
CuiHelper.AddUi(player, container);
return;
}
object clans = Clans?.CallHook("ClanPoint", player.userID);
object clan = Clans?.CallHook("ClanCount", player.userID);
if (clan is bool && !(bool)clan) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.3 0.3 0.3 1", Command = $""
}
, Text = {
Text = $"Ошибка! Возможно вы не состоите в клане, или же не являетесь главой клана в котором вы состоите", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 16
}
}
, CupLayer);
CuiHelper.AddUi(player, container);
return;
}
var build = entity.GetBuildingPrivilege(entity.WorldSpaceBounds()).GetBuilding();
var foundationlist = build.decayEntities.ToList().FindAll(p => p.PrefabName == "assets/prefabs/building core/foundation/foundation.prefab" || p.PrefabName == "assets/prefabs/building core/foundation.triangle/foundation.triangle.prefab");
if (foundationlist.Count < 150) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.3 0.3 0.3 1", Command = $""
}
, Text = {
Text = $"Необходимо иметь 150 фундаментов!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 16
}
}
, CupLayer);
CuiHelper.AddUi(player, container);
return;
}
if (clans is int && (int)clans < 1000) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.3 0.3 0.3 1", Command = $""
}
, Text = {
Text = $"Нужно 1000 очков!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 16
}
}
, CupLayer);
CuiHelper.AddUi(player, container);
return;
}
var find = ClanData.FirstOrDefault(p => p.ownerclan == player.userID);
if (find != null) {
if (find.isremove == true) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.3 0.3 0.3 1", Command = $""
}
, Text = {
Text = $"Ваш шкаф уже был уничтожен! вы вылетели с турнира!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 16
}
}
, CupLayer);
CuiHelper.AddUi(player, container);
return;
}
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.3 0.3 0.3 1", Command = $""
}
, Text = {
Text = $"Ошибка! Ваш клан уже зарегистрирован на турнир!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 16
}
}
, CupLayer);
CuiHelper.AddUi(player, container);
return;
}
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.3 0.3 0.3 1", Command = $"registration.clanssss {entity.net.ID}"
}
, Text = {
Text = $"ЗАРЕГИСТРИРОВАТЬСЯ НА ТУРНИР!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 16
}
}
, CupLayer);
CuiHelper.AddUi(player, container);
}
}
private void OnLootEntityEnd(BasePlayer player, BaseCombatEntity entity) => CuiHelper.DestroyUi(player, CupLayer);
bool CheckFarm(ulong owner) {
if (IsBlocked() == 0) {
return false;
}
return true;
}
object OnEntityGroundMissing(BaseEntity entity) {
if (entity == null) return null;
if (ClanData.Any(p => p.build == entity.net.ID)) {
return false;
}
return null;
}
}
}