C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using UnityEngine;
using Oxide.Core.Libraries.Covalence;
using Oxide.Game.Rust.Cui;
namespace Oxide.Plugins {
[Info("TPTeleportation", "Scrooge", "1.0.7")]
class TPTeleportation : RustPlugin {
[PluginReference]
Plugin ImageLibrary, Clans;
[PluginReference]
Plugin Friends;
Dictionary<ulong, Vector3> lastPositions = new Dictionary<ulong, Vector3>();
Dictionary<BasePlayer, int> spectatingPlayers = new Dictionary<BasePlayer, int>();
private const string Layer = "lay";
private class ButtonEntry {
public string Name;
public string Sprite;
public string Command;
public string Color;
public bool Close;
}
bool IsTeamate(BasePlayer player, ulong targetID) {
if (player.currentTeam == 0) return false;
//player.currentTeam
var team = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
if (team == null) return false;
var list = RelationshipManager.ServerInstance.FindTeam(player.currentTeam).members.Where(p => p == targetID).ToList();
return list.Count > 0;
}
class TP {
public BasePlayer Player;
public BasePlayer Player2;
public Vector3 pos;
public bool EnabledShip;
public int seconds;
public bool TPL;
public TP(BasePlayer player, Vector3 Pos, int Seconds, bool EnabledShip1, bool tpl, BasePlayer player2 = null) {
Player = player;
pos = Pos;
seconds = Seconds;
EnabledShip = EnabledShip1;
Player2 = player2;
TPL = tpl;
}
}
int homelimitDefault;
Dictionary<string, int> homelimitPerms;
int tpkdDefault;
Dictionary<string, int> tpkdPerms;
int tpkdhomeDefault;
Dictionary<string, int> tpkdhomePerms;
int teleportSecsDefault;
int resetPendingTime;
bool restrictCupboard;
bool enabledTPR;
bool homecupboard;
bool adminsLogs;
bool foundationOwner;
bool foundationOwnerFC;
bool restrictTPRCupboard;
bool foundationEx;
bool wipedData;
bool createSleepingBug;
string EffectPrefab1;
string EffectPrefab;
bool EnabledShipTP;
bool EnabledBallonTP;
bool CancelTPMetabolism;
bool CancelTPCold;
bool CancelTPRadiation;
bool FriendsEnabled;
bool CancelTPWounded;
bool EnabledTPLForPlayers;
int TPLCooldown;
int TplPedingTime;
bool TPLAdmin;
static DynamicConfigFile config;
Dictionary<string, int> teleportSecsPerms;
void OnNewSave() {
if (wipedData) {
PrintWarning("Обнаружен вайп.Очищаем данные с data/Teleportation");
WipeData();
}
}
void WipeData() {
LoadData();
tpsave = new List<TPList>();
homes = new Dictionary<ulong, Dictionary<string, Vector3>>();
SaveData();
}
protected override void LoadDefaultConfig() {
GetVariable(Config, "Запрещать отправлять запрос на телепортацию в зоне действия чужого шкафа", out homecupboard, true);
GetVariable(Config, "Звук уведомления при получение запроса на телепорт (пустое поле = звук отключен)", out EffectPrefab1, "assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab");
GetVariable(Config, "Звук предупреждения (пустое поле = звук отключен)", out EffectPrefab, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
GetVariable(Config, "Разрешать сохранять местоположение только на фундаменте", out foundationEx, true);
GetVariable(Config, "Создавать объект при сохранении местоположения в виде Sleeping Bag", out createSleepingBug, true);
GetVariable(Config, "Автоматический вайп данных при генерации новой карты", out wipedData, true);
GetVariable(Config, "Запрещать принимать запрос на телепортацию в зоне действия чужого шкафа", out restrictCupboard, true);
GetVariable(Config, "Запрещать сохранять местоположение если игрок не является владельцем фундамента", out foundationOwner, true);
GetVariable(Config, "Разрешать сохранять местоположение если игрок является другом или соклановцем или тимейтом владельца фундамента ", out foundationOwnerFC, true);
GetVariable(Config, "Логировать использование команд для администраторов", out adminsLogs, true);
GetVariable(Config, "Включить телепортацию (TPR/TPA) только к друзьям, соклановкам или тимейту", out FriendsEnabled, true);
GetVariable(Config, "Разрешить команду TPR игрокам (false = /tpr не будет работать)", out enabledTPR, true);
GetVariable(Config, "Разрешить отправку и приём телепорта и телепорт домой на корабле", out EnabledShipTP, true);
GetVariable(Config, "Разрешить отправку и приём телепорта на воздушном шаре", out EnabledBallonTP, true);
GetVariable(Config, "Запрещать отправлять запрос на телепортацию в зоне действия чужого шкафа", out restrictTPRCupboard, true);
GetVariable(Config, "Отмета телепорта игрока (Home/TP) если у него кровотечение", out CancelTPMetabolism, true);
GetVariable(Config, "Отмета телепорта игрока (Home/TP) если игрок ранен", out CancelTPWounded, true);
GetVariable(Config, "Отмета телепорта игрока (Home/TP) если ему холодно", out CancelTPCold, true);
GetVariable(Config, "Отмета телепорта игрока (Home/TP) если он облучен радиацией", out CancelTPRadiation, true);
GetVariable(Config, "Время ответа на запрос телепортации (в секундах)", out resetPendingTime, 15);
GetVariable(Config, "Ограничение на количество сохранённых местоположений", out homelimitDefault, 3);
GetVariable(Config, "[TPL] Разрешить игрокам использовать TPL", out EnabledTPLForPlayers, false);
GetVariable(Config, "[TPL] Задержка телепортации игрока на TPL", out TplPedingTime, 15);
GetVariable(Config, "[TPL] Cooldown телепортации игрока на TPL", out TPLCooldown, 15);
GetVariable(Config, "[TPL] Телепортировать админа без задержки и кулдауна?", out TPLAdmin, true);
Config["Ограничение на количество сохранённых местоположений с привилегией"] = homelimitPerms = GetConfig("Ограничение на количество сохранённых местоположений с привилегией", new Dictionary<string, object>() {
{
"tpteleportation.vip", 5
}
}
).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
PermissionService.RegisterPermissions(this, homelimitPerms.Keys.ToList());
GetVariable(Config, "Длительность задержки перед телепортацией (в секундах)", out teleportSecsDefault, 15);
Config["Длительность задержки перед телепортацией с привилегией (в секундах)"] = teleportSecsPerms = GetConfig("Длительность задержки перед телепортацией с привилегией (в секундах)", new Dictionary<string, object>() {
{
"tpteleportation.vip", 10
}
}
).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
PermissionService.RegisterPermissions(this, teleportSecsPerms.Keys.ToList());
GetVariable(Config, "Длительность перезарядки телепорта (в секундах)", out tpkdDefault, 300);
Config["Длительность перезарядки телепорта с привилегией (в секундах)"] = tpkdPerms = GetConfig("Длительность перезарядки телепорта с привилегией (в секундах)", new Dictionary<string, object>() {
{
"tpteleportation.vip", 150
}
}
).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
PermissionService.RegisterPermissions(this, tpkdPerms.Keys.ToList());
GetVariable(Config, "Длительность перезарядки телепорта домой (в секундах)", out tpkdhomeDefault, 300);
Config["Длительность перезарядки телепорта домой с привилегией (в секундах)"] = tpkdhomePerms = GetConfig("Длительность перезарядки телепорта домой с привилегией (в секундах)", new Dictionary<string, object>() {
{
"tpteleportation.vip", 150
}
}
).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
PermissionService.RegisterPermissions(this, tpkdhomePerms.Keys.ToList());
SaveConfig();
}
T GetConfig<T>(string name, T defaultValue) => Config[name] == null ? defaultValue : (T)Convert.ChangeType(Config[name], typeof(T));
public static void GetVariable<T>(DynamicConfigFile config, string name, out T value, T defaultValue) {
config[name] = value = config[name] == null ? defaultValue : (T)Convert.ChangeType(config[name], typeof(T));
}
public static class PermissionService {
public static Permission permission = Interface.GetMod().GetLibrary<Permission>();
public static bool HasPermission(ulong uid, string permissionName) {
return !string.IsNullOrEmpty(permissionName) && permission.UserHasPermission(uid.ToString(), permissionName);
}
public static void RegisterPermissions(Plugin owner, List<string> permissions) {
if (owner == null) throw new ArgumentNullException("owner");
if (permissions == null) throw new ArgumentNullException("commands");
foreach (var permissionName in permissions.Where(permissionName => !permission.PermissionExists(permissionName))) {
permission.RegisterPermission(permissionName, owner);
}
}
}
public BasePlayer FindBasePlayer(string nameOrUserId) {
nameOrUserId = nameOrUserId.ToLower();
foreach (var player in BasePlayer.activePlayerList) {
if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
}
foreach (var player in BasePlayer.sleepingPlayerList) {
if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
}
return default(BasePlayer);
}
List<Vector3> OutpostSpawns = new List<Vector3>();
List<Vector3> BanditSpawns = new List<Vector3>();
void FindTowns() {
foreach (MonumentInfo monument in UnityEngine.Object.FindObjectsOfType<MonumentInfo>()) {
if (monument.name.ToLower().Contains("compound")) {
List<BaseEntity> list = new List<BaseEntity>();
Vis.Entities(monument.transform.position, 25, list);
foreach (BaseEntity entity in list) {
if (entity.name.Contains("researchtable_static")) {
Vector3 chairPos = entity.transform.position;
chairPos.x += -5;
if (!OutpostSpawns.Contains(chairPos)) OutpostSpawns.Add(chairPos);
}
}
}
else if (monument.name.Contains("bandit")) {
var list = new List<BaseEntity>();
Vis.Entities(monument.transform.position, 50, list);
foreach (BaseEntity entity in list) {
if (entity.name.Contains("chair_c.static")) {
Vector3 chairPos = entity.transform.position;
chairPos.y += 10;
if (!BanditSpawns.Contains(chairPos)) BanditSpawns.Add(chairPos);
}
}
}
}
}
private readonly int groundLayer = LayerMask.GetMask("Terrain", "World");
private readonly int buildingMask = Rust.Layers.Server.Buildings;
Dictionary<ulong, Dictionary<string, Vector3>> homes;
List<TPList> tpsave;
class TPList {
public string Name;
public Vector3 pos;
}
Dictionary<ulong, int> cooldownsTP = new Dictionary<ulong, int>();
Dictionary<ulong, int> cooldownsHOME = new Dictionary<ulong, int>();
List<TP> tpQueue = new List<TP>();
List<TP> pendings = new List<TP>();
List<ulong> sethomeBlock = new List<ulong>();
public List<BasePlayer> OpenTeleportMenu = new List<BasePlayer>();
private void DDrawMenu(BasePlayer player) {
CuiHelper.DestroyUi(player, Layer);
CuiElementContainer container = new CuiElementContainer();
List<ButtonEntry> buttons = new List<ButtonEntry>();
container.Add(new CuiElement {
Name = Layer + ".Main", Parent = ".Mains", Components = {
new CuiRawImageComponent {
Png = (string)ImageLibrary.Call("GetImage", "fontp")
}
, new CuiRectTransformComponent {
AnchorMin = "-0.315 -0.27", AnchorMax = "1.3 1.275", OffsetMax = "0 0"
}
,
}
}
);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.8 0.804", AnchorMax = "0.817 0.832"
}
, Button = {
Close = "Menu_UI", Color = "0 0 0 0"
}
, Text = {
Text = ""
}
}
, Layer + ".Main");
container.Add(new CuiElement {
Name = "TPMENULAYER", Parent = Layer + ".Main", Components = {
new CuiImageComponent {
Color = "0.35 0.34 0.32 0", Material = "assets/icons/iconmaterial.mat"
}
, new CuiRectTransformComponent {
AnchorMin = "0.2 0.1", AnchorMax = "0.8 0.79"
}
}
}
);
container.Add(new CuiElement {
Name = "TPMENULAYER1", Parent = Layer + ".Main", Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0.362 0.312", AnchorMax = "0.71 0.403"
}
}
}
);
container.Add(new CuiElement {
Name = "TPMENULAYER2", Parent = Layer + ".Main", Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0.362 0.44", AnchorMax = "0.71 0.532"
}
}
}
);
container.Add(new CuiElement {
Parent = "TPMENULAYER", Components = {
new CuiTextComponent() {
Color = "1 1 1 0.45", Text = "Телепортация\nк другу", FontSize = 12, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0.145 0.2", AnchorMax = "0.25 0.85"
}
,
}
}
);
container.Add(new CuiElement {
Parent = "TPMENULAYER", Components = {
new CuiTextComponent() {
Color = "1 1 1 0.45", Text = "Телепортация\nдомой", FontSize = 12, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0.145 0.285", AnchorMax = "0.25 0.4"
}
,
}
}
);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.311 0.73", AnchorMax = "0.396 0.863"
}
, Button = {
Close = Layer, Command = $"chat.say /banditcamp", Color = "0 0 0 0"
}
, Text = {
Text = $"\n\nГород бандитов", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.3", Font = "robotocondensed-bold.ttf"
}
}
, "TPMENULAYER");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.409 0.73", AnchorMax = "0.494 0.863"
}
, Button = {
Close = Layer, Command = $"chat.say /outpost", Color = "0 0 0 0"
}
, Text = {
Text = $"\n\nГород\nNPC", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.45", Font = "robotocondensed-bold.ttf"
}
}
, "TPMENULAYER");
if (CheckGetHomes(player).Count < GetHomeLimit(player.userID)) {
var pos = GetGrid(player.transform.position, false);
{
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.507 0.73", AnchorMax = "0.592 0.863"
}
, Button = {
Close = Layer, Command = $"tp.cmd sethome {pos}", Color = "0 0 0 0"
}
, Text = {
Text = $"\n\nСохранить Дом", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.45", Font = "robotocondensed-bold.ttf"
}
}
, "TPMENULAYER");
}
}
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.311 0.66", AnchorMax = "0.494 0.71"
}
, Button = {
Close = Layer, Command = $"chat.say /tpa", Color = "0 0 0 0"
}
, Text = {
Text = $"Принять ТП", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.45", Font = "robotocondensed-bold.ttf"
}
}
, "TPMENULAYER");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.605 0.73", AnchorMax = "0.69 0.863"
}
, Button = {
Close = Layer, Command = $"chat.say /atp", Color = "0 0 0 0"
}
, Text = {
Text = $"\n\nАвто\n прием ТП", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.45", Font = "robotocondensed-bold.ttf"
}
}
, "TPMENULAYER");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.507 0.66", AnchorMax = "0.69 0.71"
}
, Button = {
Close = Layer, Command = $"chat.say /tpc", Color = "0 0 0 0"
}
, Text = {
Text = "Отклонить ТП", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.45", Font = "robotocondensed-bold.ttf"
}
}
, "TPMENULAYER");
if (CheckGetHomes(player).Count >= 1) {
float width = 0.15f, height = 1f, startxBox = 0.005f, startyBox = 1f - height, xmin = startxBox, ymin = startyBox;
foreach (var check in CheckGetHomes(player)) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = xmin + " " + ymin, AnchorMax = (xmin + width) + " " + (ymin + height * 1), OffsetMax = "0 0"
}
, Button = {
Close = Layer, Command = $"tp.cmd home {check.Key}", Color = "0 0 0 0"
}
, Text = {
Text = $"\n\n{check.Key}", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.3", Font = "robotocondensed-bold.ttf"
}
}
, "TPMENULAYER1", "Homes" );
container.Add(new CuiElement {
Parent = "Homes", Components = {
new CuiRawImageComponent {
Png = (string)ImageLibrary.Call("GetImage", "fonhome")
}
, new CuiRectTransformComponent {
AnchorMin = "0 0.3", AnchorMax = "1.01 1", OffsetMin = "24 13", OffsetMax = "-24 -13"
}
,
}
}
);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.8 0.8", AnchorMax = "1 1"
}
, Button = {
Command = $"tp.cmd removehome {check.Key}", Color = "0.88 0.34 0.34 0.5"
}
, Text = {
Text = "✕", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.5", Font = "robotocondensed-regular.ttf"
}
}
, "Homes");
xmin += width + 0.018f;
if (xmin + width >= 1) {
xmin = startxBox + 0.1f;
ymin -= height;
}
}
}
RelationshipManager.PlayerTeam playerTeam = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
if (player.currentTeam != 0 && playerTeam.members.Count >= 2) {
float width = 0.15f, height = 1f, startxBox = 0.005f, startyBox = 1f - height, xmin = startxBox, ymin = startyBox;
foreach (var check in playerTeam.members) {
BasePlayer friend = FindBasePlayer(check.ToString());
if (friend.displayName != player.displayName) {
container.Add(new CuiButton {
RectTransform = {
AnchorMin = xmin + " " + ymin, AnchorMax = (xmin + width) + " " + (ymin + height * 1), OffsetMax = "0 0"
}
, Button = {
Close = Layer, Color = "0 0 0 0.7", FadeIn = 0.1f
}
, Text = {
Text = $"", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.45", Font = "robotocondensed-bold.ttf"
}
}
, "TPMENULAYER2", "Users");
container.Add(new CuiElement {
Parent = "Users", Components = {
new CuiRawImageComponent {
Png = (string)ImageLibrary.Call("GetImage", friend.UserIDString)
}
, new CuiRectTransformComponent {
AnchorMin = "0 0.25", AnchorMax = "1 1", OffsetMin = "17 9", OffsetMax = "-17 -9"
}
,
}
}
);
container.Add(new CuiElement {
Parent = "Users", Components = {
new CuiRawImageComponent {
Png = (string)ImageLibrary.Call("GetImage", "fonavatar")
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
,
}
}
);
var online = BasePlayer.Find(friend.userID.ToString()).IsConnected == true ? "fononline" : "fonoffline";
container.Add(new CuiElement {
Parent = "Users", Components = {
new CuiRawImageComponent {
Png = (string)ImageLibrary.Call("GetImage", online)
}
, new CuiRectTransformComponent {
AnchorMin = "0.35 0.7", AnchorMax = "0.68 0.9", OffsetMax = "0 0"
}
,
}
}
);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 0.78", OffsetMax = "0 0"
}
, Button = {
Color = "0 0 0 0"
}
, Text = {
Text = $"\n\n{friend.displayName}", Color = "1 1 1 0.3", Align = TextAnchor.UpperCenter, FontSize = 12, Font = "robotocondensed-bold.ttf"
}
}
, "Users");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
, Button = {
Color = "0 0 0 0", Command = $"tp.cmd tpr {friend.displayName}"
}
, Text = {
Text = ""
}
}
, "Users");
xmin += width + 0.018f;
if (xmin + width >= 1) {
xmin = startxBox + 0.1f;
ymin -= height;
}
}
}
}
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, container);
}
[ConsoleCommand("tp.cmd")]
void PlayerCMD(ConsoleSystem.Arg args) {
var player = args.Player();
switch (args.Args[0].ToLower()) {
case "tpr" : player.Command($"chat.say \"/tpr {args.Args[1]}\"");
OpenTeleportMenu.Remove(player);
break;
case "tpc" : player.Command($"chat.say \"/tpc\"");
OpenTeleportMenu.Remove(player);
break;
case "tpa" : player.Command($"chat.say \"/tpa\"");
OpenTeleportMenu.Remove(player);
break;
case "home" : player.Command($"chat.say \"/home {args.Args[1]}\"");
OpenTeleportMenu.Remove(player);
break;
case "sethome" : player.Command($"chat.say \"/sethome {args.Args[1]}\"");
OpenTeleportMenu.Remove(player);
break;
case "removehome" : player.Command($"chat.say \"/removehome {args.Args[1]}\"");
OpenTeleportMenu.Remove(player);
break;
case "atp" : player.Command("chat.say /atp");
DDrawMenu(player);
break;
}
}
Dictionary<string, Vector3> CheckGetHomes(BasePlayer player) {
var homelist = GetHomes(player.userID) ?? new Dictionary<string, Vector3>();
return homelist.GroupBy(p => p.Key).ToDictionary(p => p.Key, p => p.First().Value);
}
public List<ulong> GetFriends(ulong playerid = 2952192) {
if (Friends) {
var friends = Friends?.Call("GetFriends", playerid) as ulong[];
return friends.ToList();
}
return new List<ulong>();
}
private string GetGrid(Vector3 position, bool addVector) {
var roundedPos = new Vector2(World.Size / 2 + position.x, World.Size / 2 - position.z);
var grid = $"{NumberToLetter((int)(roundedPos.x / 150))}{(int)(roundedPos.y / 150)}";
if (addVector) grid += $" {position.ToString().Replace(", ", "")}";
return grid;
}
private string NumberToLetter(int num) {
var num2 = Mathf.FloorToInt((float)(num / 26));
var num3 = num % 26;
var text = string.Empty;
if (num2 > 0) for (var i = 0; i < num2; i++) text += Convert.ToChar(65 + i);
return text + Convert.ToChar(65 + num3);
}
private static string HexToCuiColor(string hex) {
if (string.IsNullOrEmpty(hex)) {
hex = "#FFFFFFFF";
}
var str = hex.Trim('#');
if (str.Length == 6) str += "FF";
if (str.Length != 8) {
throw new Exception(hex);
throw new InvalidOperationException("Cannot convert a wrong format.");
}
var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
var a = byte.Parse(str.Substring(6, 2), NumberStyles.HexNumber);
Color color = new Color32(r, g, b, a);
return $"{color.r:F2} {color.g:F2} {color.b:F2} {color.a:F2}";
}
void AddPlayerAutoTP(BasePlayer player) {
if (!AutoTPA.ContainsKey(player.userID)) AutoTPA.Add(player.userID, new AutoTPASettings());
if (GetFriends(player.userID).Count >= 0) {
foreach (var friend in GetFriends(player.userID)) {
var covFriend = covalence.Players.FindPlayerById(friend.ToString());
if (covFriend == null) continue;
if (AutoTPA[player.userID].PlayersList.ContainsKey(covFriend.Name)) return;
AutoTPA[player.userID].PlayersList.Add(covFriend.Name, ulong.Parse(covFriend.Id));
}
}
}
[ChatCommand("atp")]
void cmdAutoTPA(BasePlayer player, string com, string[] args) {
if (!AutoTPA.ContainsKey(player.userID)) {
AutoTPA.Add(player.userID, new AutoTPASettings());
}
if (args == null || args.Length <= 0) {
if (AutoTPA[player.userID].Enabled) {
AutoTPA[player.userID].Enabled = false;
SendReply(player, "Вы успешно <color=#FDAE37>отключили</color> автопринятие запроса на телепорт");
DDrawMenu(player);
}
else {
AutoTPA[player.userID].Enabled = true;
SendReply(player, "Вы успешно <color=#FDAE37>включили</color> автопринятие запроса на телепорт");
DDrawMenu(player);
}
}
}
[ConsoleCommand("sethome")]
void cmdChatSetHome(ConsoleSystem.Arg arg) {
var player = arg.Player();
if (player == null) return;
if (arg.Args == null || arg.Args.Length < 1) return;
cmdChatSetHome(player, "", new[] {
arg.Args[0]
}
);
}
[ChatCommand("sethome")]
void cmdChatSetHome(BasePlayer player, string command, string[] args) {
var uid = player.userID;
var pos = player.PivotPoint();
var foundation = GetFoundation(pos);
var bulds = GetBuldings(pos);
if (foundationEx && foundation == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["foundationmissing"]);
return;
}
if (!foundationEx && bulds == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["foundationmissing"]);
return;
}
if (args.Length != 1) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["sethomeArgsError"]);
return;
}
if (CancelTPMetabolism && player.metabolism.bleeding.value > 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["woundedAction"]);
return;
}
if (CancelTPRadiation && player.radiationLevel > 10) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["Radiation"]);
return;
}
if (player.IsWounded() && CancelTPWounded) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["woundedAction"]);
return;
}
if (sethomeBlock.Contains(player.userID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["sethomeBlock"]);
return;
}
if (foundationOwnerFC && foundationOwner) {
if (!foundationEx && bulds.OwnerID != uid) {
if (!IsTeamate(player, bulds.OwnerID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["foundationownerFC"]);
return;
}
}
if (foundationEx && foundation.OwnerID != uid) {
if (!IsTeamate(player, bulds.OwnerID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["foundationownerFC"]);
return;
}
}
}
if (foundationOwner) {
if (foundationEx && foundation.OwnerID != uid && foundationOwnerFC == (IsTeamate(player, bulds.OwnerID))) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["foundationowner"]);
return;
}
if (!foundationEx && bulds.OwnerID != uid && foundationOwnerFC == (IsTeamate(player, bulds.OwnerID))) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["foundationowner"]);
return;
}
}
var name = args[0];
SetHome(player, name);
}
[ChatCommand("removehome")]
void cmdChatRemoveHome(BasePlayer player, string command, string[] args) {
if (args.Length != 1) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["removehomeArgsError"]);
return;
}
if (!homes.ContainsKey(player.userID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homesmissing"]);
return;
}
var name = args[0];
var playerHomes = homes[player.userID];
if (!playerHomes.ContainsKey(name)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homenotexist"]);
return;
}
foreach (var sleepingBag in SleepingBag.FindForPlayer(player.userID, true)) {
if (Vector3.Distance(sleepingBag.transform.position, playerHomes[name]) < 1) {
sleepingBag.Kill();
break;
}
}
Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
playerHomes.Remove(name);
SendReply(player, Messages["removehomesuccess"], name);
DDrawMenu(player);
}
[ConsoleCommand("home")]
void cmdHome(ConsoleSystem.Arg arg) {
var player = arg.Player();
if (player == null) return;
if (arg.Args == null || arg.Args.Length < 1) return;
cmdChatHome(player, "", new[] {
arg.Args[0]
}
);
}
[ConsoleCommand("tpa")]
void cmdTpa(ConsoleSystem.Arg arg) {
var player = arg.Player();
if (player == null) return;
cmdChatTpa(player, "", new String[0]);
}
[ChatCommand("homelist")]
private void cmdHomeList(BasePlayer player, string command, string[] args) {
if (!homes.ContainsKey(player.userID) || homes[player.userID].Count == 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homesmissing"]);
return;
}
var playerHomes = homes[player.userID];
var time = (GetHomeLimit(player.userID) - playerHomes.Count);
var homelist = playerHomes.Select(x => GetSleepingBag(x.Key, x.Value) != null ? $"{x.Key} {x.Value}" : $"Дом: {x.Key} {x.Value}");
foreach (var home in playerHomes.ToList()) {
if (createSleepingBug) {
if (!GetSleepingBag(home.Key, home.Value)) playerHomes.Remove(home.Key);
}
}
SendReply(player, Messages["homeslist"], time, string.Join("\n", homelist.ToArray()));
}
[ChatCommand("home")]
void cmdChatHome(BasePlayer player, string command, string[] args) {
if (args.Length != 1) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homeArgsError"]);
return;
}
var ret = Interface.Call("CanTeleport", player) as string;
if (ret != null) {
SendReply(player, ret);
return;
}
if (!EnabledShipTP && player.GetParentEntity() is CargoShip) {
SendReply(player, Messages["PlayerIsOnCargoShip"]);
return;
}
if (!EnabledBallonTP && player.GetParentEntity() is HotAirBalloon) {
SendReply(player, Messages["PlayerIsOnHotAirBalloon"]);
return;
}
if (player.IsWounded() && CancelTPWounded) {
SendReply(player, Messages["woundedAction"]);
return;
}
if (player.metabolism.bleeding.value > 0 && CancelTPMetabolism) {
SendReply(player, Messages["woundedAction"]);
return;
}
if (CancelTPRadiation && player.radiationLevel > 10) {
SendReply(player, Messages["Radiation"]);
return;
}
int seconds;
if (cooldownsHOME.TryGetValue(player.userID, out seconds) && seconds > 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, string.Format(Messages["tpkd"], TimeToString(seconds)));
return;
}
if (homecupboard) {
var privilege = player.GetBuildingPrivilege(player.WorldSpaceBounds());
if (privilege != null && !player.IsBuildingAuthed()) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tphomecupboard"]);
return;
}
}
if (!homes.ContainsKey(player.userID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homesmissing"]);
return;
}
var name = args[0];
var playerHomes = homes[player.userID];
if (!playerHomes.ContainsKey(name)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homenotexist"]);
return;
}
var time = GetTeleportTime(player.userID);
var pos = playerHomes[name];
SleepingBag bag = GetSleepingBag(name, pos);
if (createSleepingBug) {
if (bag == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["sleepingbagmissing"]);
playerHomes.Remove(name);
return;
}
}
if (!createSleepingBug) {
var bulds = GetBuldings(pos);
if (bulds == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["foundationmissingR"]);
playerHomes.Remove(name);
return;
}
}
if (CancelTPCold && player.metabolism.temperature.value < 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["coldplayer"]);
return;
}
if (tpQueue.Any(p => p.Player == player) || pendings.Any(p => p.Player2 == player)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tpError"]);
return;
}
var lastTp = tpQueue.Find(p => p.Player == player);
if (lastTp != null) {
tpQueue.Remove(lastTp);
}
tpQueue.Add(new TP(player, pos, time, false, false));
Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, String.Format(Messages["homequeue"], name, TimeToString(time)));
}
[ChatCommand("outpost")]
void ChatOutpost(BasePlayer player) {
if (OutpostSpawns.Count == 0) {
SendReply(player, "Позиция города нпс не найдена");
return;
}
if (!EnabledShipTP && player.GetParentEntity() is CargoShip) {
SendReply(player, Messages["PlayerIsOnCargoShip"]);
return;
}
if (!EnabledBallonTP && player.GetParentEntity() is HotAirBalloon) {
SendReply(player, Messages["PlayerIsOnHotAirBalloon"]);
return;
}
if (player.IsWounded() && CancelTPWounded) {
SendReply(player, Messages["woundedAction"]);
return;
}
if (player.metabolism.bleeding.value > 0 && CancelTPMetabolism) {
SendReply(player, Messages["woundedAction"]);
return;
}
if (CancelTPRadiation && player.radiationLevel > 10) {
SendReply(player, Messages["Radiation"]);
return;
}
int seconds;
if (cooldownsHOME.TryGetValue(player.userID, out seconds) && seconds > 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, string.Format(Messages["tpkd"], TimeToString(seconds)));
return;
}
if (CancelTPCold && player.metabolism.temperature.value < 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["coldplayer"]);
return;
}
var lastTp = tpQueue.Find(p => p.Player == player);
if (lastTp != null) {
tpQueue.Remove(lastTp);
}
tpQueue.Add(new TP(player, OutpostSpawns[new System.Random().Next(OutpostSpawns.Count)], 15, false, false));
Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, "Телепортация в город npc будет через 15 секунд");
}
[ChatCommand("bandit")]
void ChatBanditcamp(BasePlayer player) {
if (BanditSpawns.Count == 0) {
SendReply(player, "Позиция города бандитов не найдена");
return;
}
if (!EnabledShipTP && player.GetParentEntity() is CargoShip) {
SendReply(player, Messages["PlayerIsOnCargoShip"]);
return;
}
if (!EnabledBallonTP && player.GetParentEntity() is HotAirBalloon) {
SendReply(player, Messages["PlayerIsOnHotAirBalloon"]);
return;
}
if (player.IsWounded() && CancelTPWounded) {
SendReply(player, Messages["woundedAction"]);
return;
}
if (player.metabolism.bleeding.value > 0 && CancelTPMetabolism) {
SendReply(player, Messages["woundedAction"]);
return;
}
if (CancelTPRadiation && player.radiationLevel > 10) {
SendReply(player, Messages["Radiation"]);
return;
}
int seconds;
if (cooldownsHOME.TryGetValue(player.userID, out seconds) && seconds > 0) {
// ... [Code preview truncated due to length. Full source in attached file] ...