C#:
using Facepunch;
using System;
using System.IO;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Oxide.Plugins.ArmoredTrainExtensionMethods;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Networking;
using Time = UnityEngine.Time;
using static TrainEngine;
using static ProtoBuf.PatternFirework;
using static BaseCombatEntity;
using Random = UnityEngine.Random;
namespace Oxide.Plugins {
[Info("ArmoredTrain", "Adem", "1.9.7")]
public class ArmoredTrain : RustPlugin {
#region Variables
private const bool En = false;
private static ArmoredTrain _ins;
private EventController _eventController;
private ProtectionProperties _protection;
[PluginReference]
private Plugin NpcSpawn, PveMode, GUIAnnouncements, Notify, DiscordMessages, DynamicPVP, Economics, ServerRewards, IQEconomic, TrainHomes, AlphaLoot, CustomLoot, Loottable;
private readonly HashSet<string> _subscribeMethods = new HashSet<string> {
"OnEntitySpawned", "OnEntityTakeDamage", "OnEntityDeath", "OnEntityEnter", "CanHelicopterTarget", "OnCustomNpcTarget", "CanBradleyApcTarget", "OnTrainCarUncouple", "CanTrainCarCouple", "CanPickupEntity", "CanMountEntity", "OnSwitchToggle", "OnSwitchToggled", "OnCounterModeToggle", "OnCounterTargetChange", "OnPlayerSleep", "CanLootEntity", "OnSamSiteModeToggle", "OnTurretAuthorize", "CanHackCrate", "OnLootEntity", "OnLootEntityEnd", "OnCorpsePopulate", "OnCrateSpawned", "OnContainerPopulate", "CanPopulateLoot", "OnCustomLootContainer", "OnCustomLootNPC", "CanEntityBeTargeted", "CanEntityTakeDamage", "OnCreateDynamicPVP", "SetOwnerPveMode", "ClearOwnerPveMode", "CanBradleySpawnNpc", "CanHelicopterSpawnNpc"
}
;
private EventHeli _eventHeli;
#endregion Variablesa
#region ExternalAPI
private bool IsArmoredTrainActive() {
return EventLauncher.IsEventActive();
}
private bool StopArmoredTrain() {
if (!EventLauncher.IsEventActive()) return false;
//eventController.StopMoving();
return true;
}
private bool StartArmoredTrainEvent() {
if (EventLauncher.IsEventActive()) return false;
EventLauncher.DelayStartEvent();
return true;
}
private bool EndArmoredTrainEvent() {
if (EventLauncher.IsEventActive()) return false;
EventLauncher.StopEvent();
return true;
}
private Vector3 ArmoredTrainLocomotivePosition() {
if (!EventLauncher.IsEventActive()) return Vector3.zero;
return _eventController.GetEventPosition();
}
private bool IsTrainBradley(ulong netID) {
return EventLauncher.IsEventActive() && _eventController.IsTrainBradley(netID);
}
private bool IsTrainHeli(ulong netID) {
if (!EventLauncher.IsEventActive()) return false;
return EventHeli.GetEventHeliByNetId(netID) != null;
}
private bool IsTrainCrate(ulong netID) {
return _eventController != null && _eventController.IsEventCrate(netID);
}
private bool IsTrainSamSite(ulong netID) {
return EventLauncher.IsEventActive() && _eventController.IsTrainSamSite(netID);
}
private bool IsTrainWagon(ulong netID) {
return EventLauncher.IsEventActive() && _eventController.IsTrainWagon(netID);
}
private bool IsTrainTurret(ulong netID) {
return EventLauncher.IsEventActive() && _eventController.IsTrainTurret(netID);
}
#endregion ExternalAPI
#region Hooks
private void Init() {
Unsubscribes();
}
private void OnServerInitialized() {
_ins = this;
if (!NpcSpawnManager.IsNpcSpawnReady()) return;
LoadDefaultMessages();
UpdateConfig();
PrefabController.CachePrefabs();
GuiManager.LoadImages();
WagonCustomizer.LoadCurrentCustomizationProfile();
EventLauncher.AutoStartEvent();
_protection = ScriptableObject.CreateInstance<ProtectionProperties>();
_protection.Add(1);
}
private void Unload() {
EventLauncher.StopEvent(true);
_ins = null;
}
private void OnEntitySpawned(HelicopterDebris entity) {
if (!entity.IsExists() || entity.ShortPrefabName != "servergibs_bradley") return;
if (Vector3.Distance(_eventController.GetEventPosition(), entity.transform.position) < _eventController.EventConfig.ZoneRadius) entity.Kill();
}
private object OnEntityTakeDamage(TrainCar trainCar, HitInfo info) {
if (trainCar == null || trainCar.net == null || info == null) return null;
if (_eventController.IsTrainWagon(trainCar.net.ID.Value)) {
if (info.InitiatorPlayer.IsRealPlayer()) _eventController.OnTrainAttacked(info.InitiatorPlayer);
return true;
}
return null;
}
private object OnEntityTakeDamage(PatrolHelicopter patrolHelicopter, HitInfo info) {
if (patrolHelicopter == null || patrolHelicopter.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return null;
EventHeli eventHeli = EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value);
if (eventHeli == null) return null;
if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, patrolHelicopter, true)) return true;
eventHeli.OnHeliAttacked(info.InitiatorPlayer.userID);
_eventController.OnTrainAttacked(info.InitiatorPlayer);
return null;
}
private object OnEntityTakeDamage(BradleyAPC bradley, HitInfo info) {
if (bradley == null || bradley.net == null || info == null) return null;
if (!_eventController.IsTrainBradley(bradley.net.ID.Value)) return null;
if (!info.InitiatorPlayer.IsRealPlayer()) return true;
if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, bradley, true)) return true;
_eventController.OnTrainAttacked(info.InitiatorPlayer);
return null;
}
private object OnEntityTakeDamage(AutoTurret autoTurret, HitInfo info) {
if (autoTurret == null || autoTurret.net == null || info == null) return null;
if (!_eventController.IsTrainTurret(autoTurret.net.ID.Value)) return null;
if (!info.InitiatorPlayer.IsRealPlayer()) return true;
if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, autoTurret, true)) return true;
_eventController.OnTrainAttacked(info.InitiatorPlayer);
return null;
}
private object OnEntityTakeDamage(SamSite samSite, HitInfo info) {
if (samSite == null || samSite.net == null || info == null) return null;
if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
if (!info.InitiatorPlayer.IsRealPlayer()) return true;
if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return true;
_eventController.OnTrainAttacked(info.InitiatorPlayer);
return null;
}
private object OnEntityTakeDamage(ElectricSwitch electricSwitch, HitInfo info) {
if (electricSwitch == null || electricSwitch.net == null || info == null) return null;
if (_eventController.IsTrainSwitch(electricSwitch.net.ID.Value)) return true;
return null;
}
private object OnEntityTakeDamage(PowerCounter powerCounter, HitInfo info) {
if (powerCounter == null || powerCounter.net == null || info == null) return null;
if (_eventController.IsTrainCounter(powerCounter.net.ID.Value)) return true;
return null;
}
private object OnEntityTakeDamage(BasePlayer player, HitInfo info) {
ScientistNPC scientistNpc = player as ScientistNPC;
if (scientistNpc != null) {
if (scientistNpc == null || scientistNpc.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return null;
if (NpcSpawnManager.GetScientistByNetId(scientistNpc.net.ID.Value) == null) return null;
if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, scientistNpc, true)) {
info.damageTypes.ScaleAll(0);
_eventController.OnTrainAttacked(info.InitiatorPlayer);
return true;
}
if (scientistNpc.isMounted) {
if (!EventController.IsPlayerCanStopTrain(info.InitiatorPlayer, true)) {
info.damageTypes.ScaleAll(0);
return true;
}
if (_config.MainConfig.AllowDriverDamage) {
info.damageTypes.ScaleAll(10);
}
else {
info.damageTypes.ScaleAll(0);
return true;
}
}
_eventController.OnTrainAttacked(info.InitiatorPlayer);
}
else {
if (!player.IsRealPlayer() || !player.IsSleeping() || info == null || info.InitiatorPlayer == null) return null;
if (!info.InitiatorPlayer.isMounted || info.InitiatorPlayer.userID.IsSteamId() || info.InitiatorPlayer.net == null) return null;
if (NpcSpawnManager.GetScientistByNetId(info.InitiatorPlayer.net.ID.Value)) return true;
}
return null;
}
private void OnEntityDeath(PatrolHelicopter patrolHelicopter, HitInfo info) {
if (patrolHelicopter == null || patrolHelicopter.net == null) return;
EventHeli eventHeli = EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value);
if (eventHeli != null && eventHeli.lastAttackedPlayer != 0) EconomyManager.AddBalance(eventHeli.lastAttackedPlayer, _config.SupportedPluginsConfig.EconomicsConfig.HeliPoint);
}
private void OnEntityDeath(AutoTurret autoTurret, HitInfo info) {
if (autoTurret == null || autoTurret.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
if (_eventController.IsTrainTurret(autoTurret.net.ID.Value)) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.SupportedPluginsConfig.EconomicsConfig.TurretPoint);
}
private void OnEntityDeath(BradleyAPC bradleyApc, HitInfo info) {
if (bradleyApc == null || bradleyApc.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
if (_eventController.IsTrainBradley(bradleyApc.net.ID.Value)) EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.SupportedPluginsConfig.EconomicsConfig.BradleyPoint);
}
private void OnEntityDeath(ScientistNPC scientistNpc, HitInfo info) {
if (scientistNpc == null || scientistNpc.net == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
if (NpcSpawnManager.GetScientistByNetId(scientistNpc.net.ID.Value) != null) {
if (scientistNpc.isMounted) _eventController.OnDriverKilled(info.InitiatorPlayer);
EconomyManager.AddBalance(info.InitiatorPlayer.userID, _config.SupportedPluginsConfig.EconomicsConfig.NpcPoint);
}
}
private object OnEntityEnter(TriggerTrainCollisions trigger, TrainCar trainCar) {
if (!_ins._config.MainConfig.DestroyWagons || trigger == null || !trigger.owner.IsExists() || trigger.owner.net == null || !trainCar.IsExists() || trainCar.net == null) return null;
if (!_eventController.IsTrainWagon(trainCar.net.ID.Value) || _eventController.IsTrainWagon(trigger.owner.net.ID.Value)) return null;
if (trainCar is TrainEngine) {
if (_eventController.IsReverse()) return null;
}
else if (!_eventController.IsReverse()) {
return null;
}
if (!trigger.owner.IsExists() || !_ins._config.MainConfig.DestroyWagons) return null;
if (_ins.plugins.Exists("TrainHomes") && (bool)TrainHomes.Call("IsTrainHomes", trigger.owner.net.ID.Value) && !(bool)TrainHomes.Call("IsFreeWagon", trigger.owner.net.ID.Value)) return null;
_ins.NextTick(() => trigger.owner.Kill(BaseNetworkable.DestroyMode.Gib));
return null;
}
private object CanHelicopterTarget(PatrolHelicopterAI heli, BasePlayer player) {
if (heli == null || heli.helicopterBase == null || heli.helicopterBase.net == null) return null;
EventHeli eventHeli = EventHeli.GetEventHeliByNetId(heli.helicopterBase.net.ID.Value);
if (eventHeli != null && !eventHeli.IsHeliCanTarget()) return false;
if (player.IsSleeping() || (player.InSafeZone() && !player.IsHostile())) return false;
return null;
}
private object OnCustomNpcTarget(ScientistNPC scientistNpc, BasePlayer player) {
if (_eventController == null || scientistNpc == null || scientistNpc.net == null) return null;
if (NpcSpawnManager.GetScientistByNetId(scientistNpc.net.ID.Value) == null) return null;
if (!_eventController.IsAggressive()) return false;
if (player.IsSleeping() || (player.InSafeZone() && !player.IsHostile())) return false;
return null;
}
private object CanBradleyApcTarget(BradleyAPC bradley, BaseEntity entity) {
if (bradley == null || bradley.net == null) return null;
if (!_eventController.IsTrainBradley(bradley.net.ID.Value)) return null;
BasePlayer targetPlayer = entity as BasePlayer;
if (!targetPlayer.IsRealPlayer()) return false;
if (targetPlayer.IsSleeping() || (targetPlayer.InSafeZone() && !targetPlayer.IsHostile())) return false;
return null;
}
private object OnTrainCarUncouple(TrainCar trainCar, BasePlayer player) {
if (trainCar == null || player == null || trainCar.net == null) return null;
if (_eventController.IsTrainWagon(trainCar.net.ID.Value)) return true;
return null;
}
private object CanTrainCarCouple(TrainCar trainCar1, TrainCar trainCar2) {
if (trainCar1 == null || trainCar1.net == null || trainCar2 == null || trainCar2.net == null) return null;
if (_eventController.IsTrainWagon(trainCar1.net.ID.Value) && !_eventController.CanConnectToTrainWagon(trainCar1)) return false;
if (_eventController.IsTrainWagon(trainCar2.net.ID.Value) && !_eventController.CanConnectToTrainWagon(trainCar2)) return false;
return null;
}
private object CanPickupEntity(BasePlayer player, ElectricSwitch electricSwitch) {
if (player == null || electricSwitch == null || electricSwitch.net == null) return null;
if (_eventController.IsTrainSwitch(electricSwitch.net.ID.Value)) return false;
return null;
}
private object CanPickupEntity(BasePlayer player, PowerCounter powerCounter) {
if (player == null || powerCounter == null || powerCounter.net == null) return null;
if (_eventController.IsTrainCounter(powerCounter.net.ID.Value)) return false;
return null;
}
private object CanMountEntity(BasePlayer player, BaseVehicleSeat entity) {
if (!player.IsRealPlayer() || !entity.IsExists()) return null;
TrainCar trainCar = entity.VehicleParent() as TrainCar;
if (!trainCar.IsExists() || trainCar.net == null) return null;
if (_eventController.IsTrainWagon(trainCar.net.ID.Value)) return true;
return null;
}
private object OnSwitchToggle(ElectricSwitch electricSwitch, BasePlayer player) {
if (!electricSwitch.IsExists() || electricSwitch.net == null || player == null) return null;
if (!_eventController.IsTrainSwitch(electricSwitch.net.ID.Value)) return null;
if (!electricSwitch.IsOn() && (!_ins._config.MainConfig.AllowEnableMovingByHandbrake || !_eventController.IsDriverAlive())) return true;
if (electricSwitch.IsOn() && !EventController.IsPlayerCanStopTrain(player, true)) return true;
return null;
}
private void OnSwitchToggled(ElectricSwitch electricSwitch, BasePlayer player) {
if (!electricSwitch.IsExists() || electricSwitch.net == null || player == null) return;
if (!_eventController.IsTrainSwitch(electricSwitch.net.ID.Value)) return;
_eventController.OnSwitchToggled(player);
}
private object OnCounterModeToggle(PowerCounter counter, BasePlayer player, bool mode) {
if (!counter.IsExists() || counter.net == null || player == null) return null;
if (_eventController.IsTrainCounter(counter.net.ID.Value)) return true;
return null;
}
private object OnCounterTargetChange(PowerCounter counter, BasePlayer player, int targetNumber) {
if (!counter.IsExists() || counter.net == null || player == null) return null;
if (_eventController.IsTrainCounter(counter.net.ID.Value)) return true;
return null;
}
private void OnPlayerSleep(BasePlayer player) {
if (player == null) return;
ZoneController.OnPlayerLeaveZone(player);
}
private object CanLootEntity(BasePlayer player, LootContainer container) {
if (player == null || container == null || container.net == null) return null;
if (!_eventController.IsEventCrate(container.net.ID.Value)) return null;
if (!_eventController.IsAggressive()) {
_eventController.MakeAggressive();
return true;
}
if (!_eventController.IsPlayerCanLoot(player, true)) return true;
return null;
}
private object CanLootEntity(BasePlayer player, SamSite samSite) {
if (player == null || samSite == null || samSite.net == null) return null;
if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
if (!_eventController.IsAggressive()) _eventController.MakeAggressive();
return true;
}
private object OnSamSiteModeToggle(SamSite samSite, BasePlayer player, bool isEnable) {
if (player == null || samSite == null || samSite.net == null) return null;
if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
if (!_eventController.IsAggressive()) _eventController.MakeAggressive();
return true;
}
private object OnTurretAuthorize(AutoTurret autoTurret, BasePlayer player) {
if (player == null || autoTurret == null || autoTurret.net == null) return null;
if (!_eventController.IsTrainTurret(autoTurret.net.ID.Value)) return null;
if (!_eventController.IsAggressive()) _eventController.MakeAggressive();
return true;
}
private object CanHackCrate(BasePlayer player, HackableLockedCrate crate) {
if (player == null || crate == null || crate.net == null) return null;
if (!_eventController.IsEventCrate(crate.net.ID.Value)) return null;
if (!_eventController.IsAggressive()) {
_eventController.MakeAggressive();
return true;
}
if (!_eventController.IsPlayerCanLoot(player, true)) return true;
if (!PveModeManager.IsPveModeBlockAction(player)) EconomyManager.AddBalance(player.userID, _config.SupportedPluginsConfig.EconomicsConfig.HackCratePoint);
_eventController.OnPlayerStartHackingCrate((int)(HackableLockedCrate.requiredHackSeconds - crate.hackSeconds));
return null;
}
private void OnLootEntity(BasePlayer player, StorageContainer storageContainer) {
if (player == null || storageContainer == null || storageContainer.net == null) return;
if (_ins._eventController.IsEventCrate(storageContainer.net.ID.Value)) _ins._eventController.OnEventCrateLooted(storageContainer, player.userID);
}
private void OnLootEntity(BasePlayer player, Fridge fridge) {
if (player == null || fridge == null || fridge.net == null) return;
if (_eventController.IsEventCrate(fridge.net.ID.Value)) _eventController.OnEventCrateLooted(fridge, player.userID);
}
private void OnLootEntityEnd(BasePlayer player, StorageContainer storageContainer) {
if (storageContainer == null || storageContainer.net == null || !player.IsRealPlayer()) return;
if (storageContainer is not LootContainer && _eventController.IsEventCrate(storageContainer.net.ID.Value)) if (storageContainer.inventory.IsEmpty()) storageContainer.Kill();
}
private void OnLootEntityEnd(BasePlayer player, Fridge fridge) {
if (fridge == null || fridge.net == null || !player.IsRealPlayer()) return;
if (_eventController.IsEventCrate(fridge.net.ID.Value)) if (fridge.inventory.IsEmpty()) fridge.Kill();
}
#region OtherPlugins
private object CanPveModeAllowDamage(SamSite samSite, HitInfo info) {
if (_eventController == null || samSite == null || samSite.net == null || info == null) return null;
if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return true;
return null;
}
private object CanEntityBeTargeted(BasePlayer player, AutoTurret turret) {
if (_eventController == null || turret == null || turret.net == null) return null;
if (!_eventController.IsTrainTurret(turret.net.ID.Value)) return null;
if (!player.IsRealPlayer()) return false;
if (!_eventController.IsAggressive() && !_eventController.IsStopped()) return false;
if (!_config.SupportedPluginsConfig.PveMode.Enable || !_eventController.IsStopped()) return true;
return null;
}
private object CanEntityBeTargeted(PlayerHelicopter playerHelicopter, SamSite samSite) {
if (_eventController == null || samSite == null || samSite.net == null) return null;
if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
return _eventController.IsAggressive();
}
private object CanEntityTakeDamage(AutoTurret autoTurret, HitInfo info) {
if (_eventController == null || autoTurret == null || autoTurret.net == null || info == null) return null;
if (!_eventController.IsTrainTurret(autoTurret.net.ID.Value)) return null;
if (!info.InitiatorPlayer.IsRealPlayer()) return false;
if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, autoTurret, true)) return false;
return true;
}
private object CanEntityTakeDamage(SamSite samSite, HitInfo info) {
if (_eventController == null || samSite == null || samSite.net == null || info == null) return null;
if (!_eventController.IsTrainSamSite(samSite.net.ID.Value)) return null;
if (!info.InitiatorPlayer.IsRealPlayer()) return false;
if (!EventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return false;
return true;
}
private object CanEntityTakeDamage(BasePlayer victim, HitInfo info) {
if (_eventController == null || info == null || info.Initiator == null || info.Initiator.net == null || !victim.IsRealPlayer()) return null;
if (_config.ZoneConfig.IsPvpZone && !_config.SupportedPluginsConfig.PveMode.Enable) {
if (info.InitiatorPlayer.IsRealPlayer() && ZoneController.IsPlayerInZone(info.InitiatorPlayer.userID) && ZoneController.IsPlayerInZone(victim.userID)) return true;
}
if (!_config.SupportedPluginsConfig.PveMode.Enable && info.Initiator is AutoTurret && _eventController.IsTrainTurret(info.Initiator.net.ID.Value)) return true;
return null;
}
private object CanEntityTakeDamage(PlayerHelicopter playerHelicopter, HitInfo info) {
if (_eventController == null || info == null || info.Initiator == null || info.Initiator.net == null) return null;
if (info.Initiator is SamSite) {
if (_eventController.IsTrainSamSite(info.Initiator.net.ID.Value)) return true;
}
return null;
}
private object CanEntityTakeDamage(CustomBradley bradleyApc, HitInfo info) {
if (_eventController == null || info == null || !info.InitiatorPlayer.IsRealPlayer() || bradleyApc.net == null) return null;
if (_config.SupportedPluginsConfig.PveMode.Enable) return null;
if (_eventController.IsTrainBradley(bradleyApc.net.ID.Value)) return true;
return null;
}
private object OnCreateDynamicPVP(string eventName, PatrolHelicopter patrolHelicopter) {
if (_eventController == null || patrolHelicopter == null || patrolHelicopter.net == null) return null;
if (EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value) != null) return true;
return null;
}
private object OnCreateDynamicPVP(string eventName, BradleyAPC bradleyApc) {
if (_eventController == null || bradleyApc == null || bradleyApc.net == null) return null;
if (_eventController.IsTrainBradley(bradleyApc.net.ID.Value)) return true;
return null;
}
private void SetOwnerPveMode(string eventName, BasePlayer player) {
if (_eventController == null || string.IsNullOrEmpty(eventName) || eventName != Name || !player.IsRealPlayer()) return;
if (eventName == Name) PveModeManager.OnNewOwnerSet(player);
}
private void ClearOwnerPveMode(string shortname) {
if (_eventController == null || string.IsNullOrEmpty(shortname)) return;
if (shortname == Name) PveModeManager.OnOwnerDeleted();
}
private object CanBradleySpawnNpc(BradleyAPC bradley) {
if (_eventController == null || bradley == null || bradley.net == null) return null;
if (_eventController.IsTrainBradley(bradley.net.ID.Value)) return true;
return null;
}
private object CanHelicopterSpawnNpc(PatrolHelicopter patrolHelicopter) {
if (_eventController == null || patrolHelicopter == null || patrolHelicopter.net == null) return null;
if (_ins._config.SupportedPluginsConfig.BetterNpcConfig.IsHeliNpc) return null;
if (EventHeli.GetEventHeliByNetId(patrolHelicopter.net.ID.Value) != null) return true;
return null;
}
#endregion OtherPlugins
#region Loot
private void OnCorpsePopulate(ScientistNPC scientistNpc, NPCPlayerCorpse corpse) {
if (scientistNpc == null || scientistNpc.net == null || corpse == null) return;
EntityPresetInfo entityPresetInfo = scientistNpc.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return;
NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByPresetName(entityPresetInfo.presetName);
if (npcConfig == null) return;
LootController.UpdateNpcCorpse(corpse, npcConfig);
}
private void OnCrateSpawned(BradleyAPC bradleyApc, LockedByEntCrate crate) {
if (bradleyApc == null || crate == null) return;
EntityPresetInfo entityPresetInfo = bradleyApc.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return;
BradleyConfig bradleyConfig = _config.Bradleys.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (bradleyConfig == null) return;
if (bradleyConfig.InstCrateOpen) {
crate.SetLockingEnt(null);
crate.SetLocked(false);
}
_eventController.AddEventCrate(crate);
LootController.UpdateHeliOrBradleyCrate(crate, bradleyConfig.LootTableConfig, bradleyConfig.PresetName);
}
private void OnCrateSpawned(PatrolHelicopter patrolHelicopter, LockedByEntCrate crate) {
if (patrolHelicopter == null || crate == null) return;
EntityPresetInfo entityPresetInfo = patrolHelicopter.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return;
HeliConfig heliConfig = _config.HeliConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (heliConfig == null) return;
if (heliConfig.InstCrateOpen) {
crate.SetLockingEnt(null);
crate.SetLocked(false);
}
_eventController.AddEventCrate(crate);
LootController.UpdateHeliOrBradleyCrate(crate, heliConfig.LootTableConfig, heliConfig.PresetName);
}
#region LootTablePlugin
private object OnContainerPopulate(LootContainer lootContainer) {
if (lootContainer == null) return null;
LockedByEntCrate lockedByEntCrate = lootContainer as LockedByEntCrate;
if (lockedByEntCrate != null) {
LootTableConfig lootTableConfig = null;
if (_eventHeli != null && Vector3.Distance(_eventHeli.transform.position, lockedByEntCrate.transform.position) < 15f) lootTableConfig = _eventHeli.HeliConfig.LootTableConfig;
if (lootTableConfig == null) {
float minDistance = float.MaxValue;
BradleyAPC minDistanceBradley = null;
foreach (BradleyAPC bradleyApc in _eventController.Bradleys) {
if (bradleyApc == null) continue;
float distance = Vector3.Distance(bradleyApc.transform.position, lockedByEntCrate.transform.position);
if (distance < minDistance) {
minDistance = distance;
minDistanceBradley = bradleyApc;
}
}
if (minDistanceBradley != null && minDistance < 15) {
EntityPresetInfo bradleyPresetInfo = minDistanceBradley.GetComponent<EntityPresetInfo>();
if (bradleyPresetInfo == null) return null;
BradleyConfig bradleyConfig = _config.Bradleys.FirstOrDefault(x => x.PresetName == bradleyPresetInfo.presetName);
if (bradleyConfig == null) return null;
lootTableConfig = bradleyConfig.LootTableConfig;
}
}
if (lootTableConfig == null) return null;
if (!lootTableConfig.IsLoottablePlugin) return true;
return null;
}
EntityPresetInfo entityPresetInfo = lootContainer.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return null;
CrateConfig crateConfig = _config.CrateConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (crateConfig == null) return null;
if (!crateConfig.LootTableConfig.IsLoottablePlugin) return true;
return null;
}
private object OnCorpsePopulate(NPCPlayerCorpse corpse) {
if (corpse == null) return null;
EntityPresetInfo entityPresetInfo = corpse.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return null;
NpcConfig npcConfig = _config.NpcConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (npcConfig == null) return null;
if (!npcConfig.LootTableConfig.IsLoottablePlugin) return true;
return null;
}
#endregion LootTablePlugin
#region AlphaLoot
private object CanPopulateLoot(LootContainer lootContainer) {
if (lootContainer == null) return null;
EntityPresetInfo entityPresetInfo = lootContainer.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return null;
LockedByEntCrate lockedByEntCrate = lootContainer as LockedByEntCrate;
if (lockedByEntCrate != null) {
LootTableConfig lootTableConfig = null;
BradleyConfig bradleyConfig = _config.Bradleys.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (bradleyConfig != null) lootTableConfig = bradleyConfig.LootTableConfig;
if (lootTableConfig == null) {
HeliConfig heliConfig = _config.HeliConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (heliConfig != null) lootTableConfig = heliConfig.LootTableConfig;
}
if (lootTableConfig == null) return null;
if (!lootTableConfig.IsAlphaLoot) return true;
return null;
}
CrateConfig crateConfig = _config.CrateConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (crateConfig == null) return null;
if (!crateConfig.LootTableConfig.IsAlphaLoot) return true;
return null;
}
private object CanPopulateLoot(ScientistNPC scientistNpc, NPCPlayerCorpse corpse) {
if (corpse == null) return null;
EntityPresetInfo entityPresetInfo = corpse.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return null;
NpcConfig npcConfig = _config.NpcConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (npcConfig == null) return null;
if (!npcConfig.LootTableConfig.IsAlphaLoot) return true;
return null;
}
#endregion AlphaLoot
#region CustomLoot
private object OnCustomLootContainer(NetworkableId net) {
BaseEntity crateEntity = _eventController.GetCrateByNetId(net.Value);
if (crateEntity == null) return null;
EntityPresetInfo entityPresetInfo = crateEntity.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return null;
LockedByEntCrate lockedByEntCrate = crateEntity as LockedByEntCrate;
if (lockedByEntCrate != null) {
LootTableConfig lootTableConfig = null;
BradleyConfig bradleyConfig = _config.Bradleys.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (bradleyConfig != null) lootTableConfig = bradleyConfig.LootTableConfig;
if (lootTableConfig == null) {
HeliConfig heliConfig = _config.HeliConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (heliConfig != null) lootTableConfig = heliConfig.LootTableConfig;
}
if (lootTableConfig == null) return null;
if (!lootTableConfig.IsCustomLootPlugin) return true;
return null;
}
CrateConfig crateConfig = _config.CrateConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (crateConfig == null) return null;
if (!crateConfig.LootTableConfig.IsCustomLootPlugin) return true;
return null;
}
private object OnCustomLootNPC(NetworkableId net) {
ScientistNPC scientistNpc = NpcSpawnManager.GetScientistByNetId(net.Value);
if (scientistNpc == null) return null;
EntityPresetInfo entityPresetInfo = scientistNpc.GetComponent<EntityPresetInfo>();
if (entityPresetInfo == null) return null;
NpcConfig npcConfig = _config.NpcConfigs.FirstOrDefault(x => x.PresetName == entityPresetInfo.presetName);
if (npcConfig == null) return null;
if (!npcConfig.LootTableConfig.IsCustomLootPlugin) return true;
return null;
}
#endregion CustomLoot
#endregion Loot
#endregion Hooks
#region Commands
[ChatCommand("atrainstart")]
private void ChatStartCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (arg == null || arg.Length == 0) EventLauncher.DelayStartEvent(false, player);
else {
string eventPresetName = arg[0];
EventLauncher.DelayStartEvent(false, player, eventPresetName);
}
}
[ChatCommand("atrainstop")]
private void ChatStopCommand(BasePlayer player, string command, string[] arg) {
if (player.IsAdmin) EventLauncher.StopEvent();
}
[ConsoleCommand("atrainstart")]
private void ConsoleStartCommand(ConsoleSystem.Arg arg) {
if (arg.Player() != null) return;
if (arg == null || arg.Args == null || arg.Args.Length == 0) EventLauncher.DelayStartEvent();
else {
string eventPresetName = arg.Args[0];
EventLauncher.DelayStartEvent(presetName : eventPresetName);
}
}
[ConsoleCommand("atrainstop")]
private void ConsoleStopCommand(ConsoleSystem.Arg arg) {
if (arg.Player() == null) EventLauncher.StopEvent();
}
[ChatCommand("atrainstartunderground")]
private void ChatUndergroundStartCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (arg == null || arg.Length == 0) EventLauncher.DelayStartEvent(false, player, overrideUndergroundChance : 100);
else {
string eventPresetName = arg[0];
EventLauncher.DelayStartEvent(false, player, eventPresetName, 100);
}
}
[ChatCommand("atrainstartaboveground")]
private void ChatAboveGroundStartCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (arg == null || arg.Length == 0) EventLauncher.DelayStartEvent(false, player, overrideUndergroundChance : 0);
else {
string eventPresetName = arg[0];
EventLauncher.DelayStartEvent(false, player, eventPresetName, 0);
}
}
[ConsoleCommand("atrainstartunderground")]
private void ConsoleUndergroundStartCommand(ConsoleSystem.Arg arg) {
if (arg.Player() != null) return;
if (arg == null || arg.Args == null || arg.Args.Length == 0) EventLauncher.DelayStartEvent(overrideUndergroundChance : 100);
else {
string eventPresetName = arg.Args[0];
EventLauncher.DelayStartEvent(presetName : eventPresetName, overrideUndergroundChance : 100);
}
}
[ConsoleCommand("atrainstartaboveground")]
private void ConsoleAboveGroundStartCommand(ConsoleSystem.Arg arg) {
if (arg.Player() != null) return;
if (arg == null || arg.Args == null || arg.Args.Length == 0) EventLauncher.DelayStartEvent(overrideUndergroundChance : 0);
else {
string eventPresetName = arg.Args[0];
EventLauncher.DelayStartEvent(presetName : eventPresetName, overrideUndergroundChance : 0);
}
}
[ChatCommand("atrainpoint")]
private void ChatCustomPointCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (!SpawnPositionFinder.IsRailsInPosition(player.transform.position)) {
PrintToChat(player, _config.Prefix + " <color=#ce3f27>Couldn't</color> find the rails");
return;
}
PrintToChat(player, _config.Prefix + " New spawn point <color=#738d43>successfully</color> added");
Vector3 rotation = player.eyes.GetLookRotation().eulerAngles;
LocationConfig locationConfig = new LocationConfig {
Position = player.transform.position.ToString(), Rotation = (new Vector3(0, rotation.y, 0)).ToString()
}
;
_config.MainConfig.CustomSpawnPointConfig.Points.Add(locationConfig);
SaveConfig();
}
[ConsoleCommand("savecustomwagon")]
private void ConsoleSaveCustomWagonCommand(ConsoleSystem.Arg arg) {
if (arg.Player() != null) return;
string customizationPresetName = arg.Args[0];
string wagonShortPrefabName = arg.Args[1];
WagonCustomizer.MapSaver.CreateOrAddNewWagonToData(customizationPresetName, wagonShortPrefabName);
}
#endregion Commands
#region Methods
private void Unsubscribes() {
foreach (string hook in _subscribeMethods) Unsubscribe(hook);
}
private void Subscribes() {
foreach (string hook in _subscribeMethods) Subscribe(hook);
}
private static void Debug(params object[] arg) {
string result = "";
foreach (object obj in arg) if (obj != null) result += obj.ToString() + " ";
_ins.Puts(result);
}
#endregion Methods
#region Classes
private static class EventLauncher {
private static Coroutine _autoEventCoroutine;
private static Coroutine _delayedEventStartCoroutine;
public static bool IsEventActive() {
return _ins != null && _ins._eventController != null;
}
public static void AutoStartEvent() {
if (!_ins._config.MainConfig.IsAutoEvent) return;
if (_autoEventCoroutine != null) ServerMgr.Instance.StopCoroutine(_autoEventCoroutine);
_autoEventCoroutine = ServerMgr.Instance.StartCoroutine(AutoEventCoroutine());
}
public static void DelayStartEvent(bool isAutoActivated = false, BasePlayer activator = null, string presetName = "", float overrideUndergroundChance = -1) {
if (IsEventActive() || _delayedEventStartCoroutine != null) {
NotifyManager.PrintError(activator, "EventActive_Exeption");
return;
}
if (_autoEventCoroutine != null) ServerMgr.Instance.StopCoroutine(_autoEventCoroutine);
float undergroundChance = overrideUndergroundChance >= 0 ? overrideUndergroundChance : _ins._config.MainConfig.UndergroundChance;
bool isUnderGround = Random.Range(0f, 100f) < undergroundChance;
EventConfig eventConfig = DefineEventConfig(presetName, isUnderGround);
if (eventConfig == null) {
NotifyManager.PrintError(activator, "ConfigurationNotFound_Exeption");
StopEvent();
return;
}
_delayedEventStartCoroutine = ServerMgr.Instance.StartCoroutine(DelayedStartEventCoroutine(eventConfig, isUnderGround));
if (!isAutoActivated) NotifyManager.PrintInfoMessage(activator, "SuccessfullyLaunched");
}
private static IEnumerator AutoEventCoroutine() {
yield return CoroutineEx.waitForSeconds(Random.Range(_ins._config.MainConfig.MinTimeBetweenEvents, _ins._config.MainConfig.MaxTimeBetweenEvents));
yield return CoroutineEx.waitForSeconds(5f);
DelayStartEvent(true);
}
private static IEnumerator DelayedStartEventCoroutine(EventConfig eventConfig, bool isUnderGround) {
if (_ins._config.NotifyConfig.PreStartTime > 0) NotifyManager.SendMessageToAll("PreStartTrain", _ins._config.Prefix, eventConfig.DisplayName, _ins._config.NotifyConfig.PreStartTime);
yield return CoroutineEx.waitForSeconds(_ins._config.NotifyConfig.PreStartTime);
StartEvent(eventConfig, isUnderGround);
}
private static void StartEvent(EventConfig eventConfig, bool isUnderGround) {
GameObject gameObject = new GameObject();
_ins._eventController = gameObject.AddComponent<EventController>();
_ins._eventController.Init(eventConfig, isUnderGround);
if (_ins._config.MainConfig.EnableStartStopLogs) NotifyManager.PrintLogMessage("EventStart_Log", eventConfig.PresetName);
Interface.CallHook($"On{_ins.Name}EventStart");
}
public static void StopEvent(bool isPluginUnloadingOrFailed = false) {
if (IsEventActive()) {
_ins.Unsubscribes();
_ins._eventController.DeleteController();
ZoneController.TryDeleteZone();
PveModeManager.OnEventEnd();
EventMapMarker.DeleteMapMarker();
NpcSpawnManager.ClearData(false);
GuiManager.DestroyAllGui();
EconomyManager.OnEventEnd();
EventHeli.ClearData();
NotifyManager.SendMessageToAll("EndEvent", _ins._config.Prefix);
Interface.CallHook($"On{_ins.Name}EventStop");
if (_ins._config.MainConfig.EnableStartStopLogs) NotifyManager.PrintLogMessage("EventStop_Log");
if (!isPluginUnloadingOrFailed) AutoStartEvent();
}
if (_delayedEventStartCoroutine != null) {
ServerMgr.Instance.StopCoroutine(_delayedEventStartCoroutine);
_delayedEventStartCoroutine = null;
}
}
private static EventConfig DefineEventConfig(string eventPresetName, bool isUnderGround) {
if (eventPresetName != "") return _ins._config.EventConfigs.FirstOrDefault(x => x.PresetName == eventPresetName);
HashSet<EventConfig> suitableEventConfigs = _ins._config.EventConfigs.Where(x => x.Chance > 0 && x.IsAutoStart && (!isUnderGround || x.IsUndergroundTrain) && IsEventConfigSuitableByTime(x));
if (suitableEventConfigs == null || suitableEventConfigs.Count == 0) return null;
float sumChance = 0;
foreach (EventConfig eventConfig in suitableEventConfigs) sumChance += eventConfig.Chance;
float random = Random.Range(0, sumChance);
foreach (EventConfig eventConfig in suitableEventConfigs) {
random -= eventConfig.Chance;
if (random <= 0) return eventConfig;
}
return null;
}
private static bool IsEventConfigSuitableByTime(EventConfig eventConfig) {
if (eventCo
// ... [Code preview truncated due to length. Full source in attached file] ...