C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using Facepunch;
using UnityEngine;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using System.Collections;
using System.IO;
using UnityEngine.Networking;
using Rust.AI;
using Oxide.Plugins.GasStationEventExtensionMethods;
namespace Oxide.Plugins {
[Info("GasStationEvent", "KpucTaJl", "1.2.5")]
internal class GasStationEvent : RustPlugin {
#region Config
private const bool En = true;
private PluginConfig _config;
protected override void LoadDefaultConfig() {
Puts("Creating a default config...");
_config = PluginConfig.DefaultConfig();
_config.PluginVersion = Version;
SaveConfig();
Puts("Creation of the default config completed!");
}
protected override void LoadConfig() {
base.LoadConfig();
_config = Config.ReadObject<PluginConfig>();
if (_config.PluginVersion < Version) UpdateConfigValues();
}
private void UpdateConfigValues() {
Puts("Config update detected! Updating config values...");
if (_config.PluginVersion < new VersionNumber(1, 0, 9)) {
_config.FirstNpc.Config.Name = "Vagos";
_config.SecondNpc.Config.Name = "Ballas";
}
if (_config.PluginVersion < new VersionNumber(1, 1, 0)) {
_config.CanMountSecondCar = true;
}
if (_config.PluginVersion < new VersionNumber(1, 1, 1)) {
_config.MainPoint = new PointConfig {
Enabled = true, Text = "◈", Size = 45, Color = "#CCFF00"
}
;
_config.AdditionalPoint = new PointConfig {
Enabled = true, Text = "◆", Size = 25, Color = "#FFC700"
}
;
}
if (_config.PluginVersion < new VersionNumber(1, 1, 5)) {
_config.CanOpenFirstDoor = false;
}
if (_config.PluginVersion < new VersionNumber(1, 1, 6)) {
_config.GameTip = new GameTipConfig {
IsGameTip = false, Style = 2
}
;
_config.Marker = new MarkerConfig {
Enabled = true, Type = 1, Radius = 0.37967f, Alpha = 0.35f, Color = new ColorConfig {
R = 0.81f, G = 0.25f, B = 0.15f
}
, Text = "GasStationEvent"
}
;
}
if (_config.PluginVersion < new VersionNumber(1, 2, 2)) {
_config.PveMode.ScaleDamage = new Dictionary<string, float> {
["Npc"]
= 1f
}
;
}
_config.PluginVersion = Version;
Puts("Config update completed!");
SaveConfig();
}
protected override void SaveConfig() => Config.WriteObject(_config);
public class ItemConfig {
[JsonProperty("ShortName")]
public string ShortName {
get;
set;
}
[JsonProperty(En ? "Minimum" : "Минимальное кол-во")]
public int MinAmount {
get;
set;
}
[JsonProperty(En ? "Maximum" : "Максимальное кол-во")]
public int MaxAmount {
get;
set;
}
[JsonProperty(En ? "Chance [0.0-100.0]" : "Шанс выпадения предмета [0.0-100.0]")]
public float Chance {
get;
set;
}
[JsonProperty(En ? "Is this a blueprint? [true/false]" : "Это чертеж? [true/false]")]
public bool IsBluePrint {
get;
set;
}
[JsonProperty("SkinID (0 - default)")]
public ulong SkinId {
get;
set;
}
[JsonProperty(En ? "Name (empty - default)" : "Название (empty - default)")]
public string Name {
get;
set;
}
}
public class LootTableConfig {
[JsonProperty(En ? "Minimum numbers of items" : "Минимальное кол-во элементов")]
public int Min {
get;
set;
}
[JsonProperty(En ? "Maximum numbers of items" : "Максимальное кол-во элементов")]
public int Max {
get;
set;
}
[JsonProperty(En ? "Use minimum and maximum values? [true/false]" : "Использовать минимальное и максимальное значение? [true/false]")]
public bool UseCount {
get;
set;
}
[JsonProperty(En ? "List of items" : "Список предметов")]
public List<ItemConfig> Items {
get;
set;
}
}
public class PrefabConfig {
[JsonProperty(En ? "Chance [0.0-100.0]" : "Шанс выпадения [0.0-100.0]")]
public float Chance {
get;
set;
}
[JsonProperty(En ? "The path to the prefab" : "Путь к prefab-у")]
public string PrefabDefinition {
get;
set;
}
}
public class PrefabLootTableConfig {
[JsonProperty(En ? "Minimum numbers of prefabs" : "Минимальное кол-во prefab-ов")]
public int Min {
get;
set;
}
[JsonProperty(En ? "Maximum numbers of prefabs" : "Максимальное кол-во prefab-ов")]
public int Max {
get;
set;
}
[JsonProperty(En ? "Use minimum and maximum values? [true/false]" : "Использовать минимальное и максимальное значение? [true/false]")]
public bool UseCount {
get;
set;
}
[JsonProperty(En ? "List of prefabs" : "Список prefab-ов")]
public List<PrefabConfig> Prefabs {
get;
set;
}
}
public class CrateConfig {
[JsonProperty("Prefab")]
public string Prefab {
get;
set;
}
[JsonProperty(En ? "Position" : "Позиция")]
public string Position {
get;
set;
}
[JsonProperty(En ? "Rotation" : "Вращение")]
public string Rotation {
get;
set;
}
[JsonProperty(En ? "Which loot table should the plugin use? (0 - default; 1 - own; 2 - AlphaLoot; 3 - CustomLoot; 4 - loot table of the Rust objects; 5 - combine the 1 and 4 methods)" : "Какую таблицу предметов необходимо использовать? (0 - стандартную; 1 - собственную; 2 - AlphaLoot; 3 - CustomLoot; 4 - таблица предметов объектов Rust; 5 - совместить 1 и 4 методы)")]
public int TypeLootTable {
get;
set;
}
[JsonProperty(En ? "Loot table from prefabs (if the loot table type is 4 or 5)" : "Таблица предметов из prefab-ов (если тип таблицы предметов - 4 или 5)")]
public PrefabLootTableConfig PrefabLootTable {
get;
set;
}
[JsonProperty(En ? "Own loot table (if the loot table type is 1 or 5)" : "Собственная таблица предметов (если тип таблицы предметов - 1 или 5)")]
public LootTableConfig OwnLootTable {
get;
set;
}
}
public class ColorConfig {
[JsonProperty("r")]
public float R {
get;
set;
}
[JsonProperty("g")]
public float G {
get;
set;
}
[JsonProperty("b")]
public float B {
get;
set;
}
}
public class MarkerConfig {
[JsonProperty(En ? "Use map marker? [true/false]" : "Использовать маркер на карте? [true/false]")]
public bool Enabled {
get;
set;
}
[JsonProperty(En ? "Type (0 - simple, 1 - advanced)" : "Тип (0 - упрощенный, 1 - расширенный)")]
public int Type {
get;
set;
}
[JsonProperty(En ? "Background radius (if the marker type is 0)" : "Радиус фона (если тип маркера - 0)")]
public float Radius {
get;
set;
}
[JsonProperty(En ? "Background transparency" : "Прозрачность фона")]
public float Alpha {
get;
set;
}
[JsonProperty(En ? "Color" : "Цвет")]
public ColorConfig Color {
get;
set;
}
[JsonProperty(En ? "Text" : "Текст")]
public string Text {
get;
set;
}
}
public class PointConfig {
[JsonProperty(En ? "Enabled? [true/false]" : "Включен? [true/false]")]
public bool Enabled {
get;
set;
}
[JsonProperty(En ? "Text" : "Текст")]
public string Text {
get;
set;
}
[JsonProperty(En ? "Size" : "Размер")]
public int Size {
get;
set;
}
[JsonProperty(En ? "Color" : "Цвет")]
public string Color {
get;
set;
}
}
public class GuiConfig {
[JsonProperty(En ? "Do you use the countdown GUI? [true/false]" : "Использовать ли GUI обратного отсчета? [true/false]")]
public bool IsGui {
get;
set;
}
[JsonProperty("OffsetMin Y")]
public string OffsetMinY {
get;
set;
}
}
public class GameTipConfig {
[JsonProperty(En ? "Use Facepunch Game Tips (notification bar above hotbar)? [true/false]" : "Использовать ли Facepunch Game Tip (оповещения над слотами быстрого доступа игрока)? [true/false]")]
public bool IsGameTip {
get;
set;
}
[JsonProperty(En ? "Style (0 - Blue Normal, 1 - Red Normal, 2 - Blue Long, 3 - Blue Short, 4 - Server Event)" : "Стиль (0 - Blue Normal, 1 - Red Normal, 2 - Blue Long, 3 - Blue Short, 4 - Server Event)")]
public int Style {
get;
set;
}
}
public class GuiAnnouncementsConfig {
[JsonProperty(En ? "Do you use the GUI Announcements? [true/false]" : "Использовать ли GUI Announcements? [true/false]")]
public bool IsGuiAnnouncements {
get;
set;
}
[JsonProperty(En ? "Banner color" : "Цвет баннера")]
public string BannerColor {
get;
set;
}
[JsonProperty(En ? "Text color" : "Цвет текста")]
public string TextColor {
get;
set;
}
[JsonProperty(En ? "Adjust Vertical Position" : "Отступ от верхнего края")]
public float ApiAdjustVPosition {
get;
set;
}
}
public class NotifyConfig {
[JsonProperty(En ? "Do you use the Notify? [true/false]" : "Использовать ли Notify? [true/false]")]
public bool IsNotify {
get;
set;
}
[JsonProperty(En ? "Type" : "Тип")]
public string Type {
get;
set;
}
}
public class DiscordConfig {
[JsonProperty(En ? "Use the plugin DiscordMessages for posting event notifications? [true/false]" : "Использовать ли Discord? [true/false]")]
public bool IsDiscord {
get;
set;
}
[JsonProperty("Webhook URL")]
public string WebhookUrl {
get;
set;
}
[JsonProperty(En ? "Embed Color (DECIMAL)" : "Цвет полосы (DECIMAL)")]
public int EmbedColor {
get;
set;
}
[JsonProperty(En ? "Keys of required messages" : "Ключи необходимых сообщений")]
public HashSet<string> Keys {
get;
set;
}
}
public class EconomyConfig {
[JsonProperty(En ? "Which economy plugins do you want to use? (Economics, Server Rewards, IQEconomic)" : "Какие плагины экономики вы хотите использовать? (Economics, Server Rewards, IQEconomic)")]
public HashSet<string> Plugins {
get;
set;
}
[JsonProperty(En ? "The minimum value that a player must collect to get points for the economy" : "Минимальное значение, которое игрок должен заработать, чтобы получить баллы за экономику")]
public double Min {
get;
set;
}
[JsonProperty(En ? "Looting of crates" : "Ограбление ящиков")]
public Dictionary<string, double> Crates {
get;
set;
}
[JsonProperty(En ? "Killing an NPC" : "Убийство NPC")]
public double Npc {
get;
set;
}
[JsonProperty(En ? "Opening the first door" : "Открытие первой двери")]
public double OpenFirstDoor {
get;
set;
}
[JsonProperty(En ? "Opening the second door" : "Открытие второй двери")]
public double OpenSecondDoor {
get;
set;
}
[JsonProperty(En ? "List of commands that are executed in the console at the end of the event ({steamid} - the player who collected the highest number of points)" : "Список команд, которые выполняются в консоли по окончанию ивента ({steamid} - игрок, который набрал наибольшее кол-во баллов)")]
public HashSet<string> Commands {
get;
set;
}
}
public class PveModeConfig {
[JsonProperty(En ? "Use PVE mode the plugin? [true/false]" : "Использовать PVE режим работы плагина? [true/false]")]
public bool Pve {
get;
set;
}
[JsonProperty(En ? "The amount of damage that the player has to do to become the Event Owner" : "Кол-во урона, которое должен нанести игрок, чтобы стать владельцем ивента")]
public float Damage {
get;
set;
}
[JsonProperty(En ? "Damage Multipliers for calculate to become the Event Owner" : "Коэффициенты урона для подсчета, чтобы стать владельцем ивента")]
public Dictionary<string, float> ScaleDamage {
get;
set;
}
[JsonProperty(En ? "Can the non-owner of the event loot the crates? [true/false]" : "Может ли не владелец ивента грабить ящики? [true/false]")]
public bool LootCrate {
get;
set;
}
[JsonProperty(En ? "Can the non-owner of the event loot NPC corpses? [true/false]" : "Может ли не владелец ивента грабить трупы NPC? [true/false]")]
public bool LootNpc {
get;
set;
}
[JsonProperty(En ? "Can the non-owner of the event deal damage to the NPC? [true/false]" : "Может ли не владелец ивента наносить урон по NPC? [true/false]")]
public bool DamageNpc {
get;
set;
}
[JsonProperty(En ? "Can Npc attack a non-owner of the event? [true/false]" : "Может ли Npc атаковать не владельца ивента? [true/false]")]
public bool TargetNpc {
get;
set;
}
[JsonProperty(En ? "Allow a non-owner of the event to enter the event zone? [true/false]" : "Разрешать входить внутрь зоны ивента не владельцу ивента? [true/false]")]
public bool CanEnter {
get;
set;
}
[JsonProperty(En ? "Allow a player who has an active cooldown of the Event Owner to enter the event zone? [true/false]" : "Разрешать входить внутрь зоны ивента игроку, у которого активен кулдаун на получение статуса владельца ивента? [true/false]")]
public bool CanEnterCooldownPlayer {
get;
set;
}
[JsonProperty(En ? "The time that the Event Owner may not be inside the event zone [sec.]" : "Время, которое владелец ивента может не находиться внутри зоны ивента [сек.]")]
public int TimeExitOwner {
get;
set;
}
[JsonProperty(En ? "The time until the end of Event Owner status when it is necessary to warn the player [sec.]" : "Время таймера до окончания действия статуса владельца ивента, когда необходимо предупредить игрока [сек.]")]
public int AlertTime {
get;
set;
}
[JsonProperty(En ? "Prevent the actions of the RestoreUponDeath plugin in the event zone? [true/false]" : "Запрещать работу плагина RestoreUponDeath в зоне действия ивента? [true/false]")]
public bool RestoreUponDeath {
get;
set;
}
[JsonProperty(En ? "The time that the player can`t become the Event Owner, after the end of the event and the player was its owner [sec.]" : "Время, которое игрок не сможет стать владельцем ивента, после того как ивент окончен и игрок был его владельцем [sec.]")]
public double CooldownOwner {
get;
set;
}
[JsonProperty(En ? "Darkening the dome (0 - disables the dome)" : "Затемнение купола (0 - отключает купол)")]
public int Darkening {
get;
set;
}
}
public class NpcBelt {
[JsonProperty("ShortName")]
public string ShortName {
get;
set;
}
[JsonProperty(En ? "Amount" : "Кол-во")]
public int Amount {
get;
set;
}
[JsonProperty("SkinID (0 - default)")]
public ulong SkinID {
get;
set;
}
[JsonProperty(En ? "Mods" : "Модификации на оружие")]
public HashSet<string> Mods {
get;
set;
}
[JsonProperty(En ? "Ammo" : "Боеприпасы")]
public string Ammo {
get;
set;
}
}
public class NpcWear {
[JsonProperty("ShortName")]
public string ShortName {
get;
set;
}
[JsonProperty("SkinID (0 - default)")]
public ulong SkinID {
get;
set;
}
}
public class NpcConfig {
[JsonProperty(En ? "Name" : "Название")]
public string Name {
get;
set;
}
[JsonProperty(En ? "Health" : "Кол-во ХП")]
public float Health {
get;
set;
}
[JsonProperty(En ? "Roam Range" : "Дальность патрулирования местности")]
public float RoamRange {
get;
set;
}
[JsonProperty(En ? "Chase Range" : "Дальность погони за целью")]
public float ChaseRange {
get;
set;
}
[JsonProperty(En ? "Attack Range Multiplier" : "Множитель радиуса атаки")]
public float AttackRangeMultiplier {
get;
set;
}
[JsonProperty(En ? "Sense Range" : "Радиус обнаружения цели")]
public float SenseRange {
get;
set;
}
[JsonProperty(En ? "Target Memory Duration [sec.]" : "Длительность памяти цели [sec.]")]
public float MemoryDuration {
get;
set;
}
[JsonProperty(En ? "Scale damage" : "Множитель урона")]
public float DamageScale {
get;
set;
}
[JsonProperty(En ? "Aim Cone Scale" : "Множитель разброса")]
public float AimConeScale {
get;
set;
}
[JsonProperty(En ? "Detect the target only in the NPC's viewing vision cone? [true/false]" : "Обнаруживать цель только в углу обзора NPC? [true/false]")]
public bool CheckVisionCone {
get;
set;
}
[JsonProperty(En ? "Vision Cone" : "Угол обзора")]
public float VisionCone {
get;
set;
}
[JsonProperty(En ? "Speed" : "Скорость")]
public float Speed {
get;
set;
}
[JsonProperty(En ? "Disable radio effects? [true/false]" : "Отключать эффекты рации? [true/false]")]
public bool DisableRadio {
get;
set;
}
[JsonProperty(En ? "Is this a stationary NPC? [true/false]" : "Это стационарный NPC? [true/false]")]
public bool Stationary {
get;
set;
}
[JsonProperty(En ? "Remove a corpse after death? (it is recommended to use the true value to improve performance) [true/false]" : "Удалять труп после смерти? (рекомендуется использовать значение true для повышения производительности) [true/false]")]
public bool IsRemoveCorpse {
get;
set;
}
[JsonProperty(En ? "Wear items" : "Одежда")]
public HashSet<NpcWear> WearItems {
get;
set;
}
[JsonProperty(En ? "Belt items" : "Быстрые слоты")]
public HashSet<NpcBelt> BeltItems {
get;
set;
}
[JsonProperty(En ? "Kit (it is recommended to use the previous 2 settings to improve performance)" : "Kit (рекомендуется использовать предыдущие 2 пункта настройки для повышения производительности)")]
public string Kit {
get;
set;
}
}
public class PresetConfig {
[JsonProperty(En ? "Minimum" : "Минимальное кол-во")]
public int Min {
get;
set;
}
[JsonProperty(En ? "Maximum" : "Максимальное кол-во")]
public int Max {
get;
set;
}
[JsonProperty(En ? "List of locations" : "Список расположений")]
public List<string> Positions {
get;
set;
}
[JsonProperty(En ? "NPCs setting" : "Настройки NPC")]
public NpcConfig Config {
get;
set;
}
[JsonProperty(En ? "Which loot table should the plugin use? (0 - default; 1 - own; 2 - AlphaLoot; 3 - CustomLoot; 4 - loot table of the Rust objects; 5 - combine the 1 and 4 methods)" : "Какую таблицу предметов необходимо использовать? (0 - стандартную; 1 - собственную; 2 - AlphaLoot; 3 - CustomLoot; 4 - таблица предметов объектов Rust; 5 - совместить 1 и 4 методы)")]
public int TypeLootTable {
get;
set;
}
[JsonProperty(En ? "Loot table from prefabs (if the loot table type is 4 or 5)" : "Таблица предметов из prefab-ов (если тип таблицы предметов - 4 или 5)")]
public PrefabLootTableConfig PrefabLootTable {
get;
set;
}
[JsonProperty(En ? "Own loot table (if the loot table type is 1 or 5)" : "Собственная таблица предметов (если тип таблицы предметов - 1 или 5)")]
public LootTableConfig OwnLootTable {
get;
set;
}
}
private class PluginConfig {
[JsonProperty(En ? "Minimum time between events [sec.]" : "Минимальное время между ивентами [sec.]")]
public float MinStartTime {
get;
set;
}
[JsonProperty(En ? "Maximum time between events [sec.]" : "Максимальное время между ивентами [sec.]")]
public float MaxStartTime {
get;
set;
}
[JsonProperty(En ? "Is the countdown timer active for the event? [true/false]" : "Активен ли таймер для запуска ивента? [true/false]")]
public bool EnabledTimer {
get;
set;
}
[JsonProperty(En ? "Duration of the event [sec.]" : "Время проведения ивента [sec.]")]
public int FinishTime {
get;
set;
}
[JsonProperty(En ? "Time before the starting of the event after receiving a chat message [sec.]" : "Время до начала ивента после сообщения в чате [sec.]")]
public float PreStartTime {
get;
set;
}
[JsonProperty(En ? "Notification time until the end of the event [sec.]" : "Время оповещения до окончания ивента [sec.]")]
public int PreFinishTime {
get;
set;
}
[JsonProperty(En ? "Loot crate settings for the first room" : "Список ящиков для первой комнаты")]
public HashSet<CrateConfig> FirstCrates {
get;
set;
}
[JsonProperty(En ? "Loot crate settings for the second room" : "Список ящиков для второй комнаты")]
public HashSet<CrateConfig> SecondCrates {
get;
set;
}
[JsonProperty(En ? "NPC settings for the first car" : "Настройка NPC, которые высаживаются из первой машины")]
public PresetConfig FirstNpc {
get;
set;
}
[JsonProperty(En ? "NPC settings for the second car" : "Настройка NPC, которые высаживаются из второй машины")]
public PresetConfig SecondNpc {
get;
set;
}
[JsonProperty(En ? "Marker configuration on the map" : "Настройка маркера на карте")]
public MarkerConfig Marker {
get;
set;
}
[JsonProperty(En ? "Main marker settings for key event points shown on players screen" : "Настройки основного маркера на экране игрока")]
public PointConfig MainPoint {
get;
set;
}
[JsonProperty(En ? "Additional marker settings for key event points shown on players screen" : "Настройки дополнительного маркера на экране игрока")]
public PointConfig AdditionalPoint {
get;
set;
}
[JsonProperty(En ? "GUI setting" : "Настройки GUI")]
public GuiConfig Gui {
get;
set;
}
[JsonProperty(En ? "Prefix of chat messages" : "Префикс сообщений в чате")]
public string Prefix {
get;
set;
}
[JsonProperty(En ? "Do you use the chat? [true/false]" : "Использовать ли чат? [true/false]")]
public bool IsChat {
get;
set;
}
[JsonProperty(En ? "Facepunch Game Tips setting" : "Настройка сообщений Facepunch Game Tip")]
public GameTipConfig GameTip {
get;
set;
}
[JsonProperty(En ? "GUI Announcements setting" : "Настройка GUI Announcements")]
public GuiAnnouncementsConfig GuiAnnouncements {
get;
set;
}
[JsonProperty(En ? "Notify setting" : "Настройка Notify")]
public NotifyConfig Notify {
get;
set;
}
[JsonProperty(En ? "Discord setting (only for users DiscordMessages plugin)" : "Настройка оповещений в Discord (только для тех, кто использует плагин DiscordMessages)")]
public DiscordConfig Discord {
get;
set;
}
[JsonProperty(En ? "Radius of the event zone" : "Радиус зоны ивента")]
public float Radius {
get;
set;
}
[JsonProperty(En ? "Do you create a PVP zone in the event area? (only for users TruePVE plugin) [true/false]" : "Создавать зону PVP в зоне проведения ивента? (только для тех, кто использует плагин TruePVE) [true/false]")]
public bool IsCreateZonePvp {
get;
set;
}
[JsonProperty(En ? "PVE Mode Setting (only for users PveMode plugin)" : "Настройка PVE режима работы плагина (только для тех, кто использует плагин PveMode)")]
public PveModeConfig PveMode {
get;
set;
}
[JsonProperty(En ? "Interrupt the teleport in the event area? (only for users NTeleportation plugin) [true/false]" : "Запрещать телепорт в зоне проведения ивента? (только для тех, кто использует плагин NTeleportation) [true/false]")]
public bool NTeleportationInterrupt {
get;
set;
}
[JsonProperty(En ? "Disable NPCs from the BetterNpc plugin on the monument while the event is on? [true/false]" : "Отключать NPC из плагина BetterNpc на монументе пока проходит ивент? [true/false]")]
public bool RemoveBetterNpc {
get;
set;
}
[JsonProperty(En ? "Economy setting (total values will be added up and rewarded at the end of the event)" : "Настройка экономики (конечное значение суммируется и будет выдано игрокам по окончанию ивента)")]
public EconomyConfig Economy {
get;
set;
}
[JsonProperty(En ? "List of commands banned in the event zone" : "Список команд запрещенных в зоне ивента")]
public HashSet<string> Commands {
get;
set;
}
[JsonProperty(En ? "Engine parts quality for the second car (1 = low, 2 = medium, 3 = high)" : "Уровень компонентов второй машины (1, 2, 3)")]
public int CarComponentLevel {
get;
set;
}
[JsonProperty(En ? "Can players mount in the second car? [true/false]" : "Могут ли игроки садиться во вторую машину? [true/false]")]
public bool CanMountSecondCar {
get;
set;
}
[JsonProperty(En ? "Should the first room door open without entering the password when all NPCs from the second car have been killed? [true/false]" : "Должна ли открываться дверь в первую комнату без ввода пароля, когда все Npc из второй машины были убиты? [true/false]")]
public bool CanOpenFirstDoor {
get;
set;
}
[JsonProperty(En ? "Configuration version" : "Версия конфигурации")]
public VersionNumber PluginVersion {
get;
set;
}
public static PluginConfig DefaultConfig() {
return new PluginConfig {
MinStartTime = 5400f, MaxStartTime = 7200f, EnabledTimer = true, FinishTime = 1800, PreStartTime = 300f, PreFinishTime = 300, FirstCrates = new HashSet<CrateConfig> {
new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/crate_normal.prefab", Position = "(-12.349, 4.488, 19.361)", Rotation = "(0, 114.4, 0)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/crate_normal.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 8, MaxAmount = 8, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
, new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/crate_normal_2.prefab", Position = "(-12.512, 3.25, 18.659)", Rotation = "(0, 310.261, 0)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/crate_normal_2.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 5, MaxAmount = 5, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
, new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/crate_normal_2.prefab", Position = "(-13.664, 3.25, 19.916)", Rotation = "(0, 0, 0)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/crate_normal_2.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 5, MaxAmount = 5, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
, new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/crate_normal_2_food.prefab", Position = "(-13.357, 4.488, 19.861)", Rotation = "(0, 31.016, 0)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/crate_normal_2_food.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 1, MaxAmount = 1, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
, new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/crate_normal_2_medical.prefab", Position = "(-12.215, 3.25, 20.066)", Rotation = "(0, 23.649, 0)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/crate_normal_2_medical.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 1, MaxAmount = 1, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
}
, SecondCrates = new HashSet<CrateConfig> {
new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/underwater_labs/crate_normal.prefab", Position = "(12.709, -5.026, 14.924)", Rotation = "(353.106, 71.077, 28.212)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/underwater_labs/crate_normal.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 8, MaxAmount = 8, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
, new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/underwater_labs/crate_normal_2.prefab", Position = "(13.95, -5.113, 16.062)", Rotation = "(353.052, 75.008, 34.306)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/underwater_labs/crate_normal_2.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 5, MaxAmount = 5, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
, new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/underwater_labs/crate_normal_2.prefab", Position = "(16.564, -5.029, 15.672)", Rotation = "(2.71, 37.996, 33.909)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/underwater_labs/crate_normal_2.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 5, MaxAmount = 5, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
, new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/crate_normal_2_food.prefab", Position = "(10.778, -3.862, 16.185)", Rotation = "(21.782, 7.434, 324.395)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/crate_normal_2_food.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 1, MaxAmount = 1, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
, new CrateConfig {
Prefab = "assets/bundled/prefabs/radtown/crate_normal_2_medical.prefab", Position = "(13.803, -4.279, 14.274)", Rotation = "(30.908, 358.572, 12.651)", TypeLootTable = 0, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = true, Prefabs = new List<PrefabConfig> {
new PrefabConfig {
Chance = 100f, PrefabDefinition = "assets/bundled/prefabs/radtown/crate_normal_2_medical.prefab"
}
}
}
, OwnLootTable = new LootTableConfig {
Min = 1, Max = 1, UseCount = true, Items = new List<ItemConfig> {
new ItemConfig {
ShortName = "scrap", MinAmount = 1, MaxAmount = 1, Chance = 100f, IsBluePrint = false, SkinId = 0, Name = ""
}
}
}
}
}
, FirstNpc = new PresetConfig {
Min = 4, Max = 4, Positions = new List<string> {
"(-1.661, 3.25, -13.205)", "(-0.415, 3.25, -5.062)", "(-0.415, 3.25, 3.988)", "(-14.444, 3.25, 1.745)", "(-13.462, 3.25, -5.102)", "(-13.487, 3.25, 16.148)"
}
, Config = new NpcConfig {
Name = "Vagos", Health = 125f, RoamRange = 5f, ChaseRange = 30f, AttackRangeMultiplier = 3f, SenseRange = 30f, MemoryDuration = 15f, DamageScale = 1.0f, AimConeScale = 1.0f, CheckVisionCone = false, VisionCone = 135f, Speed = 7.5f, DisableRadio = true, Stationary = false, IsRemoveCorpse = true, WearItems = new HashSet<NpcWear> {
new NpcWear {
ShortName = "hat.cap", SkinID = 2414488473
}
, new NpcWear {
ShortName = "hoodie", SkinID = 920529282
}
, new NpcWear {
ShortName = "shoes.boots", SkinID = 2592902166
}
, new NpcWear {
ShortName = "pants", SkinID = 1295278038
}
, new NpcWear {
ShortName = "sunglasses", SkinID = 0
}
}
, BeltItems = new HashSet<NpcBelt> {
new NpcBelt {
ShortName = "pistol.revolver", Amount = 1, SkinID = 2932859228, Mods = new HashSet<string>(), Ammo = string.Empty
}
, new NpcBelt {
ShortName = "syringe.medical", Amount = 2, SkinID = 0, Mods = new HashSet<string>(), Ammo = string.Empty
}
}
, Kit = ""
}
, TypeLootTable = 5, PrefabLootTable = new PrefabLootTableConfig {
Min = 1, Max = 1, UseCount = false, Prefabs = new List<PrefabConfig> {
// ... [Code preview truncated due to length. Full source in attached file] ...