C#:
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace Oxide.Plugins {
[Info("IQRates", "SkuliDropek", "1.3.67")]
[Description("Настройка рейтинга на сервере")]
class IQRates : RustPlugin {
/// <summary>
/// Обновление 1.3.x
/// - Исправил удаление чинука на оилриге после активации ящика
/// - Изменил методы удаления ивентов
/// - Сделал печки более чувствителньыми к рейтам
/// - Теперь можно настраивать уровень потребляемого топлива в печах
/// - Добавил реагирование добычи экскаватора на рейтинг игрока по привилегии
/// - Добавлен черный список предметов для печек
[PluginReference]
Plugin IQChat;
public void SendChat(String Message, BasePlayer player, ConVar.Chat.ChatChannel channel = ConVar.Chat.ChatChannel.Global) {
if (IQChat) if (config.pluginSettings.ReferenceSettings.IQChatSetting.UIAlertUse) IQChat?.Call("API_ALERT_PLAYER_UI", player, Message);
else IQChat?.Call("API_ALERT_PLAYER", player, Message, config.pluginSettings.ReferenceSettings.IQChatSetting.CustomPrefix, config.pluginSettings.ReferenceSettings.IQChatSetting.CustomAvatar);
else player.SendConsoleCommand("chat.add", channel, 0, Message);
}
private const Boolean LanguageEn = false;
#region Vars
private MonumentInfo SpacePort;
public List<UInt64> LootersListCrateID = new List<UInt64>();
public static IQRates _;
public enum SkipType {
Day, Night
}
#endregion
#region Configuration
private static Configuration config = new Configuration();
private class Configuration {
[JsonProperty(LanguageEn ? "Plugin setup" : "Настройка плагина")]
public PluginSettings pluginSettings = new PluginSettings();
internal class PluginSettings {
[JsonProperty(LanguageEn ? "Rating settings" : "Настройка рейтингов")]
public Rates RateSetting = new Rates();
[JsonProperty(LanguageEn ? "Additional plugin settings" : "Дополнительная настройка плагина")]
public OtherSettings OtherSetting = new OtherSettings();
[JsonProperty(LanguageEn ? "Configuring supported plugins" : "Настройка поддерживаемых плагинов")]
public ReferencePlugin ReferenceSettings = new ReferencePlugin();
internal class ReferencePlugin {
[JsonProperty(LanguageEn ? "Setting up IQChat" : "Настройка IQChat")]
public IQChatReference IQChatSetting = new IQChatReference();
internal class IQChatReference {
[JsonProperty(LanguageEn ? "IQChat : Custom prefix in chat" : "IQChat : Кастомный префикс в чате")]
public String CustomPrefix = "[IQRates]";
[JsonProperty(LanguageEn ? "IQChat : Custom chat avatar (If required)" : "IQChat : Кастомный аватар в чате(Если требуется)")]
public String CustomAvatar = "0";
[JsonProperty(LanguageEn ? "IQChat : Use UI Notifications" : "IQChat : Использовать UI уведомления")]
public Boolean UIAlertUse = false;
}
}
internal class Rates {
[JsonProperty(LanguageEn ? "Ranking setting during the day" : "Настройка рейтинга днем")]
public AllRates DayRates = new AllRates();
[JsonProperty(LanguageEn ? "Setting the rating at night" : "Настройка рейтинга ночью")]
public AllRates NightRates = new AllRates();
[JsonProperty(LanguageEn ? "Setting privileges and ratings specifically for them [iqrates.vip] = { Setting } (Descending)" : "Настройка привилегий и рейтингов конкретно для них [iqrates.vip] = { Настройка } (По убыванию)")]
public Dictionary<String, DayAnNightRate> PrivilegyRates = new Dictionary<String, DayAnNightRate>();
[JsonProperty(LanguageEn ? "Setting custom rates (items) by permission - setting (Descending)" : "Настройка кастомных рейтов(предметов) по пермишенсу - настройка (По убыванию)")]
public PermissionsRate CustomRatesPermissions = new PermissionsRate();
[JsonProperty(LanguageEn ? "Black list of items that will not be categorically affected by the rating" : "Черный лист предметов,на которые катигорично не будут действовать рейтинг")]
public List<String> BlackList = new List<String>();
[JsonProperty(LanguageEn ? "Enable melting speed in furnaces (true - yes/false - no)" : "Включить скорость плавки в печах(true - да/false - нет)")]
public Boolean UseSpeedBurnable;
[JsonProperty(LanguageEn ? "A black list of items for the stove, which will not be categorically affected by melting" : "Черный лист предметов для печки,на которые катигорично не будут действовать плавка")]
public List<String> BlackListBurnable = new List<String>();
[JsonProperty(LanguageEn ? "Furnace smelting speed (If the list is enabled, this value will be the default for everyone who does not have rights)" : "Скорость плавки печей(Если включен список - это значение будет стандартное для всех у кого нет прав)")]
public Single SpeedBurnable;
[JsonProperty(LanguageEn ? "Smelting Fuel Usage Rating (If the list is enabled, this value will be the default value for all non-licensed)" : "Рейтинг использования топлива при переплавки(Если включен список - это значение будет стандартное для всех у кого нет прав)")]
public Int32 SpeedFuelBurnable = 1;
[JsonProperty(LanguageEn ? "Enable list of melting speed in furnaces (true - yes/false - no)" : "Включить список скорости плавки в печах(true - да/false - нет)")]
public Boolean UseSpeedBurnableList;
[JsonProperty(LanguageEn ? "Setting the melting speed in furnaces by privileges" : "Настройка скорости плавки в печах по привилегиям")]
public List<SpeedBurnablePreset> SpeedBurableList = new List<SpeedBurnablePreset>();
internal class DayAnNightRate {
[JsonProperty(LanguageEn ? "Ranking setting during the day" : "Настройка рейтинга днем")]
public AllRates DayRates = new AllRates();
[JsonProperty(LanguageEn ? "Setting the rating at night" : "Настройка рейтинга ночью")]
public AllRates NightRates = new AllRates();
}
internal class SpeedBurnablePreset {
[JsonProperty(LanguageEn ? "Permissions" : "Права")]
public String Permissions;
[JsonProperty(LanguageEn ? "Furnace melting speed" : "Скорость плавки печей")]
public Single SpeedBurnable;
[JsonProperty(LanguageEn ? "Smelting Fuel Use Rating" : "Рейтинг использования топлива при переплавки")]
public Int32 SpeedFuelBurnable = 1;
}
internal class PermissionsRate {
[JsonProperty(LanguageEn ? "Ranking setting during the day" : "Настройка рейтинга днем")]
public Dictionary<String, List<PermissionsRateDetalis>> DayRates = new Dictionary<String, List<PermissionsRateDetalis>>();
[JsonProperty(LanguageEn ? "Setting the rating at night" : "Настройка рейтинга ночью")]
public Dictionary<String, List<PermissionsRateDetalis>> NightRates = new Dictionary<String, List<PermissionsRateDetalis>>();
public class PermissionsRateDetalis {
[JsonProperty(LanguageEn ? "Shortname" : "Shortname")]
public String Shortname;
[JsonProperty(LanguageEn ? "Rate" : "Рейтинг")]
public Single Rate;
}
}
internal class AllRates {
[JsonProperty(LanguageEn ? "Rating of extracted resources" : "Рейтинг добываемых ресурсов")]
public Single GatherRate;
[JsonProperty(LanguageEn ? "Rating of found items" : "Рейтинг найденных предметов")]
public Single LootRate;
[JsonProperty(LanguageEn ? "Pickup Rating" : "Рейтинг поднимаемых предметов")]
public Single PickUpRate;
[JsonProperty(LanguageEn ? "Rating of plants raised from the beds" : "Рейтинг поднимаемых растений с грядок")]
public Single GrowableRate = 1.0f;
[JsonProperty(LanguageEn ? "Quarry rating" : "Рейтинг карьеров")]
public Single QuarryRate;
[JsonProperty(LanguageEn ? "Excavator Rating" : "Рейтинг экскаватора")]
public Single ExcavatorRate;
[JsonProperty(LanguageEn ? "Coal drop chance" : "Шанс выпадения угля")]
public Single CoalRare;
}
}
internal class OtherSettings {
[JsonProperty(LanguageEn ? "Event settings on the server" : "Настройки ивентов на сервере")]
public EventSettings EventSetting = new EventSettings();
[JsonProperty(LanguageEn ? "Fuel settings when buying vehicles from NPCs" : "Настройки топлива при покупке транспорта у NPC")]
public FuelSettings FuelSetting = new FuelSettings();
internal class FuelSettings {
[JsonProperty(LanguageEn ? "Amount of fuel for boats" : "Кол-во топлива у лодок")]
public Int32 AmountBoat = 200;
[JsonProperty(LanguageEn ? "The amount of fuel in submarines" : "Кол-во топлива у подводных лодок")]
public Int32 AmountSubmarine = 200;
[JsonProperty(LanguageEn ? "Minicopter fuel quantity" : "Кол-во топлива у миникоптера")]
public Int32 AmountMinicopter = 200;
[JsonProperty(LanguageEn ? "Helicopter fuel quantity" : "Кол-во топлива у вертолета")]
public Int32 AmountScrapTransport = 200;
}
[JsonProperty(LanguageEn ? "Use Time Acceleration" : "Использовать ускорение времени")]
public Boolean UseTime;
[JsonProperty(LanguageEn ? "Use time freeze (the time will be the one you set in the item <Frozen time on the server>)" : "Использовать заморозку времени(время будет такое, какое вы установите в пунке <Замороженное время на сервере>)")]
public Boolean UseFreezeTime;
[JsonProperty(LanguageEn ? "Frozen time on the server (Set time that will not change and be forever on the server, must be true on <Use time freeze>" : "Замороженное время на сервере (Установите время, которое не будет изменяться и будет вечно на сервере, должен быть true на <Использовать заморозку времени>")]
public Int32 FreezeTime;
[JsonProperty(LanguageEn ? "What time will the day start?" : "Укажите во сколько будет начинаться день")]
public Int32 DayStart;
[JsonProperty(LanguageEn ? "What time will the night start?" : "Укажите во сколько будет начинаться ночь")]
public Int32 NightStart;
[JsonProperty(LanguageEn ? "Specify how long the day will be in minutes" : "Укажите сколько будет длится день в минутах")]
public Int32 DayTime;
[JsonProperty(LanguageEn ? "Specify how long the night will last in minutes" : "Укажите сколько будет длится ночь в минутах")]
public Int32 NightTime;
[JsonProperty(LanguageEn ? "Use notification of players about the change of day and night (switching rates.The message is configured in the lang)" : "Использовать уведомление игроков о смене дня и ночи (переключение рейтов.Сообщение настраивается в лэнге)")]
public Boolean UseAlertDayNight = true;
[JsonProperty(LanguageEn ? "Enable the ability to completely skip the time of day (selected in the paragraph below)" : "Включить возможность полного пропуска времени суток(выбирается в пункте ниже)")]
public Boolean UseSkipTime = true;
[JsonProperty(LanguageEn ? "Select the type of time-of-day skip (0 - Skip day, 1 - Skip night)" : "Выберите тип пропуска времени суток (0 - Пропускать день, 1 - Пропускать ночь)(Не забудьте включить возможность полного пропуска времени суток)")]
public SkipType TypeSkipped = SkipType.Night;
internal class EventSettings {
[JsonProperty(LanguageEn ? "Helicopter spawn custom settings" : "Кастомные настройки спавна вертолета")]
public Setting HelicopterSetting = new Setting();
[JsonProperty(LanguageEn ? "Custom tank spawn settings" : "Кастомные настройки спавна танка")]
public Setting BreadlaySetting = new Setting();
[JsonProperty(LanguageEn ? "Custom ship spawn settings" : "Кастомные настройки спавна корабля")]
public Setting CargoShipSetting = new Setting();
[JsonProperty(LanguageEn ? "Airdrop spawn custom settings" : "Кастомные настройки спавна аирдропа")]
public Setting CargoPlaneSetting = new Setting();
[JsonProperty(LanguageEn ? "Chinook custom spawn settings" : "Кастомные настройки спавна чинука")]
public Setting ChinoockSetting = new Setting();
internal class Setting {
[JsonProperty(LanguageEn ? "Completely disable event spawning on the server (true - yes/false - no)" : "Полностью отключить спавн ивента на сервере(true - да/false - нет)")]
public Boolean FullOff;
[JsonProperty(LanguageEn ? "Enable custom spawn event (true - yes/false - no)" : "Включить кастомный спавн ивент(true - да/false - нет)")]
public Boolean UseEventCustom;
[JsonProperty(LanguageEn ? "Static event spawn time" : "Статическое время спавна ивента")]
public Int32 EventSpawnTime;
[JsonProperty(LanguageEn ? "Random spawn time settings" : "Настройки случайного времени спавна")]
public RandomingTime RandomTimeSpawn = new RandomingTime();
internal class RandomingTime {
[JsonProperty(LanguageEn ? "Use random event spawn time (static time will not be taken into account) (true - yes/false - no)" : "Использовать случайное время спавно ивента(статическое время не будет учитываться)(true - да/false - нет)")]
public Boolean UseRandomTime;
[JsonProperty(LanguageEn ? "Minimum event spawn value" : "Минимальное значение спавна ивента")]
public Int32 MinEventSpawnTime;
[JsonProperty(LanguageEn ? "Max event spawn value" : "Максимальное значении спавна ивента")]
public Int32 MaxEventSpawnTime;
}
}
}
}
}
public static Configuration GetNewConfiguration() {
return new Configuration {
pluginSettings = new PluginSettings {
ReferenceSettings = new PluginSettings.ReferencePlugin {
IQChatSetting = new PluginSettings.ReferencePlugin.IQChatReference {
CustomAvatar = "0", CustomPrefix = "[IQRates]", UIAlertUse = false,
}
,
}
, RateSetting = new PluginSettings.Rates {
UseSpeedBurnable = true, SpeedBurnable = 3.5f, SpeedFuelBurnable = 2, BlackListBurnable = new List<String> {
"wolfmeat.cooked", "deermeat.cooked", "meat.pork.cooked", "humanmeat.cooked", "chicken.cooked", "bearmeat.cooked", "horsemeat.cooked",
}
, UseSpeedBurnableList = true, SpeedBurableList = new List<PluginSettings.Rates.SpeedBurnablePreset> {
new PluginSettings.Rates.SpeedBurnablePreset {
Permissions = "iqrates.vip", SpeedBurnable = 5.0f, SpeedFuelBurnable = 20,
}
, new PluginSettings.Rates.SpeedBurnablePreset {
Permissions = "iqrates.speedrun", SpeedBurnable = 55.0f, SpeedFuelBurnable = 20,
}
, new PluginSettings.Rates.SpeedBurnablePreset {
Permissions = "iqrates.fuck", SpeedBurnable = 200f, SpeedFuelBurnable = 20,
}
,
}
, DayRates = new PluginSettings.Rates.AllRates {
GatherRate = 1.0f, LootRate = 1.0f, PickUpRate = 1.0f, GrowableRate = 1.0f, QuarryRate = 1.0f, ExcavatorRate = 1.0f, CoalRare = 10,
}
, NightRates = new PluginSettings.Rates.AllRates {
GatherRate = 2.0f, LootRate = 2.0f, PickUpRate = 2.0f, GrowableRate = 2.0f, QuarryRate = 2.0f, ExcavatorRate = 2.0f, CoalRare = 15,
}
, CustomRatesPermissions = new PluginSettings.Rates.PermissionsRate {
DayRates = new Dictionary<String, List<PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis>> {
["iqrates.gg"]
= new List<PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis> {
new PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis {
Rate = 200.0f, Shortname = "wood",
}
, new PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis {
Rate = 200.0f, Shortname = "stones",
}
}
}
, NightRates = new Dictionary<string, List<PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis>> {
["iqrates.gg"]
= new List<PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis> {
new PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis {
Rate = 400.0f, Shortname = "wood",
}
, new PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis {
Rate = 400.0f, Shortname = "stones",
}
}
}
,
}
, PrivilegyRates = new Dictionary<string, PluginSettings.Rates.DayAnNightRate> {
["iqrates.vip"]
= new PluginSettings.Rates.DayAnNightRate {
DayRates = {
GatherRate = 3.0f, LootRate = 3.0f, PickUpRate = 3.0f, QuarryRate = 3.0f, GrowableRate = 3.0f, ExcavatorRate = 3.0f, CoalRare = 15,
}
, NightRates = new PluginSettings.Rates.AllRates {
GatherRate = 13.0f, LootRate = 13.0f, PickUpRate = 13.0f, GrowableRate = 13.0f, QuarryRate = 13.0f, ExcavatorRate = 13.0f, CoalRare = 25,
}
}
, ["iqrates.premium"] = new PluginSettings.Rates.DayAnNightRate {
DayRates = {
GatherRate = 3.5f, LootRate = 3.5f, PickUpRate = 3.5f, GrowableRate = 3.5f, QuarryRate = 3.5f, ExcavatorRate = 3.5f, CoalRare = 20,
}
, NightRates = new PluginSettings.Rates.AllRates {
GatherRate = 13.5f, LootRate = 13.5f, PickUpRate = 13.5f, GrowableRate = 13.5f, QuarryRate = 13.5f, ExcavatorRate = 13.5f, CoalRare = 20,
}
}
,
}
, BlackList = new List<String> {
"sulfur.ore",
}
,
}
, OtherSetting = new PluginSettings.OtherSettings {
UseAlertDayNight = true, UseSkipTime = true, TypeSkipped = SkipType.Night, UseTime = false, FreezeTime = 12, UseFreezeTime = true, DayStart = 10, NightStart = 22, DayTime = 5, NightTime = 1, FuelSetting = new PluginSettings.OtherSettings.FuelSettings {
AmountBoat = 200, AmountMinicopter = 200, AmountScrapTransport = 200, AmountSubmarine = 200
}
, EventSetting = new PluginSettings.OtherSettings.EventSettings {
BreadlaySetting = new PluginSettings.OtherSettings.EventSettings.Setting {
FullOff = false, UseEventCustom = true, EventSpawnTime = 3000, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
UseRandomTime = false, MaxEventSpawnTime = 3000, MinEventSpawnTime = 1000,
}
,
}
, CargoPlaneSetting = new PluginSettings.OtherSettings.EventSettings.Setting {
FullOff = false, UseEventCustom = true, EventSpawnTime = 5000, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
UseRandomTime = false, MaxEventSpawnTime = 3000, MinEventSpawnTime = 1000,
}
,
}
, CargoShipSetting = new PluginSettings.OtherSettings.EventSettings.Setting {
FullOff = false, UseEventCustom = true, EventSpawnTime = 0, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
UseRandomTime = true, MaxEventSpawnTime = 3000, MinEventSpawnTime = 8000,
}
,
}
, ChinoockSetting = new PluginSettings.OtherSettings.EventSettings.Setting {
FullOff = true, UseEventCustom = false, EventSpawnTime = 3000, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
UseRandomTime = false, MaxEventSpawnTime = 3000, MinEventSpawnTime = 1000,
}
,
}
, HelicopterSetting = new PluginSettings.OtherSettings.EventSettings.Setting {
FullOff = true, UseEventCustom = false, EventSpawnTime = 3000, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
UseRandomTime = false, MaxEventSpawnTime = 3000, MinEventSpawnTime = 1000,
}
,
}
,
}
}
,
}
}
;
}
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
}
catch {
PrintWarning(LanguageEn ? "Error #3314013" + $"read configuration 'oxide/config/{Name}', create a new configuration!!" : "Ошибка #3314013" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
//#333
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Metods
public void Register(string Permissions) {
if (!String.IsNullOrWhiteSpace(Permissions)) if (!permission.PermissionExists(Permissions, this)) permission.RegisterPermission(Permissions, this);
}
#region Events
private const string prefabCH47 = "assets/prefabs/npc/ch47/ch47scientists.entity.prefab";
private const string prefabPlane = "assets/prefabs/npc/cargo plane/cargo_plane.prefab";
private const string prefabShip = "assets/content/vehicles/boats/cargoship/cargoshiptest.prefab";
private const string prefabPatrol = "assets/prefabs/npc/patrol helicopter/patrolhelicopter.prefab";
private Int32 GetRandomTime(Int32 Min, Int32 Max) => UnityEngine.Random.Range(Min, Max);
void StartEvent() {
var EventSettings = config.pluginSettings.OtherSetting.EventSetting;
StartCargoShip(EventSettings);
StartCargoPlane(EventSettings);
StartBreadley(EventSettings);
StartChinoock(EventSettings);
StartHelicopter(EventSettings);
}
private void StartCargoShip(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
if (!EventSettings.CargoShipSetting.FullOff && EventSettings.CargoShipSetting.UseEventCustom) {
Int32 TimeSpawn = EventSettings.CargoShipSetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.CargoShipSetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.CargoShipSetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.CargoShipSetting.EventSpawnTime;
timer.Once(TimeSpawn, () => {
StartCargoShip(EventSettings);
SpawnCargo();
}
);
}
}
private void StartCargoPlane(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
if (!EventSettings.CargoPlaneSetting.FullOff && EventSettings.CargoPlaneSetting.UseEventCustom) {
Int32 TimeSpawn = EventSettings.CargoPlaneSetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.CargoPlaneSetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.CargoPlaneSetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.CargoPlaneSetting.EventSpawnTime;
timer.Once(TimeSpawn, () => {
StartCargoPlane(EventSettings);
SpawnPlane();
}
);
}
}
private void StartBreadley(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
if (SpacePort == null) return;
if (!EventSettings.BreadlaySetting.FullOff && EventSettings.BreadlaySetting.UseEventCustom) {
Int32 TimeSpawn = EventSettings.BreadlaySetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.BreadlaySetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.BreadlaySetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.BreadlaySetting.EventSpawnTime;
timer.Once(TimeSpawn, () => {
StartBreadley(EventSettings);
SpawnTank();
}
);
}
}
private void StartChinoock(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
if (!EventSettings.ChinoockSetting.FullOff && EventSettings.ChinoockSetting.UseEventCustom) {
Int32 TimeSpawn = EventSettings.ChinoockSetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.ChinoockSetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.ChinoockSetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.ChinoockSetting.EventSpawnTime;
timer.Once(TimeSpawn, () => {
StartChinoock(EventSettings);
SpawnCH47();
}
);
}
}
private void StartHelicopter(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
if (!EventSettings.HelicopterSetting.FullOff && EventSettings.HelicopterSetting.UseEventCustom) {
Int32 TimeSpawn = EventSettings.HelicopterSetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.HelicopterSetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.HelicopterSetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.HelicopterSetting.EventSpawnTime;
timer.Once(TimeSpawn, () => {
StartHelicopter(EventSettings);
SpawnHeli();
}
);
}
}
private void UnSubProSub(int time = 1) {
Unsubscribe("OnEntitySpawned");
timer.Once(time, () => {
Subscribe("OnEntitySpawned");
}
);
}
void SpawnCH47() {
UnSubProSub();
var position = new Vector3(ConVar.Server.worldsize, 100, ConVar.Server.worldsize) - new Vector3(50f, 0f, 50f);
var entity = GameManager.server.CreateEntity(prefabCH47, position) as CH47HelicopterAIController;
entity?.TriggeredEventSpawn();
entity?.Spawn();
}
void SpawnCargo() {
UnSubProSub();
var x = TerrainMeta.Size.x;
var vector3 = Vector3Ex.Range(-1f, 1f);
vector3.y = 0.0f;
vector3.Normalize();
var worldPos = vector3 * (x * 1f);
worldPos.y = TerrainMeta.WaterMap.GetHeight(worldPos);
var entity = GameManager.server.CreateEntity(prefabShip, worldPos);
entity?.Spawn();
}
void SpawnHeli() {
UnSubProSub();
var position = new Vector3(ConVar.Server.worldsize, 100, ConVar.Server.worldsize) - new Vector3(50f, 0f, 50f);
var entity = GameManager.server.CreateEntity(prefabPatrol, position);
entity?.Spawn();
}
void SpawnPlane() {
UnSubProSub();
var position = new Vector3(ConVar.Server.worldsize, 100, ConVar.Server.worldsize) - new Vector3(50f, 0f, 50f);
var entity = GameManager.server.CreateEntity(prefabPlane, position);
entity?.Spawn();
}
private void SpawnTank() {
UnSubProSub();
if (!BradleySpawner.singleton.spawned.isSpawned) BradleySpawner.singleton?.SpawnBradley();
}
#endregion
#region ConvertedMetods
enum Types {
Gather, Loot, PickUP, Quarry, Excavator, Growable,
}
int Converted(Types RateType, string Shortname, float Amount, BasePlayer player = null) {
float ConvertedAmount = Amount;
if (IsBlackList(Shortname)) return Convert.ToInt32(ConvertedAmount);
var PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
Boolean IsTimes = IsTime();
var Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
if (player != null) {
var CustomRate = IsTimes ? config.pluginSettings.RateSetting.CustomRatesPermissions.DayRates : config.pluginSettings.RateSetting.CustomRatesPermissions.NightRates;
var Rate = CustomRate.FirstOrDefault(x => IsPermission(player.UserIDString, x.Key));
//dbg
if (Rate.Value != null) foreach (var RateValue in Rate.Value.Where(x => x.Shortname == Shortname)) {
ConvertedAmount = Amount * RateValue.Rate;
return (int)ConvertedAmount;
}
foreach (var RatesSetting in PrivilegyRates) if (IsPermission(player.UserIDString, RatesSetting.Key)) Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
}
switch (RateType) {
case Types.Gather : {
ConvertedAmount = Amount * Rates.GatherRate;
break;
}
case Types.Loot : {
ConvertedAmount = Amount * Rates.LootRate;
break;
}
case Types.PickUP : {
ConvertedAmount = Amount * Rates.PickUpRate;
break;
}
case Types.Growable : {
ConvertedAmount = Amount * Rates.GrowableRate;
break;
}
case Types.Quarry : {
ConvertedAmount = Amount * Rates.QuarryRate;
break;
}
case Types.Excavator : {
ConvertedAmount = Amount * Rates.ExcavatorRate;
break;
}
}
return Convert.ToInt32(ConvertedAmount);
}
float GetRareCoal(BasePlayer player = null) {
Boolean IsTimes = IsTime();
var Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
var PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
if (player != null) {
foreach (var RatesSetting in PrivilegyRates) if (IsPermission(player.UserIDString, RatesSetting.Key)) Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
}
float Rare = Rates.CoalRare;
float RareResult = (100 - Rare) / 100;
return RareResult;
}
#endregion
#region FuelSystem
private void FuelSystemRating(EntityFuelSystem FuelSystem, Int32 Amount) {
if (FuelSystem == null) return;
NextTick(() => {
Item Fuel = FuelSystem.GetFuelItem();
if (Fuel == null) return;
if (Fuel.amount == 50 || Fuel.amount == 100) Fuel.amount = Amount;
}
);
}
#endregion
#region BoolMetods
bool IsBlackList(string Shortname) {
var BlackList = config.pluginSettings.RateSetting.BlackList;
if (BlackList.Contains(Shortname)) return true;
else return false;
}
bool IsBlackListBurnable(string Shortname) {
var BlackList = config.pluginSettings.RateSetting.BlackListBurnable;
if (BlackList.Contains(Shortname)) return true;
else return false;
}
bool IsTime() {
var Settings = config.pluginSettings.OtherSetting;
float TimeServer = TOD_Sky.Instance.Cycle.Hour;
return TimeServer < Settings.NightStart && Settings.DayStart <= TimeServer;
}
bool IsPermission(string userID, string Permission) {
if (permission.UserHasPermission(userID, Permission)) return true;
else return false;
}
#endregion
#endregion
#region Commands
[ChatCommand("rates")]
private void GetInfoMyRates(BasePlayer player) {
if (player == null) return;
var PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
Boolean IsTimes = IsTime();
var Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
var CustomRate = IsTimes ? config.pluginSettings.RateSetting.CustomRatesPermissions.DayRates : config.pluginSettings.RateSetting.CustomRatesPermissions.NightRates;
var Rate = CustomRate.FirstOrDefault(x => IsPermission(player.UserIDString, x.Key));
foreach (var RatesSetting in PrivilegyRates) if (IsPermission(player.UserIDString, RatesSetting.Key)) Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
SendChat(GetLang("MY_RATES_INFO", player.UserIDString, Rates.GatherRate, Rates.LootRate, Rates.PickUpRate, Rates.QuarryRate, Rates.ExcavatorRate, Rates.GrowableRate), player);
}
#endregion
#region Hooks
#region Player Gather Hooks
object OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item) {
BasePlayer player = entity as BasePlayer;
if (item == null || player == null) return null;
int Rate = Converted(Types.Gather, item.info.shortname, item.amount, player);
item.amount = Rate;
return null;
}
void OnDispenserBonus(ResourceDispenser disp, BasePlayer player, Item item) {
if (item == null || player == null) return;
int Rate = Converted(Types.Gather, item.info.shortname, item.amount, player);
item.amount = Rate;
}
#endregion
#region Player PickUP Hooks
void OnCollectiblePickup(Item item, BasePlayer player) {
if (player == null || item == null) return;
item.amount = Converted(Types.PickUP, item.info.shortname, item.amount, player);
}
void OnGrowableGathered(GrowableEntity plant, Item item, BasePlayer player) {
if (item == null || player == null) return;
item.amount = Converted(Types.Growable, item.info.shortname, item.amount, player);
}
void OnContainerDropItems(ItemContainer container) {
if (container == null) return;
var Container = container.entityOwner as LootContainer;
if (Container == null) return;
uint NetID = Container.net.ID;
if (LootersListCrateID.Contains(NetID)) return;
BasePlayer player = Container.lastAttacker as BasePlayer;
foreach (var item in container.itemList) item.amount = Converted(Types.Loot, item.info.shortname, item.amount, player);
}
#endregion
#region Player Loot Hooks
void OnLootEntity(BasePlayer player, BaseEntity entity) {
if (entity == null) return;
LootContainer container = entity as LootContainer;
if (container == null || entity.net == null) return;
UInt64 NetID = entity.net.ID;
if (LootersListCrateID.Contains(NetID)) return;
foreach (Item item in container.inventory.itemList) item.amount = Converted(Types.Loot, item.info.shortname, item.amount, player);
LootersListCrateID.Add(NetID);
}
void OnEntityKill(BaseNetworkable entity) {
if (entity == null || entity.net == null) return;
UInt64 NetID = entity.net.ID;
if (LootersListCrateID.Contains(NetID)) LootersListCrateID.Remove(NetID);
}
#endregion
#region Quarry Gather Hooks
void OnQuarryGather(MiningQuarry quarry, Item item) {
if (item == null || quarry == null) return;
BasePlayer player = quarry.OwnerID != 0 ? BasePlayer.FindByID(quarry.OwnerID) : null;
item.amount = Converted(Types.Quarry, item.info.shortname, item.amount, player);
}
#endregion
#region Exacavator Gather Hooks
private BasePlayer ExcavatorPlayer = null;
void OnExcavatorResourceSet(ExcavatorArm arm, string resourceName, BasePlayer player) {
if (arm == null || player == null) return;
ExcavatorPlayer = player;
}
private object OnExcavatorGather(ExcavatorArm arm, Item item) {
if (arm == null) return null;
if (item == null) return null;
item.amount = Converted(Types.Excavator, item.info.shortname, item.amount, ExcavatorPlayer);
return null;
}
#endregion
#region Coal Hooks
void OnFuelConsume(BaseOven oven, Item fuel, ItemModBurnable burnable) {
if (oven == null) return;
burnable.byproductChance = GetRareCoal(BasePlayer.FindByID(oven.OwnerID));
if (burnable.byproductChance == 0) burnable.byproductChance = -1;
}
#endregion
#region Server Hooks
TOD_Time timeComponent = null;
Boolean activatedDay;
private void GetTimeComponent() {
timeComponent = TOD_Sky.Instance.Components.Time;
if (timeComponent == null) return;
SetTimeComponent();
StartupFreeze();
}
void SetTimeComponent() {
if (!config.pluginSettings.OtherSetting.UseTime) return;
timeComponent.ProgressTime = true;
timeComponent.UseTimeCurve = false;
timeComponent.OnSunrise += OnSunrise;
timeComponent.OnSunset += OnSunset;
timeComponent.OnHour += OnHour;
if (TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunriseTime && TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunsetTime) OnSunrise();
else OnSunset();
}
void OnHour() {
if (TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunriseTime && TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunsetTime && TOD_Sky.Instance.Cycle.Hour >= config.pluginSettings.OtherSetting.DayStart && !activatedDay) {
OnSunrise();
return;
}
if ((TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunsetTime || TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunriseTime) && TOD_Sky.Instance.Cycle.Hour >= config.pluginSettings.OtherSetting.NightStart && activatedDay) {
OnSunset();
return;
}
}
void OnSunrise() {
timeComponent.DayLengthInMinutes = config.pluginSettings.OtherSetting.DayTime * (24.0f / (TOD_Sky.Instance.SunsetTime - TOD_Sky.Instance.SunriseTime));
activatedDay = true;
if (config.pluginSettings.OtherSetting.UseSkipTime) {
if (config.pluginSettings.OtherSetting.TypeSkipped == SkipType.Day) TOD_Sky.Instance.Cycle.Hour = config.pluginSettings.OtherSetting.NightStart;
else {
if (config.pluginSettings.OtherSetting.UseAlertDayNight) {
Configuration.PluginSettings.Rates.AllRates Rate = config.pluginSettings.RateSetting.DayRates;
foreach (BasePlayer player in BasePlayer.activePlayerList) SendChat(GetLang("DAY_RATES_ALERT", player.UserIDString, Rate.GatherRate, Rate.LootRate, Rate.PickUpRate, Rate.QuarryRate, Rate.ExcavatorRate, Rate.GrowableRate), player);
}
}
return;
}
if (config.pluginSettings.OtherSetting.UseAlertDayNight) {
Configuration.PluginSettings.Rates.AllRates Rate = config.pluginSettings.RateSetting.DayRates;
foreach (BasePlayer player in BasePlayer.activePlayerList) SendChat(GetLang("DAY_RATES_ALERT", player.UserIDString, Rate.GatherRate, Rate.LootRate, Rate.PickUpRate, Rate.QuarryRate, Rate.ExcavatorRate, Rate.GrowableRate), player);
}
}
void OnSunset() {
timeComponent.DayLengthInMinutes = config.pluginSettings.OtherSetting.NightTime * (24.0f / (24.0f - (TOD_Sky.Instance.SunsetTime - TOD_Sky.Instance.SunriseTime)));
activatedDay = false;
if (config.pluginSettings.OtherSetting.UseSkipTime) {
if (config.pluginSettings.OtherSetting.TypeSkipped == SkipType.Night) TOD_Sky.Instance.Cycle.Hour = config.pluginSettings.OtherSetting.DayStart;
else {
if (config.pluginSettings.OtherSetting.UseAlertDayNight) {
Configuration.PluginSettings.Rates.AllRates Rate = config.pluginSettings.RateSetting.NightRates;
foreach (BasePlayer player in BasePlayer.activePlayerList) SendChat(GetLang("NIGHT_RATES_ALERT", player.UserIDString, Rate.GatherRate, Rate.LootRate, Rate.PickUpRate, Rate.QuarryRate, Rate.ExcavatorRate, Rate.GrowableRate), player);
}
}
return;
}
if (config.pluginSettings.OtherSetting.UseAlertDayNight) {
Configuration.PluginSettings.Rates.AllRates Rate = config.pluginSettings.RateSetting.NightRates;
foreach (BasePlayer player in BasePlayer.activePlayerList) SendChat(GetLang("NIGHT_RATES_ALERT", player.UserIDString, Rate.GatherRate, Rate.LootRate, Rate.PickUpRate, Rate.QuarryRate, Rate.ExcavatorRate, Rate.GrowableRate), player);
}
}
void StartupFreeze() {
if (!config.pluginSettings.OtherSetting.UseFreezeTime) return;
timeComponent.ProgressTime = false;
ConVar.Env.time = config.pluginSettings.OtherSetting.FreezeTime;
}
private void OnServerInitialized() {
_ = this;
SpacePort = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("launch_site"));
StartEvent();
foreach (var RateCustom in config.pluginSettings.RateSetting.PrivilegyRates) Register(RateCustom.Key);
if (config.pluginSettings.RateSetting.UseSpeedBurnableList) foreach (var BurnableList in config.pluginSettings.RateSetting.SpeedBurableList) Register(BurnableList.Permissions);
List<String> PrivilegyCustomRatePermissions = config.pluginSettings.RateSetting.CustomRatesPermissions.NightRa
// ... [Code preview truncated due to length. Full source in attached file] ...