C#:
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Collections;
using UnityEngine;
using Oxide.Core.Plugins;
using System;
namespace Oxide.Plugins {
[Info("IQRates", "Mercury", "1.5.14")]
[Description("Настройка рейтинга на сервере")]
class IQRates : RustPlugin {
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 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();
}
);
}
}
/// <summary>
/// Обновление 1.5.13
/// - Исправлено когда пропадал аирдроп при вызове через шашку
/// - Исправлен вызов аирдропа на большом экскаваторе
/// - Исправлены печки после обновления игры
/// - Исправлено зацикленное сжигание дерева в печах при их переполнении
/// - Добавлена возможность детальной настройки рейтинга для карьера (установить рейтинг для определенного предмета во время добычи (по умолчанию берется общиий рейтинг карьера)
/// - Добавлено API на выдачу бонусного рейтинга для всех категорий - void API_BONUS_RATE_ADDPLAYER(BasePlayer player, Single Rate) - к рейтингу будет прибавлять бонус
[PluginReference]
Plugin IQChat;
private void OnEntitySpawned(BaseHelicopter entity) {
NextTick(() => {
if (entity.OwnerID != 0 || entity.skinID != 0) return;
var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.HelicopterSetting;
if ((EvenTimer.FullOff || EvenTimer.UseEventCustom)) entity.Kill();
}
);
}
private const string prefabPlane = "assets/prefabs/npc/cargo plane/cargo_plane.prefab";
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);
}
}
public Dictionary<BasePlayer, Single> BonusRates = new Dictionary<BasePlayer, Single>();
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);
}
}
bool IsBlackList(string Shortname) {
var BlackList = config.pluginSettings.RateSetting.BlackList;
if (BlackList.Contains(Shortname)) return true;
else return false;
}
private class OvenController : FacepunchBehaviour {
private static readonly Dictionary<BaseOven, OvenController> Controllers = new Dictionary<BaseOven, OvenController>();
private BaseOven _oven;
private float _speed;
private string _ownerId;
private Int32 _ticks;
private Int32 _speedFuel;
private bool IsFurnace => (int)_oven.temperature >= 2;
private void Awake() {
_oven = (BaseOven)gameObject.ToBaseEntity();
_ownerId = _oven.OwnerID.ToString();
}
public object Switch(BasePlayer player) {
if (!IsFurnace || _oven.needsBuildingPrivilegeToUse && !player.CanBuild()) return null;
if (_oven.IsOn()) StopCooking();
else {
_ownerId = _oven.OwnerID != 0 ? _oven.OwnerID.ToString() : player.UserIDString;
StartCooking();
}
return false;
}
public void TryRestart() {
if (!_oven.IsOn()) return;
_oven.CancelInvoke(_oven.Cook);
StopCooking();
StartCooking();
}
private void Kill() {
if (_oven.IsOn()) {
StopCooking();
_oven.StartCooking();
}
Destroy(this);
}
public static OvenController GetOrAdd(BaseOven oven) {
OvenController controller;
if (Controllers.TryGetValue(oven, out controller)) return controller;
controller = oven.gameObject.AddComponent<OvenController>();
Controllers[oven] = controller;
return controller;
}
public static void TryRestartAll() {
foreach (var pair in Controllers) {
pair.Value.TryRestart();
}
}
public static void KillAll() {
foreach (var pair in Controllers) {
pair.Value.Kill();
}
Controllers.Clear();
}
public void OnDestroy() {
Destroy(this);
}
private void StartCooking() {
if (_oven.FindBurnable() == null) return;
Single Multiplace = _.GetMultiplaceBurnableSpeed(_ownerId);
_speed = (Single)(0.1f / Multiplace);
// 0.5 * M
Int32 MultiplaceFuel = _.GetMultiplaceBurnableFuelSpeed(_ownerId);
_speedFuel = MultiplaceFuel;
StopCooking();
_oven.inventory.temperature = _oven.cookingTemperature;
_oven.UpdateAttachmentTemperature();
InvokeRepeating(Cook, _speed, _speed);
_oven.SetFlag(BaseEntity.Flags.On, true);
}
private void StopCooking() {
CancelInvoke(Cook);
_oven.StopCooking();
_oven.SetFlag(BaseEntity.Flags.On, false);
_oven.SendNetworkUpdate();
if (_oven.inventory != null) {
foreach (Item item in _oven.inventory.itemList) {
if (item.HasFlag(global : : Item.Flag.Cooking)) item.SetFlag(global : : Item.Flag.Cooking, false);
item.MarkDirty();
}
}
}
public void Cook() {
if (!_oven.HasFlag(BaseEntity.Flags.On)) {
StopCooking();
return;
}
Item item = _oven.FindBurnable();
if (item == null) {
StopCooking();
return;
}
_oven.Cook();
SmeltItems();
var component = item.info.GetComponent<ItemModBurnable>();
item.fuel -= 0.5f * (_oven.cookingTemperature / 200f) * _speedFuel;
if (!item.HasFlag(global : : Item.Flag.OnFire)) {
item.SetFlag(global : : Item.Flag.OnFire, true);
item.MarkDirty();
}
if (item.fuel <= 0f) {
_oven.ConsumeFuel(item, component);
}
_ticks++;
}
private void SmeltItems() {
if (_ticks % 1 != 0) return;
for (var i = 0; i < _oven.inventory.itemList.Count; i++) {
var item = _oven.inventory.itemList[i];
if (item == null || !item.IsValid() || item.info == null || _.IsBlackListBurnable(item.info.shortname)) continue;
var cookable = item.info.GetComponent<ItemModCookable>();
if (cookable == null) continue;
Single temperature = item.temperature;
if ((temperature < cookable.lowTemp || temperature > cookable.highTemp)) {
if (!cookable.setCookingFlag || !item.HasFlag(global : : Item.Flag.Cooking)) continue;
item.SetFlag(global : : Item.Flag.Cooking, false);
item.MarkDirty();
continue;
}
if (!cookable.CanBeCookedByAtTemperature(temperature)) {
if (!cookable.setCookingFlag || !item.HasFlag(global : : Item.Flag.Cooking)) continue;
item.SetFlag(global : : Item.Flag.Cooking, false);
item.MarkDirty();
continue;
}
if (cookable.cookTime > 0 && _ticks * 1f / 1 % cookable.cookTime > 0) continue;
if (cookable.setCookingFlag && !item.HasFlag(global : : Item.Flag.Cooking)) {
item.SetFlag(global : : Item.Flag.Cooking, true);
item.MarkDirty();
}
var position = item.position;
if (item.amount > 1) {
item.amount--;
item.MarkDirty();
}
else {
item.Remove();
}
if (cookable.becomeOnCooked == null) continue;
var item2 = ItemManager.Create(cookable.becomeOnCooked, (int)(cookable.amountOfBecome * 1f));
if (item2 == null || item2.MoveToContainer(item.parent, position) || item2.MoveToContainer(item.parent)) continue;
item2.Drop(item.parent.dropPosition, item.parent.dropVelocity);
//if (!item.parent.entityOwner) continue;
StopCooking();
}
}
}
void ReadData() => DataQuarryPlayer = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, UInt64>>("IQSystem/IQRates/Quarrys");
private const Boolean LanguageEn = false;
protected override void SaveConfig() => Config.WriteObject(config);
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);
}
private void OnEntitySpawned(BaseBoat boat) {
if (boat == null) return;
FuelSystemRating(boat.GetFuelSystem(), config.pluginSettings.OtherSetting.FuelSetting.AmountBoat);
}
int API_CONVERT(Types RateType, string Shortname, float Amount, BasePlayer player = null) => Converted(RateType, Shortname, Amount, player);
private Coroutine initializeTransport = null;
private const string prefabPatrol = "assets/prefabs/npc/patrol helicopter/patrolhelicopter.prefab";
private void OnEntitySpawned(RHIB boat) {
if (boat == null) return;
boat.fuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedBoat;
}
void OnLootEntity(BasePlayer player, BaseEntity entity) {
if (entity == null) return;
if(config.pluginSettings.RateSetting.UseBlackListPrefabs) if (config.pluginSettings.RateSetting.BlackListPrefabs.Contains(entity.ShortPrefabName)) return;
LootContainer container = entity as LootContainer;
if (entity.net == null) return;
UInt64 NetID = entity.net.ID;
if (LootersListCrateID.Contains(NetID)) return;
if (container == null) {
if (!(entity is NPCPlayerCorpse)) return;
NPCPlayerCorpse corpse = (NPCPlayerCorpse)entity;
foreach (ItemContainer corpseContainer in corpse.containers) {
foreach (Item item in corpseContainer.itemList) item.amount = Converted(Types.Loot, item.info.shortname, item.amount, player);
}
}
else {
foreach (Item item in container.inventory.itemList) item.amount = Converted(Types.Loot, item.info.shortname, item.amount, player);
}
LootersListCrateID.Add(NetID);
}
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();
}
);
}
}
void WriteData() => Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystem/IQRates/Quarrys", DataQuarryPlayer);
TOD_Time timeComponent = null;
private void OnEntitySpawned(CargoPlane entity) {
NextTick(() => {
if (entity.OwnerID != 0 || entity.skinID != 0) return;
var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.CargoPlaneSetting;
if ((EvenTimer.FullOff || EvenTimer.UseEventCustom)) entity.Kill();
}
);
}
private void Init() => ReadData();
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);
foreach (Configuration.PluginSettings.Rates.RecyclerController.PresetRecycler presetRecycler in config.pluginSettings.RateSetting.RecyclersController.PrivilageSpeedRecycler) Register(presetRecycler.Permissions);
if (config.pluginSettings.RateSetting.UseSpeedBurnableList) foreach (var BurnableList in config.pluginSettings.RateSetting.SpeedBurableList) Register(BurnableList.Permissions);
List<String> PrivilegyCustomRatePermissions = config.pluginSettings.RateSetting.CustomRatesPermissions.NightRates.Keys.Union(config.pluginSettings.RateSetting.CustomRatesPermissions.DayRates.Keys).ToList();
foreach (var RateItemCustom in PrivilegyCustomRatePermissions) Register(RateItemCustom);
timer.Once(5, GetTimeComponent);
if(config.pluginSettings.RateSetting.UseSpeedBurnable) foreach (BaseOven oven in BaseNetworkable.serverEntities.OfType<BaseOven>()) OvenController.GetOrAdd(oven).TryRestart();
if (!config.pluginSettings.RateSetting.UseSpeedBurnable) Unsubscribe(nameof(OnOvenToggle));
if(!config.pluginSettings.RateSetting.RecyclersController.UseRecyclerSpeed) Unsubscribe(nameof(OnRecyclerToggle));
initializeTransport = ServerMgr.Instance.StartCoroutine(InitializeTransport());
}
Boolean activatedDay;
public void Register(string Permissions) {
if (!String.IsNullOrWhiteSpace(Permissions)) if (!permission.PermissionExists(Permissions, this)) permission.RegisterPermission(Permissions, this);
}
private void OnEntitySpawned(BradleyAPC entity) {
NextTick(() => {
if (entity.OwnerID != 0 || entity.skinID != 0) return;
var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.BreadlaySetting;
if ((EvenTimer.FullOff || EvenTimer.UseEventCustom)) entity.Kill();
}
);
}
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();
}
);
}
}
bool IsTime() {
var Settings = config.pluginSettings.OtherSetting;
float TimeServer = TOD_Sky.Instance.Cycle.Hour;
return TimeServer < Settings.NightStart && Settings.DayStart <= TimeServer;
}
private IEnumerator InitializeTransport() {
foreach (BaseNetworkable entity in BaseNetworkable.serverEntities.Where(e => e is BaseVehicle)) {
if (entity is MotorRowboat) OnEntitySpawned((MotorRowboat)entity);
if(entity is Snowmobile) OnEntitySpawned((Snowmobile)entity);
if(entity is HotAirBalloon) OnEntitySpawned((HotAirBalloon)entity);
if(entity is RHIB) OnEntitySpawned((RHIB)entity);
if(entity is BaseSubmarine) OnEntitySpawned((BaseSubmarine)entity);
if(entity is MiniCopter) OnEntitySpawned((MiniCopter)entity);
if(entity is ScrapTransportHelicopter) OnEntitySpawned((ScrapTransportHelicopter)entity);
yield return CoroutineEx.waitForSeconds(0.03f);
}
}
private new void LoadDefaultMessages() {
lang.RegisterMessages(new Dictionary<string, string> {
["MY_RATES_INFO"]
= "Your resource rating at the moment :" + "\n- Rating of extracted resources: <color=#FAF0F5>x{0}</color>" + "\n- Rating of found items: <color=#FAF0F5>х{1}</color>" + "\n- Rating of raised items: <color=#FAF0F5>х{2}</color>" + "\n- Career rankings: <color=#FAF0F5>x{3}</color>" + "\n- Excavator Rating: <color=#FAF0F5>x{4}</color>" + "\n- Rating of growable : <color=#FAF0F5>x{5}</color>", ["DAY_RATES_ALERT"] = "The day has come!" + "\nThe global rating on the server has been changed :" + "\n- Rating of extracted resources: <color=#FAF0F5>x{0}</color>" + "\n- Rating of found items: <color=#FAF0F5>х{1}</color>" + "\n- Rating of raised items: <color=#FAF0F5>х{2}</color>" + "\n- Career rankings: <color=#FAF0F5>x{3}</color>" + "\n- Excavator Rating: <color=#FAF0F5>x{4}</color>" + "\n- Rating of growable : <color=#FAF0F5>x{5}</color>", ["NIGHT_RATES_ALERT"] = "Night came!" + "\nThe global rating on the server has been changed :" + "\n- Rating of extracted resources: <color=#FAF0F5>x{0}</color>" + "\n- Rating of found items: <color=#FAF0F5>х{1}</color>" + "\n- Rating of raised items: <color=#FAF0F5>х{2}</color>" + "\n- Career rankings: <color=#FAF0F5>x{3}</color>" + "\n- Excavator Rating: <color=#FAF0F5>x{4}</color>" + "\n- Rating of growable : <color=#FAF0F5>x{5}</color>",
}
, this);
lang.RegisterMessages(new Dictionary<string, string> {
["MY_RATES_INFO"]
= "Ваш рейтинг ресурсов на данный момент :" + "\n- Рейтинг добываемых ресурсов: <color=#FAF0F5>x{0}</color>" + "\n- Рейтинг найденных предметов: <color=#FAF0F5>х{1}</color>" + "\n- Рейтинг поднимаемых предметов: <color=#FAF0F5>х{2}</color>" + "\n- Рейтинг карьеров: <color=#FAF0F5>x{3}</color>" + "\n- Рейтинг экскаватора: <color=#FAF0F5>x{4}</color>" + "\n- Рейтинг грядок : <color=#FAF0F5>x{5}</color>", ["DAY_RATES_ALERT"] = "Наступил день!" + "\nГлобальный рейтинг на сервере был изменен :" + "\n- Рейтинг добываемых ресурсов: <color=#FAF0F5>x{0}</color>" + "\n- Рейтинг найденных предметов: <color=#FAF0F5>х{1}</color>" + "\n- Рейтинг поднимаемых предметов: <color=#FAF0F5>х{2}</color>" + "\n- Рейтинг карьеров: <color=#FAF0F5>x{3}</color>" + "\n- Рейтинг экскаватора: <color=#FAF0F5>x{4}</color>" + "\n- Рейтинг грядок : <color=#FAF0F5>x{5}</color>", ["NIGHT_RATES_ALERT"] = "Наступила ночь!" + "\nГлобальный рейтинг на сервере был изменен :" + "\n- Рейтинг добываемых ресурсов: <color=#FAF0F5>x{0}</color>" + "\n- Рейтинг найденных предметов: <color=#FAF0F5>х{1}</color>" + "\n- Рейтинг поднимаемых предметов: <color=#FAF0F5>х{2}</color>" + "\n- Рейтинг карьеров: <color=#FAF0F5>x{3}</color>" + "\n- Рейтинг экскаватора: <color=#FAF0F5>x{4}</color>" + "\n- Рейтинг грядок : <color=#FAF0F5>x{5}</color>",
}
, this, "ru");
}
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;
}
}
private BasePlayer ExcavatorPlayer = null;
private void Unload() {
OvenController.KillAll();
if (timeComponent == null) return;
timeComponent.OnSunrise -= OnSunrise;
timeComponent.OnSunset -= OnSunset;
timeComponent.OnHour -= OnHour;
if (initializeTransport != null) {
ServerMgr.Instance.StopCoroutine(initializeTransport);
initializeTransport = null;
}
}
enum Types {
Gather, Loot, PickUP, Quarry, Excavator, Growable,
}
private void GetTimeComponent() {
timeComponent = TOD_Sky.Instance.Components.Time;
if (timeComponent == null) return;
SetTimeComponent();
StartupFreeze();
}
public List<UInt64> LootersListCrateID = new List<UInt64>();
bool IsPermission(string userID, string Permission) {
if (permission.UserHasPermission(userID, Permission)) return true;
else return false;
}
public Dictionary<UInt64, UInt64> DataQuarryPlayer = new Dictionary<UInt64, UInt64>();
void StartEvent() {
var EventSettings = config.pluginSettings.OtherSetting.EventSetting;
StartCargoShip(EventSettings);
StartCargoPlane(EventSettings);
StartBreadley(EventSettings);
StartChinoock(EventSettings);
StartHelicopter(EventSettings);
}
private void OnEntitySpawned(TrainCar trainCar) {
if (trainCar == null) return;
StorageContainer fuelContainer = trainCar.GetFuelSystem()?.GetFuelContainer();
if (fuelContainer == null) return;
TrainEngine trainEngine = fuelContainer.GetComponent<TrainEngine>();
trainEngine.maxFuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedTrain;
}
private Int32 GetRandomTime(Int32 Min, Int32 Max) => UnityEngine.Random.Range(Min, Max);
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;
}
void OnCollectiblePickup(CollectibleEntity collectible, BasePlayer player) {
foreach(ItemAmount item in collectible.itemList) item.amount = Converted(Types.PickUP, item.itemDef.shortname, (Int32)item.amount, player);
}
bool IsBlackListBurnable(string Shortname) {
var BlackList = config.pluginSettings.RateSetting.BlackListBurnable;
if (BlackList.Contains(Shortname)) return true;
else return false;
}
void StartupFreeze() {
if (!config.pluginSettings.OtherSetting.UseFreezeTime) return;
timeComponent.ProgressTime = false;
ConVar.Env.time = config.pluginSettings.OtherSetting.FreezeTime;
}
Single GetBonusRate(BasePlayer player) {
Single Bonus = 0;
if (player == null) return Bonus;
if (BonusRates.ContainsKey(player)) Bonus = BonusRates[player];
return Bonus;
}
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);
}
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);
}
private void OnEntitySpawned(CH47Helicopter entity) {
NextTick(() => {
if (entity.OwnerID != 0 || entity.skinID != 0) return;
timer.Once(3f, () => {
var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.ChinoockSetting;
if ((EvenTimer.FullOff || EvenTimer.UseEventCustom) && entity.mountPoints.Where(x => x.mountable.GetMounted() != null && x.mountable.GetMounted().ShortPrefabName.Contains("scientistnpc_heavy")).Count() <= 0) timer.Once(1f, () => {
entity.Kill();
}
);
}
);
}
);
}
int Converted(Types RateType, string Shortname, float Amount, BasePlayer player = null, String UserID = null) {
float ConvertedAmount = Amount;
if (IsBlackList(Shortname)) return Convert.ToInt32(ConvertedAmount);
var PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
Boolean IsTimes = IsTime();
Configuration.PluginSettings.Rates.AllRates Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
UserID = player != null ? player.UserIDString : UserID;
if (UserID != null) {
var CustomRate = IsTimes ? config.pluginSettings.RateSetting.CustomRatesPermissions.DayRates : config.pluginSettings.RateSetting.CustomRatesPermissions.NightRates;
var Rate = CustomRate.FirstOrDefault(x => IsPermission(UserID, 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(UserID, RatesSetting.Key)) Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
}
Single BonusRate = GetBonusRate(player);
switch (RateType) {
case Types.Gather : {
ConvertedAmount = Amount * (Rates.GatherRate + BonusRate);
break;
}
case Types.Loot : {
ConvertedAmount = Amount * (Rates.LootRate + BonusRate);
break;
}
case Types.PickUP : {
ConvertedAmount = Amount * (Rates.PickUpRate + BonusRate);
break;
}
case Types.Growable : {
ConvertedAmount = Amount * (Rates.GrowableRate + BonusRate);
break;
}
case Types.Quarry : {
Single QuarryRates = GetRateQuarryDetalis(Rates, Shortname);
ConvertedAmount = Amount * (QuarryRates + BonusRate);
//Rates.QuarryRate;
break;
}
case Types.Excavator : {
ConvertedAmount = Amount * (Rates.ExcavatorRate + BonusRate);
break;
}
}
return Convert.ToInt32(ConvertedAmount);
}
private static Configuration config = new Configuration();
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;
}
);
}
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();
}
private Single GetSpeedRecycler(BasePlayer player) {
Configuration.PluginSettings.Rates.RecyclerController Recycler = config.pluginSettings.RateSetting.RecyclersController;
foreach (Configuration.PluginSettings.Rates.RecyclerController.PresetRecycler presetRecycler in Recycler.PrivilageSpeedRecycler) {
if (permission.UserHasPermission(player.UserIDString, presetRecycler.Permissions)) return presetRecycler.SpeedRecyclers;
}
return Recycler.DefaultSpeedRecycler;
}
private void OnEntitySpawned(MiniCopter copter) {
if (copter == null) return;
FuelSystemRating(copter.GetFuelSystem(), config.pluginSettings.OtherSetting.FuelSetting.AmountMinicopter);
copter.fuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedCopter;
}
UInt64? GetQuarryPlayer(UInt64 NetID) {
if (!DataQuarryPlayer.ContainsKey(NetID)) return null;
if (DataQuarryPlayer[NetID] == 0) return null;
return DataQuarryPlayer[NetID];
}
private void OnEntitySpawned(Snowmobile snowmobiles) {
if (snowmobiles == null) return;
snowmobiles.maxFuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedSnowmobile;
}
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;
}
private MonumentInfo SpacePort;
public Single GetMultiplaceBurnableSpeed(String ownerid) {
Single Multiplace = config.pluginSettings.RateSetting.SpeedBurnable;
if (config.pluginSettings.RateSetting.UseSpeedBurnableList) {
var SpeedInList = config.pluginSettings.RateSetting.SpeedBurableList.OrderByDescending(z => z.SpeedBurnable).FirstOrDefault(x => permission.UserHasPermission(ownerid, x.Permissions));
if (SpeedInList != null) Multiplace = SpeedInList.SpeedBurnable;
}
return Multiplace;
}
private void OnRecyclerToggle(Recycler recycler, BasePlayer player) {
if (!recycler.IsOn()) {
NextTick(() => {
if (!recycler.IsOn()) return;
Single Speed = GetSpeedRecycler(player);
recycler.InvokeRepeating(recycler.RecycleThink, Speed, Speed);
}
);
}
}
public string GetLang(string LangKey, string userID = null, params object[] args) {
sb.Clear();
if (args != null) {
sb.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
return sb.ToString();
}
return lang.GetMessage(LangKey, this, userID);
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
if (config.pluginSettings.RateSetting.RecyclersController.DefaultSpeedRecycler == 0f) config.pluginSettings.RateSetting.RecyclersController.DefaultSpeedRecycler = 5f;
if (config.pluginSettings.RateSetting.BlackListPrefabs == null || config.pluginSettings.RateSetting.BlackListPrefabs.Count == 0) config.pluginSettings.RateSetting.BlackListPrefabs = new List<String>() {
"crate_elite", "crate_normal"
}
;
if (config.pluginSettings.RateSetting.RecyclersController.PrivilageSpeedRecycler == null || config.pluginSettings.RateSetting.RecyclersController.PrivilageSpeedRecycler.Count == 0) {
config.pluginSettings.RateSetting.RecyclersController.PrivilageSpeedRecycler = new List<Configuration.PluginSettings.Rates.RecyclerController.PresetRecycler>() {
new Configuration.PluginSettings.Rates.RecyclerController.PresetRecycler() {
Permissions = "iqrates.recyclerhyperfast", SpeedRecyclers = 0
}
, new Configuration.PluginSettings.Rates.RecyclerController.PresetRecycler() {
Permissions = "iqrates.recyclerfast", SpeedRecyclers = 3
}
,
}
;
}
if (config.pluginSettings.RateSetting.DayRates.QuarryDetalis.ShortnameListQuarry.Count == 0) config.pluginSettings.RateSetting.DayRates.QuarryDetalis = new Configuration.PluginSettings.Rates.AllRates.QuarryRateDetalis() {
UseDetalisRateQuarry = false, ShortnameListQuarry = new Dictionary<String, Single>() {
["metal.ore"]
= 10, ["sulfur.ore"] = 5
}
}
;
if (config.pluginSettings.RateSetting.NightRates.QuarryDetalis.ShortnameListQuarry.Count == 0) config.pluginSettings.RateSetting.NightRates.QuarryDetalis = new Configuration.PluginSettings.Rates.AllRates.QuarryRateDetalis() {
UseDetalisRateQuarry = false, ShortnameListQuarry = new Dictionary<String, Single>() {
["metal.ore"]
= 10, ["sulfur.ore"] = 5
}
}
;
}
catch {
PrintWarning(LanguageEn ? "Error #343443343" + $"read configuration 'oxide/config/{Name}', create a new configuration!!" : "Ошибка #34344343" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
//#333
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
public Int32 GetMultiplaceBurnableFuelSpeed(String ownerid) {
Int32 Multiplace = config.pluginSettings.RateSetting.SpeedFuelBurnable;
if (config.pluginSettings.RateSetting.UseSpeedBurnableList) {
var SpeedInList = config.pluginSettings.RateSetting.SpeedBurableList.OrderByDescending(z => z.SpeedFuelBurnable).FirstOrDefault(x => permission.UserHasPermission(ownerid, x.Permissions));
if (SpeedInList != null) Multiplace = SpeedInList.SpeedFuelBurnable;
}
return Multiplace;
}
void AddQuarryPlayer(UInt64 NetID, UInt64 userID) {
if (DataQuarryPlayer.ContainsKey(NetID)) DataQuarryPlayer[NetID] = userID;
else DataQuarryPlayer.Add(NetID, userID);
WriteData();
}
public enum SkipType {
Day, Night
}
private const string prefabCH47 = "assets/prefabs/npc/ch47/ch47scientists.entity.prefab";
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 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();
}
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 API_BONUS_RATE_ADDPLAYER(BasePlayer player, Single Rate) {
if (player == null) return;
if (!BonusRates.ContainsKey(player)) BonusRates.Add(player, Rate);
else BonusRates[player] = Rate;
}
private void UnSubProSub(int time = 1) {
Unsubscribe("OnEntitySpawned");
timer.Once(time, () => {
Subscribe("OnEntitySpawned");
}
);
}
void OnQuarryGather(MiningQuarry quarry, Item item) {
if (item == null || quarry == null) return;
// PrintError(GetQuarryPlayer(quarry.net.ID).ToString() + " " + Converted(Types.Quarry, item.info.shortname,
// item.amount, null, GetQuarryPlayer(quarry.OwnerID).ToString()).ToString());
item.amount = Converted(Types.Quarry, item.info.shortname, item.amount, null, GetQuarryPlayer(quarry.net.ID).ToString());
}
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();
}
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;
}
void OnQuarryToggled(MiningQuarry quarry, BasePlayer player) {
AddQuarryPlayer(quarry.net.ID, player.userID);
}
void API_BONUS_RATE_ADDPLAYER(UInt64 userID, Single Rate) {
BasePlayer player = BasePlayer.FindByID(userID);
API_BONUS_RATE_ADDPLAYER(player, Rate);
}
private void OnEntitySpawned(ScrapTransportHelicopter helicopter) {
if (helicopter == null) return;
FuelSystemRating(helicopter.GetFuelSystem(), config.pluginSettings.OtherSetting.FuelSetting.AmountScrapTransport);
helicopter.fuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedScrapTransport;
}
void OnAirdrop(CargoPlane plane, Vector3 dropPosition) => plane.OwnerID = 999999999999;
private void OnEntitySpawned(CargoShip entity) {
NextTick(() => {
if (entity.OwnerID != 0 || entity.skinID != 0) return;
var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.CargoShipSetting;
if ((EvenTimer.FullOff || EvenTimer.UseEventCustom)) entity.Kill();
}
);
}
public static IQRates _;
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
private class Configuration {
internal class PluginSettings {
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();
[JsonProperty(LanguageEn ? "Fuel Consumption Rating Settings" : "Настройки рейтинга потребления топлива")]
public FuelConsumedTransport FuelConsumedTransportSetting = new FuelConsumedTransport();
internal class FuelConsumedTransport {
[JsonProperty(LanguageEn ? "Hotairballoon fuel consumption rating (Default = 0.25)" : "Рейтинг потребление топлива у воздушного шара (Стандартно = 0.25)")]
public Single ConsumedHotAirBalloon= 0.25f;
[JsonProperty(LanguageEn ? "Snowmobile fuel consumption rating (Default = 0.15)" : "Рейтинг потребление топлива снегоходов (Стандартно = 0.15)")]
public Single ConsumedSnowmobile = 0.15f;
[JsonProperty(LanguageEn ? "Train fuel consumption rating (Default = 0.15)" : "Рейтинг потребление топлива поездов (Стандартно = 0.15)")]
public Single ConsumedTrain = 0.15f;
[JsonProperty(LanguageEn ? "Rowboat fuel consumption rating (Default = 0.25)" : "Рейтинг потребление топлива у лодок (Стандартно = 0.25)")]
public Single ConsumedBoat = 0.25f;
[JsonProperty(LanguageEn ? "Submarine fuel consumption rating (Default = 0.15)" : "Рейтинг потребление топлива у субмарин (Стандартно = 0.15)")]
public Single ConsumedSubmarine = 0.15f;
[JsonProperty(LanguageEn ? "Minicopter fuel consumption rating (Default = 0.25)" : "Рейтинг потребление топлива у миникоптера (Стандартно = 0.25)")]
public Single ConsumedCopter = 0.25f;
[JsonProperty(LanguageEn ? "ScrapTransportHelicopter fuel consumption rating (Default = 0.25)" : "Рейтинг потребление топлива у коровы (Стандартно = 0.25)")]
public Single ConsumedScrapTransport = 0.25f;
}
internal class FuelSettings {
[JsonProperty(LanguageEn ? "Amount of fuel for boats" : "Кол-во топлива у лодок")]
pub
// ... [Code preview truncated due to length. Full source in attached file] ...