C#:
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using UnityEngine;
namespace Oxide.Plugins {
[Info("Duel", "RustPlugin.ru", "4.2.0")]
[Description("Automatic Duel (Bets) with GUI, weapons list, auto-created arenas, save players loot and position")]
class Duel : RustPlugin {
#region Messages&Config
string notAllowed = "Вызов на дуэль запрещен";
string duelCommand = "<color=orange>/duel <ник></color> - вызвать игрока на дуэль\n<color=orange><color=#ADFF2F>/duels</color> <ник></color> - <color=#ADFF2F>вызвать игрока на дуэль со ставками</color>\n<color=orange>/duel a</color> - принять вызов\n<color=orange>/duel c</color> - отменить вызов\n<color=orange>/duel stat</color> - статистика\n<color=orange>/duel top</color> - топ\nКомандная дуэль:\n<color=orange>/duel create [2-6]</color> - создать командную дуэль\n<color=orange>/duel join red/blue</color> - подать заявку\n<color=orange>/duel accept</color> - принять в дуэль (для создателя)\n<color=orange>/duel c</color> - покинуть дуэль";
string dontHaveRequest = "У вас нет заявок на дуэль";
string notFoundPlayer = "Игрок с именем <color=#7b9ef6>{0}</color> не найден";
string alreadyHaveDuel = "<color=#7b9ef6>{0}</color> уже имеет активную дуэль";
string youOnDuel = "Вы уже имеете активную дуэль";
string noArenas = "Извините, все арены сейчас заняты";
string noBuildAcess = "Вы должны быть авторизованы в шкафу";
string cooldownMessage = "Вы сможете вызвать на дуэль через {0} секунд";
string createRequest = "Вы вызвали <color=#7b9ef6>{0}</color> на дуэль!\n<color=orange>/duel c</color> - отменить вызов";
string receiveRequest = "<color=#7b9ef6>{0}</color> вызвал вас на дуэль!\n<color=orange>/duel a</color> - принять вызов\n15 секунд до отмены\n<color=orange>/duel c</color> - отменить вызов";
string youDontHaveRequest = "У вас нет активных вызовов";
string cantCancelDuel = "Невозможно отменить начавшуюся дуэль.\nПобеди своего противника!";
static string duelHasBeenCancelled = "Дуэль c <color=#7b9ef6>{0}</color> отменена.";
static string duelStart = "Дуэль началась!";
static string playerNotFound = "Игрок с именем {0} не найден";
static string foundMultiplePlayers = "Найдено несколько игроков: <color=#7b9ef6>{0}</color>";
static string guiChooseWeapon = "Выберите оружие из списка";
static string guiYourChoose = "Вы выбрали: {0}";
static string guiWaitForOpponentChoose = "Противник выбирает оружие";
static string guiOpponentsWeapon = "Противник выбрал: {0}";
static string guiStartAboutToBegin = "Начало через несколько секунд";
static string guiSurrenderButton = "Сдаться";
static string guiAutoCloseSec = "До выбора случайного оружия: {0}";
static string guiPlayerSleep = "Ожидаем пока соперник проснётся";
string statLoss = "Тебе засчитано поражение в дуэли";
string statWin = "Тебе засчитана победа в дуэли";
string notificationAboutWin = "[Дуэль] <color=#7b9ef6>{0}</color> vs <color=#7b9ef6>{1}</color>\nПобедитель: <color=#7b9ef6>{2}</color>";
string cantBuild = "Ты не можешь строить на дуэли";
string cantUseRecycle = "Ты не можешь использовать переработчик на дуэли";
string cantUseNexusKits = "Ты не можешь использовать киты на дуэли";
string cantTrade = "Ты не можешь обмениваться на дуэли";
string cantRemove = "Ты не можешь ремувать на дуэли";
string cantTp = "Ты не можешь пользоваться телепортом на дуэли";
string cantUseKit = "Ты не можешь получить кит на дуэли";
string cantUseCommand = "Вы не можете использовать /{0} на Duel";
string cantUseBackPack = "Ты не можешь использовать рюкзак на дуэли";
string cantUseSkins = "Ты не можешь использовать скины на дуэли";
string cantUseKill = "Ты не можешь использовать kill на дуэли";
string yourStat = "Ваша статистика по дуэлям:\nПобед: {0}\nПоражений: {1}\nКомандные дуэли:\nПобед:{2}\nПоражений:{3}";
string emptyTop = "Статистика пуста как твоя кровать по ночам";
string topWin = "Топ побед в дуэлях:";
string topTeamWin = "\n\nТоп побед в командных дуэлях:";
string topLosses = "\n\nТоп поражений в дуэлях:";
string topTeamLoss = "\n\nТоп поражений в командных дуэлях:";
string playerInTop = "\n{0}.<color=#469cd0>{1}</color>: {2}";
// номер.ник: значение
static string returnPlayerReason = "Дуэль окончена.\nПричина: <color=orange>{0}</color>";
static string returnReasonSleep = "Кто-то слишком долго спал";
static string returnReasonGUIFail = "Кто-то слишком долго выбирает оружие";
static string returnReasonLimitTime = "Время на дуэль вышло({0} секунд)";
static string returnReasonDisconnect = "Соперник отключился";
static string returnReasonSurrender = "Кто-то всё же решил сдаться";
static string returnReasonUnload = "Плагин на время отключен.Попробуйте позже.";
static string teamDuelCancelled = "Командная дуэль отменена\nПричина: не собрана за {0} сек";
static string teamPlayerDisconnect = "[Дуэль] <color=#7b9ef6>{0}</color> вышел с сервера!";
static string teamWinRed = "[Дуэль] Побеждает команда <color=red>RED</color>!";
static string teamWinBlue = "[Дуэль] Побеждает команда <color=blue>BLUE</color>!";
static string teamDuellerWounded = "[Дуэль] Один из дуэлянтов ранен.\nДуэль не начнётся, пока он ранен.";
static string teamArensBusy = "[Дуэль] Пожалуйста, подождите.Все арены заняты.";
static string teamCooldownToCreate = "Вы сможете создать командную дуэль через {0} сек";
static string teamAlreadyCreated = "Извините, но командная дуэль уже создана.Присоединиться: /duel join red/blue";
static string teamCreatedPermPref = "<color=yellow> Турнирную </color>";
static string teamSucessCreated = "<color=#409ccd>{0}</color> создал{1}командную дуэль <color=#36978e>{2}</color> на <color=#36978e>{2}</color>!\nПодать заявку на участие в команде <color=red>RED</color>: /duel join red\nПодать заявку на участие в команде <color=blue>BLUE</color>: /duel join blue";
static string teamCancelDuel = "Отменить дуэль: <color=orange>/duel c</color>";
static string teamNotOwner = "Ты не создатель дуэли";
static string teamNoSlotsBlue = "Свободных мест в команде blue нет";
static string teamNoSlotsRed = "Свободных мест в команде red нет";
static string teamJoinPermPref = "<color=yellow> Турнирная </color>";
static string teamJoinRedPref = "<color=red>red</color>";
static string teamJoinBluePref = "<color=blue>blue</color>";
static string teamAboutToBegin = "[Дуэль] Начало через 5 секунд!";
static string teamJoinAboutToBeginAnnounce = "[{0}Командная дуэль]\n<color=#7b9ef6>{1}</color> присоединился к команде {2}\nНабор окончен!\nДуэль скоро начнется";
static string teamJoinAnnounce = "[{0}Командная дуэль]\n<color=#7b9ef6>{1}</color> присоединился к команде {2}\nСвободных мест:\n<color=red>red</color>: {3}\n<color=blue>blue</color>: {4}\nПодать заявку: <color=orange>/duel join red</color> или <color=orange>blue</color>";
static string teamPlayerWont = "{0} не подавал заявку на дуэль";
static string teamErrorNoCommand = "Ошибка.Выберите команду: /duel join red / blue";
static string teamAlreadyRequest = "Вы уже подали заявку на командную дуэль.Ждите одобрения создателя";
static string teamAlreadyStarted = "Ошибка.Дуэль уже началась!";
static string teamNoPerm = "Извините, у вас нет доступа к турнирным дуэлям.\nПриобрести можно в магазине сервера.";
static string teamSucessRequest = "Вы подали заявку.\nОжидайте, пока <color=#409ccd>{0}</color> одобрит её.\n<color=orange>/duel c</color> - отменить заявку.";
static string teamNewRequest = "<color=#409ccd>{0}</color> подал заявку на вступление в дуэль[<color={1}>{1}</color>].\n<color=orange>/duel accept</color> <color=#409ccd>{0}</color> - принять\nСписок подавших заявку: <color=orange>/duel accept</color>";
static string teamNoDuelsHowCreate = "Активных командных дуэлей нет./duel create - создать новую";
static string teamGuiWeapons = "Оружие дуэлянтов: ";
static string teamGuiNoWeapon = "не выбрал";
static string teamGuiBluePlayerColor = "#76b9d6";
static string teamGuiRedPlayerColor = "red";
static string teamGuiWeaponColor = "#e0e1e3";
static string teamGuiWaiting = "Ожидаем других игроков\n60 секунд максимум";
static string teamDamageTeammate = "<color=#7b9ef6>{0}</color>: Эй! Я твой союзник!";
static string teamDeath = "[Дуэль] <color=#7b9ef6>{0}</color> [<color={1}>{1}</color>] погиб!\n<color=blue>Team Blue</color>: {2} человек\n<color=red>Team Red</color>: {3} человек";
static float teamDuelRequestSecToClose = 300;
float cooldownTeamDuelCreate = 180f;
float cooldownRequestSec = 60;
static float requestSecToClose = 20;
static float duelMaxSec = 300;
static float chooseWeaponMaxSec = 25f;
static float teamChooseWeaponMaxSec = 60f;
int maxWinsTop = 5;
int maxLoseTop = 5;
static bool debug = true;
#endregion
#region Variables
[PluginReference]
Plugin Trade;
static string duelJoinPermission = "duel.join";
static string duelCreatePermission = "duel.create";
private readonly int triggerLayer = LayerMask.GetMask("Trigger");
bool isIni = false;
static FieldInfo buildingPrivlidges;
private MethodInfo newbuildingid = typeof(BuildingBlock).GetMethod("NewBuildingID", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
static List<ActiveDuel> createdDuels = new List<ActiveDuel>();
static List<TeamDuel> createdTeamDuels = new List<TeamDuel>();
static List<ulong?> toRemoveCorpse = new List<ulong?>();
Dictionary<ulong, float> lastRequestTime = new Dictionary<ulong, float>();
Dictionary<ulong, float> lastTeamDuelCreateTime = new Dictionary<ulong, float>();
static Dictionary<string, ulong> Wears = new Dictionary<string, ulong> //item shortname : skinid
{
{
"metal.facemask", 0
}
, //shirt
{
"metal.plate.torso", 0
}
, // Hat
{
"shoes.boots", 0
}
, // Pants
{
"hoodie", 0
}
, // Boots
{
"pants", 0
}
, // tolsovka
{
"roadsign.kilt", 0
}
// dorognie znaki
}
;
static Dictionary<string, ulong> WearsBlue = new Dictionary<string, ulong> //item id : skinid
{
{
"metal.facemask", 0
}
, //hoodie
{
"metal.plate.torso", 0
}
, // Hat
{
"shoes.boots", 0
}
, // Pants
{
"hoodie", 0
}
, // Boots
{
"pants", 14178
}
, // tolsovka
{
"roadsign.kilt", 0
}
// dorognie znaki
}
;
static Dictionary<string, ulong> WearsRed = new Dictionary<string, ulong> //item id : skinid
{
{
"metal.facemask", 0
}
, //hoodie
{
"metal.plate.torso", 0
}
, // Hat
{
"shoes.boots", 0
}
, // Pants
{
"hoodie", 0
}
, // Boots
{
"pants", 0
}
, // tolsovka
{
"roadsign.kilt", 0
}
// dorognie znaki
}
;
private List<BaseEntity> ArenaEntities = new List<BaseEntity>();
#endregion
#region Helperss
[PluginReference]
Plugin NoEscape;
bool IsRaidBlock(BasePlayer player) {
if (plugins.Exists("NoEscape")) {
var time = (double)NoEscape.Call("ApiGetTime", player.userID);
if (time > 0) {
SendReply(player, "У Вас рейдблок, Duel запрещена");
return true;
}
}
return false;
}
#endregion
#region ChatCommand
[ChatCommand("duel")]
void chatduel(BasePlayer player, string command, string[] arg) {
if (!isIni) {
SendReply(player, "<color=#FE5256>Duel не инициирована.Ожидайте........</color>");
return;
}
if (arg.Length == 0) {
SendReply(player, duelCommand);
return;
}
if (IsRaidBlock(player)) return;
if (player.metabolism.radiation_poison.value > 5) {
SendReply(player, "У Вас облучение радиацией.Duel запрещена");
return;
}
string aim = (string)arg[0];
if (aim == "join") {
if (!canAcceptRequest(player)) return;
if (IsDuelPlayer(player)) {
player.ChatMessage("Вы уже дуэлянт");
return;
}
if (arg.Length == 2) {
string team = (string)arg[1];
if (team != null) JoinTeamDuel(player, team);
return;
}
else {
if (createdTeamDuels.Count > 0) {
var teamDuel = createdTeamDuels[0];
player.ChatMessage($"Ошибка.Укажите команду, к которой хотите присоединиться\nВ команде red: {teamDuel.playersAmount - teamDuel.teamred.Count} свобоных мест\nВ команде blue: {teamDuel.playersAmount - teamDuel.teamblue.Count} свобоных мест");
return;
}
else {
player.ChatMessage("Ошибка.Пишите:\n/duel join red - присоединиться к команде red\n/duel join blue - присоединиться к команде blue");
return;
}
}
}
if (aim == "accept") {
if (arg.Length == 2) {
string requester = (string)arg[1];
var target = FindPlayersSingle(requester, player);
if (target != null) AcceptRequestTeamDuel(player, target);
return;
}
else {
if (createdTeamDuels.Count > 0) {
string msg = "";
var teamDuel = createdTeamDuels[0];
if (teamDuel.owner != player) {
player.ChatMessage("Ты не создатель дуэли");
return;
}
if (teamDuel.requestPlayers.Count > 0) {
foreach (var pl in teamDuel.requestPlayers) {
msg += $"<color=#409ccd>{pl.Key.displayName}</color>, ";
}
player.ChatMessage($"Игроки, подавшие заявку: {msg}\nПринять: <color=orange>/duel accept</color> <color=#409ccd>name</color>");
return;
}
else {
player.ChatMessage("Список с заявками пуст.");
return;
}
}
else {
player.ChatMessage("Командная дуэль не создана");
return;
}
}
}
if (aim == "create") {
if (!CanCreateDuel(player, true)) return;
if (arg.Length >= 2) {
string amount = (string)arg[1];
int intamount = 0;
if (Int32.TryParse(amount, out intamount)) {
if (intamount > 1 && intamount <= 6) {
if (arg.Length == 3) {
string perm = (string)arg[2];
if (perm == "perm") {
if (!HavePerm(duelCreatePermission, player.userID)) return;
createTeamDuel(player, intamount, true);
return;
}
}
createTeamDuel(player, intamount);
return;
}
else {
player.ChatMessage("Ошибка.Количество игроков в команде должно быть от 2 до 6");
return;
}
}
return;
}
else {
player.ChatMessage("Ошибка.Укажите количество участников (от 2 до 6) в каждой команде\n/duel create [2-6]");
return;
}
}
if (aim == "top") {
showTop(player);
return;
}
if (aim == "stat") {
showStat(player);
return;
}
if (aim == "c") {
CancelRequest(player);
return;
}
if (aim == "a") {
if (createdTeamDuels.Count > 0) {
var teamDuel = createdTeamDuels[0];
if (teamDuel.requestPlayers.ContainsKey(player)) {
player.ChatMessage("Ты подал заявку на командную дуэль.\nНачать новую ты не можешь");
return;
}
}
if (!canAcceptRequest(player)) return;
if (!IsDuelPlayer(player)) {
SendReply(player, dontHaveRequest);
return;
}
if (IsPlayerOnActiveDuel(player)) {
player.ChatMessage("Вы уже находитесь на дуэли.");
return;
}
AcceptRequest(player);
return;
}
var victim = FindPlayersSingle(aim, player);
if (victim != null) {
if (createdTeamDuels.Count > 0) {
var teamDuel = createdTeamDuels[0];
if (teamDuel.requestPlayers.ContainsKey(player)) {
player.ChatMessage("Ты подал заявку на командную дуэль.\nНачать новую ты не можешь");
return;
}
}
if (createdTeamDuels.Count > 0) {
var teamDuel = createdTeamDuels[0];
if (teamDuel.requestPlayers.ContainsKey(victim)) {
player.ChatMessage("Невозможно вызвать этого игрока");
return;
}
}
if (createdTeamDuels.Count > 0) {
var teamDuel = createdTeamDuels[0];
if (teamDuel.owner == victim) {
player.ChatMessage("Невозможно вызвать этого игрока");
return;
}
}
if (victim == player) {
player.ChatMessage("Вы не можете вызвать самого себя на дуэль");
return;
}
if (!CanCreateDuel(player)) return;
string reason = CanDuel(victim);
if (reason != null) {
SendReply(player, reason);
return;
}
CreateRequest(player, victim);
return;
}
}
#endregion
#region Checks
bool IsArenaZone(Vector3 pos) {
foreach (var arena in arenaList) {
if (Vector3.Distance(pos, arena.pos) < 100) return true;
}
return false;
}
void RemoveGarbage(BaseEntity entity) {
if (entity == null) return;
if (entity?.net?.ID == null) return;
if (!isIni) return;
if (entity.transform.position.y > 900f) {
var cont = entity as DroppedItemContainer;
if (cont != null) {
if (IsArenaZone(cont.transform.position)) {
cont.ResetRemovalTime(0.1f);
}
}
var corpse = entity as BaseCorpse;
if (corpse != null) {
if (toRemoveCorpse.Count == 0) return;
if (corpse) {
if ((corpse is PlayerCorpse) && corpse?.parentEnt?.ToPlayer()) {
if (corpse?.parentEnt?.ToPlayer() != null) {
if (toRemoveCorpse.Contains(corpse?.parentEnt?.ToPlayer().userID)) {
corpse.ResetRemovalTime(0.1f);
toRemoveCorpse.Remove(corpse?.parentEnt?.ToPlayer().userID);
return;
}
}
}
}
}
if (entity is PlayerCorpse || entity.name.Contains("item_drop_backpack")) {
if (entity.transform.position.y > 900f) {
NextTick(() => {
if (entity != null && !entity.IsDestroyed) {
entity.Kill();
}
}
);
}
}
if (entity is WorldItem) {
if ((entity as WorldItem).item.GetOwnerPlayer() == null) return;
var activeDuel = PlayersActiveDuel((entity as WorldItem).item.GetOwnerPlayer().userID);
if (activeDuel != null) {
activeDuel.dropedWeapons.Add((entity as WorldItem).item);
return;
}
if (NeedToRemoveFromTeamDuel((entity as WorldItem).item.GetOwnerPlayer().userID)) {
createdTeamDuels[0].droppedWeapons.Add((entity as WorldItem).item);
}
}
}
}
bool NeedToRemoveFromTeamDuel(ulong? userid) {
if (createdTeamDuels.Count > 0) {
if (createdTeamDuels[0].allPlayers.Find(x => x.player.userID == userid)) return true;
}
return false;
}
ActiveDuel PlayersActiveDuel(ulong? userid) {
if (createdDuels.Count == 0) return null;
foreach (var duel in createdDuels) {
if (duel.player1.player.userID == userid && duel.player1.haveweapon) {
return duel;
}
if (duel.player2.player.userID == userid && duel.player2.haveweapon) {
return duel;
}
}
return null;
}
bool NeedToRemoveGarbage(ulong? userid) {
int createdDuelsN = createdDuels.Count;
if (createdDuelsN == 0) return false;
if (createdDuels.Find(x => x.player1.player.userID == userid || x.player2.player.userID == userid)) return true;
return false;
}
bool IsDuelPlayer(BasePlayer player) {
DuelPlayer dueller = player?.GetComponent<DuelPlayer>();
if (dueller == null) return false;
return true;
}
bool IsPlayerOnActiveDuel(BasePlayer player) {
DuelPlayer dueller = player?.GetComponent<DuelPlayer>();
if (dueller == null) return false;
if (!dueller.canDoSomeThings) return true;
return false;
}
string CanDuel(BasePlayer player) {
if (IsDuelPlayer(player)) {
return String.Format(alreadyHaveDuel, player.displayName);
}
if (busyArena.Count == arenaList.Count) {
return noArenas;
}
return null;
}
bool canAcceptRequest(BasePlayer player) {
if (player.IsDead()) {
return false;
}
if (player.IsWounded()) {
SendReply(player, notAllowed);
return false;
}
if (busyArena.Count == arenaList.Count) {
SendReply(player, noArenas);
return false;
}
return true;
}
bool CanCreateDuel(BasePlayer player, bool isTeamDuel = false) {
float value = 0;
if (lastRequestTime.TryGetValue(player.userID, out value) && !isTeamDuel) {
if (UnityEngine.Time.realtimeSinceStartup - value < cooldownRequestSec) {
float when = cooldownRequestSec - (UnityEngine.Time.realtimeSinceStartup - value);
player.ChatMessage(String.Format(cooldownMessage, (int)when));
return false;
}
}
if (player.IsWounded()) {
SendReply(player, notAllowed);
return false;
}
if (IsDuelPlayer(player)) {
SendReply(player, youOnDuel);
return false;
}
if (busyArena.Count == arenaList.Count) {
SendReply(player, noArenas);
return false;
}
if (!isTeamDuel) lastRequestTime[player.userID] = UnityEngine.Time.realtimeSinceStartup;
return true;
}
#endregion
#region DuelFunctions
void CreateRequest(BasePlayer starter, BasePlayer opponent) {
SendReply(starter, String.Format(createRequest, opponent.displayName));
SendReply(opponent, String.Format(receiveRequest, starter.displayName));
DuelPlayer dueller1 = starter.GetComponent<DuelPlayer>() ?? starter.gameObject.AddComponent<DuelPlayer>();
DuelPlayer dueller2 = opponent.GetComponent<DuelPlayer>() ?? opponent.gameObject.AddComponent<DuelPlayer>();
ActiveDuel activeDuel = starter.gameObject.AddComponent<ActiveDuel>();
activeDuel.player1 = dueller1;
activeDuel.player2 = dueller2;
createdDuels.Add(activeDuel);
}
void AcceptRequest(BasePlayer player) {
Arena arena = null;
foreach (var duel in createdDuels) {
if (duel.player2.player == player) {
if (!canAcceptRequest(player) || !canAcceptRequest(duel.player1.player)) {
CancelRequest(player);
return;
}
duel.arena = FreeArena();
arena = duel.arena;
duel.isRequest = false;
duel.timeWhenTp = UnityEngine.Time.realtimeSinceStartup;
duel.player1.spawnPos = arena.player1pos;
duel.player2.spawnPos = arena.player2pos;
Debug($"Началась Дуэль {duel.player1.player.displayName} : {duel.player2.player.displayName} {arena.name} Активных: {busyArena.Count}");
toRemoveCorpse.Add(duel.player1.player.userID);
toRemoveCorpse.Add(duel.player2.player.userID);
duel.player1.PrepairToDuel();
duel.player2.PrepairToDuel();
Trade?.CallHook("RemovePending", duel.player1.player);
Trade?.CallHook("RemovePending", duel.player2.player);
break;
}
}
}
public void CancelRequest(BasePlayer player) {
if (createdTeamDuels.Count > 0) {
var duel = createdTeamDuels[0];
if (duel.owner == player && !duel.isStarted && !duel.allHere) {
if (duel.teamblue.Count > 0) foreach (var dueller in duel.teamblue) {
dueller.Destroy();
}
if (duel.teamred.Count > 0) foreach (var dueller in duel.teamred) {
dueller.Destroy();
}
PrintToChat("Командная дуэль отменена создателем");
duel.Destroy();
return;
}
if (duel.requestPlayers.ContainsKey(player)) {
duel.requestPlayers.Remove(player);
player.ChatMessage("Вы покинули командную дуэль");
duel.owner.ChatMessage($"{player.displayName} отменил заявку на дуэль");
return;
}
var redplayer = duel.teamred.Find(x => x.player == player);
if (redplayer != null) {
if (!redplayer.haveweapon && !duel.isStarted && !duel.allHere) {
duel.teamred.Remove(redplayer);
redplayer.Destroy();
duel.owner.ChatMessage($"{player.displayName} покинул командную дуэль");
player.ChatMessage("Вы покинули командную дуэль");
return;
}
else {
player.ChatMessage("Вы не можете покинуть начавшуюся дуэль");
return;
}
}
var blueplayer = duel.teamblue.Find(x => x.player == player);
if (blueplayer != null) {
if (!blueplayer.haveweapon && !duel.isStarted && !duel.allHere) {
duel.teamblue.Remove(blueplayer);
blueplayer.Destroy();
duel.owner.ChatMessage($"{player.displayName} покинул командную дуэль");
player.ChatMessage("Вы покинули командную дуэль");
return;
}
else {
player.ChatMessage("Вы не можете покинуть начавшуюся дуэль");
return;
}
}
}
if (FindOpponent(player) != null) {
var duel = FindDuelByPlayer(player);
if (duel != null) {
if (duel.isRequest) {
duel.RequestRemove();
return;
}
else {
player.ChatMessage(cantCancelDuel);
return;
}
}
}
player.ChatMessage("Вы не участник дуэли");
}
static ActiveDuel FindDuelByPlayer(BasePlayer player) {
foreach (var duel in createdDuels) {
if (duel.player1.player == player) {
return duel;
}
if (duel.player2.player == player) {
return duel;
}
}
return null;
}
public void EndDuel(BasePlayer player, int reason, string UserId, string UserIdLoss) {
DuelPlayer dueller = player?.GetComponent<DuelPlayer>();
if (dueller != null) {
if (dueller.team != "") {
if (reason == 6) {
if (dueller.savedHome) {
dueller.ReturnPlayer(reason);
}
else {
dueller.Destroy();
}
return;
}
if (reason == 0 || reason == 4) {
dueller.ReturnPlayer(reason);
}
return;
}
}
if (createdTeamDuels.Count > 0 && reason == 4) {
if (createdTeamDuels[0].owner == player) {
createdTeamDuels[0].RequestRemove();
return;
}
if (createdTeamDuels[0].requestPlayers.ContainsKey(player)) {
createdTeamDuels[0].requestPlayers.Remove(player);
createdTeamDuels[0].owner.ChatMessage($"[Дуэль] {player.displayName} вышел с сервера!");
return;
}
}
if (createdDuels.Count == 0) return;
DuelPlayer player1 = null;
DuelPlayer player2 = null;
foreach (var duel in createdDuels) {
if (duel.player1.player == player) {
player1 = duel.player1;
player2 = duel.player2;
break;
}
if (duel.player2.player == player) {
player1 = duel.player1;
player2 = duel.player2;
break;
}
}
if (reason == 0) {
if (player1 != null) if (player1.player == player) {
player1.guiEnabled = false;
player1.canMove = true;
player1.ReturnPlayer(0);
return;
}
if (player2 != null) if (player2.player == player) {
player2.guiEnabled = false;
player2.canMove = true;
player2.ReturnPlayer(0);
return;
}
}
if (reason == 7) {
if (player1 != null) if (player1.player == player) {
player2.guiEnabled = false;
player2.canMove = true;
if (player2.induel) player2.ReturnWithCooldown();
player2.induel = false;
return;
}
if (player2 != null) if (player2.player == player) {
player1.guiEnabled = false;
player1.canMove = true;
if (player1.induel) player1.ReturnWithCooldown();
player1.induel = false;
return;
}
}
if (player1 != null) {
player1.guiEnabled = false;
player1.canMove = true;
player1.ReturnPlayer(reason);
}
if (player2 != null) {
player2.guiEnabled = false;
player2.canMove = true;
player2.ReturnPlayer(reason);
}
}
#endregion
#region TeamDuel
#region Class TeamDuel
class TeamDuel : MonoBehaviour {
public List<DuelPlayer> teamblue = new List<DuelPlayer>();
public List<DuelPlayer> teamred = new List<DuelPlayer>();
public List<DuelPlayer> allPlayers = new List<DuelPlayer>();
public List<BasePlayer> statTeamBlue = new List<BasePlayer>();
public List<BasePlayer> statTeamRed = new List<BasePlayer>();
public Dictionary<BasePlayer, string> requestPlayers = new Dictionary<BasePlayer, string>();
public BasePlayer owner;
public Arena arena = null;
public bool isRequest = true;
public bool isStarted = false;
public bool needCheckStart;
public bool isActive = true;
public bool allHere;
public bool allReady;
public bool isPermDuel = false;
public bool randomWeaponsHasGiven = false;
public float guiTime;
public int playersAmount = -1;
public float startTime;
public float requestTime;
public float lastTimeMessage = 0f;
public List<Item> droppedWeapons = new List<Item>();
void Awake() {
requestTime = UnityEngine.Time.realtimeSinceStartup;
allHere = false;
allReady = false;
}
public void CheckOnline() {
int redCount = teamred.Count;
int blueCount = teamblue.Count;
List<string> offPlayers = new List<string>();
if (redCount > 0) {
for (int i = 0; i < redCount; i++) {
if (teamred[i] == null) {
offPlayers.Add(teamred[i].player.displayName);
allPlayers.Remove(teamred[i]);
teamred.Remove(teamred[i]);
break;
}
}
}
if (blueCount > 0) {
for (int i = 0; i < blueCount; i++) {
if (teamblue[i] == null) {
offPlayers.Add(teamblue[i].player.displayName);
allPlayers.Remove(teamblue[i]);
teamblue.Remove(teamblue[i]);
break;
}
}
}
redCount = teamred.Count;
blueCount = teamblue.Count;
int offPlayersCount = offPlayers.Count;
if (offPlayersCount > 0) {
if (blueCount > 0) {
for (int i = 0; i < blueCount; i++) {
for (int j = 0; j < offPlayersCount; j++) teamblue[i].player.ChatMessage(String.Format(teamPlayerDisconnect, offPlayers[j]));
}
}
if (redCount > 0) {
for (int i = 0; i < redCount; i++) {
for (int j = 0; j < offPlayersCount; j++) teamred[i].player.ChatMessage(String.Format(teamPlayerDisconnect, offPlayers[j]));
}
}
}
}
void Update() {
if (isActive) {
CheckOnline();
}
if (!isStarted && !allHere && teamblue.Count > 0 && teamred.Count > 0) {
if ((teamblue.Count + teamred.Count) == (playersAmount * 2)) {
allHere = true;
int teamPlayersN = teamblue.Count;
for (int i = 0; i < teamPlayersN; i++) {
var tmb = teamblue[i];
var tmr = teamred[i];
statTeamBlue.Add(tmb.player);
statTeamRed.Add(tmr.player);
allPlayers.Add(tmb);
allPlayers.Add(tmr);
}
Invoke("CheckDuellers", 5f);
needCheckStart = true;
}
}
if (needCheckStart) {
if (isStarted && isActive) {
if (teamblue.Count == 0) {
isStarted = false;
isActive = false;
ConsoleNetwork.BroadcastToAllClients("chat.add", 0, teamWinRed);
int statPlayersN = statTeamRed.Count;
for (int i = 0; i < statPlayersN; i++) {
db.playerStat[statTeamRed[i].userID].teamwins++;
db.playerStat[statTeamBlue[i].userID].teamloss++;
}
Invoke("EndTeamDuelWithWinners", 5f);
return;
}
if (teamred.Count == 0) {
isStarted = false;
isActive = false;
ConsoleNetwork.BroadcastToAllClients("chat.add", 0, teamWinBlue);
int statPlayersN = statTeamRed.Count;
for (int i = 0; i < statPlayersN; i++) {
db.playerStat[statTeamBlue[i].userID].teamwins++;
db.playerStat[statTeamRed[i].userID].teamloss++;
}
Invoke("EndTeamDuelWithWinners", 5f);
return;
}
if (UnityEngine.Time.realtimeSinceStartup - startTime > duelMaxSec) {
EndTeamDuel(3);
isActive = false;
}
}
if (allReady && !isStarted) {
bool go = true;
int allPlayersCount = allPlayers.Count;
for (int i = 0; i < allPlayersCount; i++) {
if (!allPlayers[i].haveweapon) go = false;
}
if (UnityEngine.Time.realtimeSinceStartup - guiTime > teamChooseWeaponMaxSec && !randomWeaponsHasGiven) {
for (int i = 0; i < allPlayersCount; i++) {
if (!allPlayers[i].haveweapon) GiveRandomWeapon(allPlayers[i].player);
}
randomWeaponsHasGiven = true;
go = true;
}
if (go) {
startTime = UnityEngine.Time.realtimeSinceStartup;
isStarted = true;
allReady = false;
Invoke("StartTeamDuel", 5f);
}
}
}
if (isRequest && isActive) {
if (UnityEngine.Time.realtimeSinceStartup - requestTime > teamDuelRequestSecToClose) {
RequestRemove();
isActive = false;
}
}
}
public void CheckDuellers() {
if (allReady) return;
bool isWound = false;
int allPlayersCount = allPlayers.Count;
for (int i = 0; i < allPlayersCount; i++) {
if (allPlayers[i].player.IsWounded()) {
isWound = true;
}
}
if (isWound) {
if (lastTimeMessage != 0f && UnityEngine.Time.realtimeSinceStartup - lastTimeMessage > 10f) {
for (int i = 0; i < allPlayersCount; i++) {
allPlayers[i].player.ChatMessage(teamDuellerWounded);
}
lastTimeMessage = UnityEngine.Time.realtimeSinceStartup;
Invoke("CheckDuellers", 0.5f);
return;
}
}
arena = FindFreeTeamDuelArena(playersAmount);
if (arena == null) {
if (lastTimeMessage != 0f && UnityEngine.Time.realtimeSinceStartup - lastTimeMessage > 10f) {
for (int i = 0; i < allPlayersCount; i++) {
allPlayers[i].player.ChatMessage(teamArensBusy);
}
}
lastTimeMessage = UnityEngine.Time.realtimeSinceStartup;
Invoke("CheckDuellers", 0.5f);
return;
}
SetSpawns();
guiTime = UnityEngine.Time.realtimeSinceStartup;
allReady = true;
PrepareDuellers();
}
public void PrepareDuellers() {
isRequest = false;
int allPlayersN = allPlayers.Count;
for (int i = 0; i < allPlayersN; i++) {
allPlayers[i].PrepairToDuel();
}
}
public void StartTeamDuel() {
int allPlayersN = allPlayers.Count;
for (int i = 0; i < allPlayersN; i++) {
var dueller = allPlayers[i];
toRemoveCorpse.Add(dueller.player.userID);
dueller.guiEnabled = false;
CuiHelper.DestroyUi(dueller.player, "weaponsgui");
CuiHelper.DestroyUi(dueller.player, "weaponsguiteamweapons");
CuiHelper.DestroyUi(dueller.player, "mouse");
dueller.readyForBattle = true;
dueller.canMove = true;
}
}
public void RequestRemove() {
if (teamblue.Count > 0) {
foreach (DuelPlayer teamblueplayer in teamblue) {
teamblueplayer.player.ChatMessage(String.Format(teamDuelCancelled, teamDuelRequestSecToClose));
teamblueplayer.Destroy();
}
}
if (teamred.Count > 0) {
foreach (DuelPlayer teamredplayer in teamred) {
teamredplayer.player.ChatMessage(String.Format(teamDuelCancelled, teamDuelRequestSecToClose));
teamredplayer.Destroy();
}
}
Destroy();
}
public void EndTeamDuelWithWinners() {
Debug($"Team Дуэль {playersAmount} * {playersAmount} от {owner.displayName} Окончена {arena.name}");
int allPlayersN = allPlayers.Count;
if (allPlayersN > 0) {
for (int i = 0; i < allPlayersN; i++) {
allPlayers[i].ReturnPlayer(0);
}
}
Invoke("Destroy", 2f);
}
public void EndTeamDuel(int reason = 0) {
Debug($"Team Дуэль {playersAmount} * {playersAmount} от {owner.displayName} Прервана {arena.name}");
int allPlayersN = allPlayers.Count;
if (allPlayersN > 0) {
for (int i = 0; i < allPlayersN; i++) {
var dueller = allPlayers[i];
dueller.guiEnabled = false;
CuiHelper.DestroyUi(dueller.player, "weaponsgui");
CuiHelper.DestroyUi(dueller.player, "weaponsguiteamweapons");
CuiHelper.DestroyUi(dueller.play
// ... [Code preview truncated due to length. Full source in attached file] ...