C#:
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins {
[Info("Teleportation", "TopPlugin.ru", "1.5.16")]
class Teleportation : RustPlugin {
[PluginReference]
Plugin Clans;
[PluginReference]
Plugin Friends;
Dictionary<ulong, Vector3> lastPositions = new Dictionary<ulong, Vector3>();
Dictionary<BasePlayer, int> spectatingPlayers = new Dictionary<BasePlayer, int>();
bool IsClanMember(ulong playerid = 2834432, ulong targetID = 0) {
return (bool)(Clans?.Call("HasFriend", playerid, targetID) ?? false);
}
bool IsFriends(ulong playerID = 0, ulong friendId = 0) => (bool)(Friends?.Call("AreFriends", playerID, friendId) ?? false);
bool IsTeamate(BasePlayer player, ulong targetID) {
if (player.currentTeam == 0) return false;
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;
}
}
const string TPADMIN = "teleportation.admin";
int homelimitDefault;
Dictionary<string, int> homelimitPerms;
int tpkdDefault;
Dictionary<string, int> tpkdPerms;
int tpkdhomeDefault;
Dictionary<string, int> tpkdhomePerms;
int teleportSecsDefault;
bool restrictCupboard;
bool enabledTPR;
bool homecupboard;
bool homecupboardblock;
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;
string AutoTPAPermission;
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 homecupboardblock, 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 AutoTPAPermission, "teleportation.autotpa");
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 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);
GetVariable(Config, "Длительность перезарядки телепорта (в секундах)", out tpkdDefault, 300);
GetVariable(Config, "Длительность перезарядки телепорта домой (в секундах)", out tpkdhomeDefault, 300);
GetVariable(Config, "Длительность задержки перед телепортацией (в секундах)", out teleportSecsDefault, 15);
Config["Ограничение на количество сохранённых местоположений с привилегией"] = homelimitPerms = GetConfig("Ограничение на количество сохранённых местоположений с привилегией", new Dictionary<string, object>() {
{
"teleportation.vip", 5
}
}
).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
PermissionService.RegisterPermissions(this, homelimitPerms.Keys.ToList());
Config["Длительность задержки перед телепортацией с привилегией (в секундах)"] = teleportSecsPerms = GetConfig("Длительность задержки перед телепортацией с привилегией (в секундах)", new Dictionary<string, object>() {
{
"teleportation.vip", 10
}
}
).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
PermissionService.RegisterPermissions(this, teleportSecsPerms.Keys.ToList());
Config["Длительность перезарядки телепорта с привилегией (в секундах)"] = tpkdPerms = GetConfig("Длительность перезарядки телепорта с привилегией (в секундах)", new Dictionary<string, object>() {
{
"teleportation.vip", 150
}
}
).ToDictionary(p => p.Key, p => Convert.ToInt32(p.Value));
PermissionService.RegisterPermissions(this, tpkdPerms.Keys.ToList());
Config["Длительность перезарядки телепорта домой с привилегией (в секундах)"] = tpkdhomePerms = GetConfig("Длительность перезарядки телепорта домой с привилегией (в секундах)", new Dictionary<string, object>() {
{
"teleportation.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);
}
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>();
[ChatCommand("atp")]
void cmdAutoTPA(BasePlayer player, string com, string[] args) {
if (!PermissionService.HasPermission(player.userID, AutoTPAPermission)) {
SendReply(player, Messages["TPAPerm"]);
return;
}
if (!AutoTPA.ContainsKey(player.userID)) AutoTPA.Add(player.userID, new AutoTPASettings());
var data = AutoTPA[player.userID];
if (args == null || args.Length <= 0) {
if (data.Enabled) {
data.Enabled = false;
SendReply(player, Messages["TPADisable"]);
}
else {
data.Enabled = true;
SendReply(player, string.Format(Messages["TPAEnabled"], Messages["TPAEnabledInfo"]));
}
return;
}
switch (args[0]) {
case "add" : if (args.Length < 2) {
SendReply(player, Messages["TPAEAddError"]);
return;
}
var target = covalence.Players.FindPlayers(args[1]).ToList();
if (target == null || target.Count <= 0) {
SendReply(player, string.Format(Messages["TPAEAddPlayerNotFound"], ""));
return;
}
if (target.Count > 1) {
SendReply(player, string.Format(Messages["TPAEAddPlayers"], string.Join(", ", target.Select(p => p.Name).Take(5))));
return;
}
if (data.PlayersList.ContainsKey(target[0].Name)) {
SendReply(player, string.Format(Messages["TPAEAddContains"], target[0].Name));
return;
}
data.PlayersList.Add(target[0].Name, ulong.Parse(target[0].Id));
SendReply(player, string.Format(Messages["TPAEAddSuccess"], target[0].Name));
break;
case "remove" : if (args.Length < 2) {
SendReply(player, Messages["TPARemoveError"]);
return;
}
var key = data.PlayersList.FirstOrDefault(p => p.Key.ToLower().Contains(args[1].ToLower())).Key;
if (string.IsNullOrEmpty(key)) {
SendReply(player, string.Format(Messages["TPAEAddPlayerNotFound"], string.Format(Messages["TPAEnabledList"], string.Join(", ", data.PlayersList.Select(p => p.Key)))));
return;
}
data.PlayersList.Remove(key);
SendReply(player, string.Format(Messages["TPAERemoveSuccess"], key));
break;
case "list" : if (data.PlayersList.Count <= 0) SendReply(player, Messages["TPAEListNotFound"]);
else SendReply(player, string.Format(Messages["TPAEnabledList"], string.Join(", ", data.PlayersList.Select(p => p.Key))));
break;
}
}
[ChatCommand("sethome")]
void cmdChatSetHome(BasePlayer player, string command, string[] args) {
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.metabolism.radiation_poison.value > 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;
}
var name = args[0];
SetHome(player, name, player.transform.position);
}
[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);
}
[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]
}
);
}
[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.metabolism.radiation_poison.value > 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];
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;
}
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);
bag.Kill();
return;
}
if (homecupboardblock && bag.GetBuildingPrivilege() != null && !bag.GetBuildingPrivilege().IsAuthed(player)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["sleepingbugbuildblock"]);
playerHomes.Remove(name);
bag.Kill();
return;
}
}
else {
var builds = GetBuildings(pos);
builds.RemoveAll(x => x == null || !x.IsValid() || x.IsDestroyed);
if (builds.Count <= 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["buildingBrockmissingR"]);
playerHomes.Remove(name);
return;
}
var bulds = builds[0];
if (homecupboardblock && bulds.GetBuildingPrivilege() != null && !bulds.GetBuildingPrivilege().IsAuthed(player)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["sleepingbugbuildblock"]);
playerHomes.Remove(name);
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("tpr")]
void cmdChatTpr(BasePlayer player, string command, string[] args) {
if (!enabledTPR) return;
if (args.Length != 1) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tprArgsError"]);
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.metabolism.radiation_poison.value > 10) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["Radiation"]);
return;
}
if (restrictTPRCupboard) {
var privilege = player.GetBuildingPrivilege(player.WorldSpaceBounds());
if (privilege != null && !player.IsBuildingAuthed()) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tpcupboard"]);
return;
}
}
var name = args[0];
var target = FindBasePlayer(name);
if (target == null || !target.IsConnected) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["playermissing"]);
return;
}
if (target == player) {
SendReply(player, Messages["playerisyou"]);
return;
}
if (FriendsEnabled) if (!IsFriends(target.userID, player.userID) && !IsTeamate(player, target.userID) && !IsClanMember(player.userID, target.userID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["PlayerNotFriend"]);
return;
}
int seconds = 0;
if (restrictCupboard && player.GetBuildingPrivilege(player.WorldSpaceBounds()) != null && !player.GetBuildingPrivilege(player.WorldSpaceBounds()).authorizedPlayers.Select(p => p.userid).Contains(player.userID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tpcupboard"]);
return;
}
if (cooldownsTP.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;
}
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;
}
if (tpQueue.Any(p => p.Player == target) || pendings.Any(p => p.Player2 == target)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tpError"]);
return;
}
SendReply(player, string.Format(Messages["tprrequestsuccess"], target.displayName));
SendReply(target, string.Format(Messages["tprpending"], player.displayName));
Effect.server.Run(EffectPrefab1, target, 0, Vector3.zero, Vector3.forward);
pendings.Add(new TP(target, Vector3.zero, 15, false, false, player));
if (AutoTPA.ContainsKey(target.userID)) {
var key = AutoTPA[target.userID].PlayersList.FirstOrDefault(p => p.Value == player.userID).Key;
if (AutoTPA[target.userID].Enabled && !string.IsNullOrEmpty(key)) {
cmdChatTpa(target, command, new string[] {
"atp"
}
);
SendReply(target, Messages["TPASuccess"]);
return;
}
}
}
[ChatCommand("tpa")]
void cmdChatTpa(BasePlayer player, string command, string[] args) {
if (!enabledTPR) return;
var tp = pendings.Find(p => p.Player == player);
if (tp == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tpanotexist"]);
return;
}
BasePlayer pendingPlayer = tp.Player2;
if (pendingPlayer == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tpanotexist"]);
return;
}
if (!EnabledBallonTP && player.GetParentEntity() is HotAirBalloon) {
SendReply(player, Messages["PlayerIsOnHotAirBalloon"]);
return;
}
if (!EnabledShipTP && player.GetParentEntity() is CargoShip) {
SendReply(player, Messages["PlayerIsOnCargoShip"]);
return;
}
if (CancelTPCold && player.metabolism.temperature.value < 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["coldplayer"]);
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.metabolism.radiation_poison.value > 10) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["Radiation"]);
return;
}
if (restrictCupboard && player.GetBuildingPrivilege(player.WorldSpaceBounds()) != null && !player.GetBuildingPrivilege(player.WorldSpaceBounds()).authorizedPlayers.Select(p => p.userid).Contains(player.userID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tpacupboard"]);
return;
}
var ret = Interface.Call("CanTeleport", player) as string;
if (ret != null) {
SendReply(player, ret);
return;
}
if (FriendsEnabled) if (!IsFriends(pendingPlayer.userID, player.userID) && !IsTeamate(player, pendingPlayer.userID) && !IsClanMember(player.userID, pendingPlayer.userID)) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["PlayerNotFriend"]);
return;
}
var time = GetTeleportTime(pendingPlayer.userID);
pendings.Remove(tp);
var lastTp = tpQueue.Find(p => p.Player == pendingPlayer);
if (lastTp != null) {
tpQueue.Remove(lastTp);
}
var Enabled = player.GetParentEntity() is CargoShip || player.GetParentEntity() is HotAirBalloon;
tpQueue.Add(new TP(pendingPlayer, player.transform.position, time, Enabled, false, player));
Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
SendReply(pendingPlayer, string.Format(Messages["tpqueue"], player.displayName, TimeToString(time)));
if (args.Length <= 0) SendReply(player, String.Format(Messages["tpasuccess"], pendingPlayer.displayName, TimeToString(time)));
}
[ChatCommand("tpc")]
void cmdChatTpc(BasePlayer player, string command, string[] args) {
var tp = pendings.Find(p => p.Player == player);
BasePlayer target = tp?.Player2;
if (target != null) {
pendings.Remove(tp);
SendReply(player, Messages["tpc"]);
SendReply(target, string.Format(Messages["tpctarget"], player.displayName));
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.metabolism.radiation_poison.value > 10) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["Radiation"]);
return;
}
if (CancelTPCold && player.metabolism.temperature.value < 0) {
SendReply(player, Messages["coldplayer"]);
return;
}
foreach (var pend in pendings) {
if (pend.Player2 == player) {
SendReply(player, Messages["tpc"]);
SendReply(pend.Player, string.Format(Messages["tpctarget"], player.displayName));
pendings.Remove(pend);
return;
}
}
foreach (var tpQ in tpQueue) {
if (tpQ.Player2 != null && tpQ.Player2 == player) {
SendReply(player, Messages["tpc"]);
SendReply(tpQ.Player, string.Format(Messages["tpctarget"], player.displayName));
tpQueue.Remove(tpQ);
return;
}
if (tpQ.Player == player) {
SendReply(player, Messages["tpc"]);
if (tpQ.Player2 != null) SendReply(tpQ.Player2, string.Format(Messages["tpctarget"], player.displayName));
tpQueue.Remove(tpQ);
return;
}
}
}
void SpectateFinish(BasePlayer player) {
player.Command("camoffset", "0,1,0");
player.StopSpectating();
player.SetParent(null);
player.gameObject.SetLayerRecursive(17);
player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, false);
player.SetPlayerFlag(BasePlayer.PlayerFlags.ThirdPersonViewmode, false);
player.SendNetworkUpdateImmediate();
player.metabolism.Reset();
player.InvokeRepeating("InventoryUpdate", 1f, 0.1f * UnityEngine.Random.Range(0.99f, 1.01f));
if (player.net?.connection != null) player.ClientRPCPlayer(null, player, "StartLoading");
player.StartSleeping();
if (lastPositions.ContainsKey(player.userID)) {
Vector3 lastPosition = lastPositions[player.userID] + Vector3.up;
player.MovePosition(lastPosition);
if (player.net?.connection != null) player.ClientRPCPlayer(null, player, "ForcePositionTo", lastPosition);
lastPositions.Remove(player.userID);
}
if (player.net?.connection != null) player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
player.UpdateNetworkGroup();
player.SendNetworkUpdateImmediate(false);
if (player.net?.connection == null) return;
try {
player.ClearEntityQueue(null);
}
catch {
}
player.SendFullSnapshot();
SendReply(player, "Слежка закончена!");
}
private void OnUserConnected(IPlayer player) => ResetSpectate(player);
private void OnUserDisconnected(IPlayer player) => ResetSpectate(player);
private void ResetSpectate(IPlayer player) {
player.Command("camoffset 0,1,0");
if (lastPositions.ContainsKey(ulong.Parse(player.Id))) {
lastPositions.Remove(ulong.Parse(player.Id));
}
}
object OnPlayerSpectateEnd(BasePlayer player, string spectateFilter) {
player.Command("camoffset", "0,1,0");
return null;
}
[ChatCommand("tpl")]
void cmdChattpGo(BasePlayer player, string command, string[] args) {
if (!EnabledTPLForPlayers && !player.IsAdmin && !PermissionService.HasPermission(player.userID, "teleportation.admin")) return;
if (args == null || args.Length == 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["tpArgsError"]);
return;
}
switch (args[0]) {
default : if (tpsave.Count <= 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homesmissing"]);
return;
}
var nametp = args[0];
var tp = tpsave.Find(p => p.Name == nametp);
if (tp == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homenotexist"]);
return;
}
var position = tp.pos;
var ret = Interface.Call("CanTeleport", player) as string;
if (ret != null) {
SendReply(player, ret);
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;
}
var lastTp = tpQueue.Find(p => p.Player == player);
if (lastTp != null) tpQueue.Remove(lastTp);
Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
if (TPLAdmin && player.IsAdmin || PermissionService.HasPermission(player.userID, "teleportation.admin")) Teleport(player, position);
else {
tpQueue.Add(new TP(player, position, TplPedingTime, false, true));
SendReply(player, String.Format(Messages["homequeue"], nametp, TimeToString(TplPedingTime)));
}
return;
case "add" : if (!player.IsAdmin && !PermissionService.HasPermission(player.userID, "teleportation.admin")) return;
if (args == null || args.Length == 1) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["settpArgsError"]);
return;
}
var nameAdd = args[1];
SetTpSave(player, nameAdd);
return;
case "remove" : if (!player.IsAdmin && !PermissionService.HasPermission(player.userID, "teleportation.admin")) return;
if (args == null || args.Length == 1) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["removetpArgsError"]);
return;
}
nametp = args[1];
if (tpsave.Count > 0) {
tp = tpsave.Find(p => p.Name == nametp);
if (tp == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["homesmissing"]);
return;
}
Effect.server.Run(EffectPrefab1, player, 0, Vector3.zero, Vector3.forward);
tpsave.Remove(tp);
SendReply(player, Messages["removehomesuccess"], nametp);
}
return;
case "list" : if (tpsave.Count <= 0) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["TPLmissing"]);
return;
}
var tplist = tpsave.Select(x => $"{x.Name} {x.pos}");
SendReply(player, Messages["TPLList"], string.Join("\n", tplist.ToArray()));
return;
}
}
[ChatCommand("tpspec")]
void cmdTPSpec(BasePlayer player, string command, string[] args) {
if (!PermissionService.HasPermission(player.userID, "teleportation.admin")) return;
if (!player.IsSpectating()) {
if (args.Length == 0 || args.Length != 1) {
SendReply(player, Messages["tpspecError"]);
return;
}
string name = args[0];
BasePlayer target = FindBasePlayer(name);
if (target == null) {
Effect.server.Run(EffectPrefab, player, 0, Vector3.zero, Vector3.forward);
SendReply(player, Messages["playermissing"]);
return;
}
switch (args.Length) {
case 1 : if (!target.IsConnected) {
SendReply(player, Messages["playermissingOff"]);
return;
}
if (target.IsDead()) {
SendReply(player, Messages["playermissingOrDeath"]);
return;
}
if (ReferenceEquals(target, player)) {
SendReply(player, Messages["playerItsYou"]);
return;
}
if (target.IsSpectating()) {
SendReply(player, Messages["playerItsSpec"]);
return;
}
spectatingPlayers.Remove(target);
lastPositions[player.userID] = player.transform.position;
HeldEntity heldEntity = player.GetActiveItem()?.GetHeldEntity() as HeldEntity;
heldEntity?.SetHeld(false);
player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, true);
player.gameObject.SetLayerRecursive(10);
player.CancelInvoke("MetabolismUpdate");
player.CancelInvoke("InventoryUpdate");
player.ClearEntityQueue();
player.SendEntitySnapshot(target);
player.gameObject.Identity();
player.SetParent(target);
player.SetPlayerFlag(BasePlayer.PlayerFlags.ThirdPersonViewmode, true);
player.Command("camoffset", "0, 1.3, 0");
SendReply(player, $"Вы наблюдаете за игроком {target}! Что бы переключаться между игроками, нажимайте: Пробел\nЧтобы вый
// ... [Code preview truncated due to length. Full source in attached file] ...