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 CompanionServer.Handlers;
using Time = UnityEngine.Time;
using static TrainEngine;
using static ProtoBuf.PatternFirework;
using static BaseCombatEntity;
namespace Oxide.Plugins {
[Info("ArmoredTrain", "Adem", "1.8.0")]
class ArmoredTrain : RustPlugin {
#region Variables
const bool en = false;
static ArmoredTrain ins;
EventController eventController;
[PluginReference]
Plugin NpcSpawn, PveMode, GUIAnnouncements, Notify, DiscordMessages, DynamicPVP, Economics, ServerRewards, IQEconomic, TrainHomes, AlphaLoot;
HashSet<string> subscribeMethods = new HashSet<string> {
"OnEntitySpawned", "OnEntityTakeDamage", "OnEntityDeath", "OnEntityEnter", "CanHelicopterTarget", "CanBradleyApcTarget", "OnTrainCarUncouple", "CanTrainCarCouple", "CanPickupEntity", "CanMountEntity", "OnSwitchToggle", "OnSwitchToggled", "OnCounterModeToggle", "OnCounterTargetChange", "CanLootEntity", "OnSamSiteModeToggle", "OnTurretAuthorize", "CanHackCrate", "OnLootEntity", "OnLootEntityEnd", "OnCorpsePopulate", "OnCustomNpcTarget", "CanEntityBeTargeted", "CanEntityTakeDamage", "CanPopulateLoot", "OnCustomLootContainer", "OnCustomLootNPC", "OnCreateDynamicPVP", "SetOwnerPveMode", "ClearOwnerPveMode", "CanBradleySpawnNpc", "CanHelicopterSpawnNpc"
}
;
#endregion Variables
#region ExternalAPI
bool IsArmoredTrainActive() {
return EventLauncher.IsEventActive();
}
bool StopArmoredTrain() {
if (!EventLauncher.IsEventActive()) return false;
//eventController.StopMoving(13954);
return true;
}
bool StartArmoredTrainEvent() {
if (EventLauncher.IsEventActive()) return false;
EventLauncher.DelayStartEvent();
return true;
}
bool EndArmoredTrainEvent() {
if (EventLauncher.IsEventActive()) return false;
EventLauncher.StopEvent();
return true;
}
Vector3 ArmoredTrainLocomotivePosition() {
if (!EventLauncher.IsEventActive()) return Vector3.zero;
return eventController.GetEventPosition();
}
bool IsTrainBradley(ulong netID) {
return EventLauncher.IsEventActive() && eventController.IsTrainBradley(netID);
}
bool IsTrainHeli(ulong netID) {
if (!EventLauncher.IsEventActive()) return false;
return EventHeli.GetEventHeliByNetId(netID) != null;
}
bool IsTrainCrate(ulong netID) {
return EventLauncher.IsEventActive() && LootManager.GetContainerDataByNetId(netID) != null;
}
bool IsTrainSamSite(ulong netID) {
return EventLauncher.IsEventActive() && eventController.IsTrainSamSite(netID);
}
bool IsTrainWagon(ulong netID) {
return EventLauncher.IsEventActive() && eventController.IsTrainWagon(netID);
}
bool IsTrainTurret(ulong netID) {
return EventLauncher.IsEventActive() && eventController.IsTrainTurret(netID);
}
#endregion ExternalAPI
#region Hooks
void Init() {
Unsubscribes();
}
void OnServerInitialized() {
ins = this;
if (!NpcSpawnManager.IsNpcSpawnReady()) return;
LoadDefaultMessages();
UpdateConfig();
UpdateLootTables();
GuiManager.LoadImages();
WagonCustomizator.LoadCurrentCustomizationProfile();
LootManager.InitialLootManagerUpdate();
EventLauncher.AutoStartEvent();
}
void Unload() {
EventLauncher.StopEvent(true);
ins = null;
}
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();
}
void OnEntitySpawned(LockedByEntCrate entity) {
if (!entity.IsExists()) return;
if (entity.ShortPrefabName == "heli_crate") LootManager.OnHeliCrateSpawned(entity);
}
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;
}
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;
else {
eventHeli.OnHeliAttacked(info.InitiatorPlayer.userID);
eventController.OnTrainAttacked(info.InitiatorPlayer);
}
return null;
}
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;
else eventController.OnTrainAttacked(info.InitiatorPlayer);
return null;
}
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;
else if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, autoTurret, true)) return true;
else eventController.OnTrainAttacked(info.InitiatorPlayer);
return null;
}
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;
else if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return true;
else eventController.OnTrainAttacked(info.InitiatorPlayer);
return null;
}
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;
}
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;
}
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;
}
else {
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);
}
return null;
}
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;
}
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);
}
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);
}
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);
}
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);
}
}
object OnEntityEnter(TriggerTrainCollisions trigger, TrainCar trainCar) {
if (!ins._config.mainConfig.destrroyWagons || 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)) {
if (trainCar is TrainEngine) {
if (eventController.IsReverse()) return null;
}
else if (!eventController.IsReverse()) {
return null;
}
if (trigger.owner.IsExists() && ins._config.mainConfig.destrroyWagons) {
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;
}
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;
}
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.IsAgressive()) return false;
if (player.IsSleeping() || (player.InSafeZone() && !player.IsHostile())) return false;
return null;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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);
}
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;
}
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;
}
void OnPlayerSleep(BasePlayer player) {
if (player == null) return;
ZoneController.OnPlayerLeaveZone(player);
}
object CanLootEntity(BasePlayer player, LootContainer container) {
if (player == null || container == null || container.net == null) return null;
if (LootManager.GetContainerDataByNetId(container.net.ID.Value) == null) return null;
if (!eventController.IsAgressive()) {
eventController.MakeAgressive();
return true;
}
if (!eventController.IsPlayerCanLoot(player, true)) return true;
return null;
}
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.IsAgressive()) eventController.MakeAgressive();
return true;
}
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.IsAgressive()) eventController.MakeAgressive();
return true;
}
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.IsAgressive()) eventController.MakeAgressive();
return true;
}
object CanHackCrate(BasePlayer player, HackableLockedCrate crate) {
if (player == null || crate == null || crate.net == null) return null;
StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(crate.net.ID.Value);
if (storageContainerData == null) return null;
if (!eventController.IsAgressive()) {
eventController.MakeAgressive();
return true;
}
if (!eventController.IsPlayerCanLoot(player, true)) return true;
if (!PveModeManager.IsPveModeBlockAction(player)) EconomyManager.AddBalance(player.userID, _config.supportedPluginsConfig.economicsConfig.hackCratePoint);
CrateConfig crateConfig = LootManager.GetCrateConfigByPresetName(storageContainerData.presetName);
crate.Invoke(() => LootManager.UpdateCrateHackTime(crate, storageContainerData.presetName), 1.1f);
eventController.OnPlayerStartHackingCrate((int)crateConfig.hackTime);
return null;
}
void OnLootEntity(BasePlayer player, StorageContainer storageContainer) {
if (player == null || storageContainer == null || storageContainer.net == null) return;
StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(storageContainer.net.ID.Value);
if (storageContainerData == null) return;
LootManager.OnEventCrateLooted(storageContainer, player.userID);
}
void OnLootEntityEnd(BasePlayer player, StorageContainer storageContainer) {
if (storageContainer == null || storageContainer.net == null || !player.IsRealPlayer()) return;
if (LootManager.GetContainerDataByNetId(storageContainer.net.ID.Value) == null) return;
if (storageContainer is LootContainer == false) {
if (storageContainer.inventory.IsEmpty()) storageContainer.Kill();
}
eventController.EventPassingCheck();
}
void OnCorpsePopulate(ScientistNPC scientistNPC, NPCPlayerCorpse corpse) {
if (scientistNPC == null || scientistNPC.net == null || corpse == null) return;
if (NpcSpawnManager.GetScientistByNetId(scientistNPC.net.ID.Value) == null) return;
NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(scientistNPC.displayName);
if (npcConfig != null) {
ins.NextTick(() => {
if (corpse == null) return;
if (!corpse.containers.IsNullOrEmpty() && corpse.containers[0] != null) LootManager.UpdateItemContainer(corpse.containers[0], npcConfig.lootTableConfig, npcConfig.lootTableConfig.clearDefaultItemList);
if (npcConfig.deleteCorpse && !corpse.IsDestroyed) corpse.Kill();
}
);
}
}
#region OtherPlugins
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;
else if (!eventController.IsAgressive()) return false;
else if (!PveModeManager.IsPveModeBlockAction(player)) return true;
return null;
}
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;
if (!eventController.IsAgressive()) return false;
return true;
}
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;
else if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, autoTurret, true)) return false;
else if (!_config.supportedPluginsConfig.pveMode.enable || _config.supportedPluginsConfig.pveMode.damageTurret || !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) return true;
return null;
}
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;
else if (!eventController.IsPlayerCanDealDamage(info.InitiatorPlayer, samSite, true)) return false;
else if (!_config.supportedPluginsConfig.pveMode.enable || _config.supportedPluginsConfig.pveMode.damageTurret || !PveModeManager.IsPveModeBlockAction(info.InitiatorPlayer)) return true;
return null;
}
object CanEntityTakeDamage(BasePlayer victim, HitInfo hitinfo) {
if (eventController == null || hitinfo == null || hitinfo.Initiator == null || hitinfo.Initiator.net == null || !victim.IsRealPlayer()) return null;
if (_config.zoneConfig.isPVPZone && !_config.supportedPluginsConfig.pveMode.enable) {
if (hitinfo.InitiatorPlayer.IsRealPlayer() && ZoneController.IsPlayerInZone(hitinfo.InitiatorPlayer.userID) && ZoneController.IsPlayerInZone(victim.userID)) return true;
}
if (hitinfo.Initiator is AutoTurret) {
if (eventController.IsTrainTurret(hitinfo.Initiator.net.ID.Value)) return true;
}
return null;
}
object CanEntityTakeDamage(PlayerHelicopter playerHelicopter, HitInfo hitinfo) {
if (eventController == null || hitinfo == null || hitinfo.Initiator == null || hitinfo.Initiator.net == null) return null;
if (hitinfo.Initiator is SamSite) {
if (eventController.IsTrainSamSite(hitinfo.Initiator.net.ID.Value)) return true;
}
return null;
}
object CanEntityTakeDamage(CustomBradley bradleyApc, HitInfo hitinfo) {
if (eventController == null || hitinfo == null || !hitinfo.InitiatorPlayer.IsRealPlayer() || bradleyApc.net == null) return null;
if (eventController.IsTrainBradley(bradleyApc.net.ID.Value)) return true;
return null;
}
object CanPopulateLoot(LootContainer lootContainer) {
if (eventController == null || lootContainer == null || lootContainer.net == null) return null;
StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(lootContainer.net.ID.Value);
if (storageContainerData != null) {
CrateConfig crateConfig = LootManager.GetCrateConfigByPresetName(storageContainerData.presetName);
if (crateConfig != null && !crateConfig.lootTableConfig.isAlphaLoot) return true;
}
return null;
}
object CanPopulateLoot(ScientistNPC scientistNPC, NPCPlayerCorpse corpse) {
if (eventController == null || scientistNPC == null || scientistNPC.net == null) return null;
NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(scientistNPC.displayName);
if (npcConfig != null && !npcConfig.lootTableConfig.isAlphaLoot) return true;
return null;
}
object OnCustomLootContainer(NetworkableId netID) {
if (eventController == null || netID == null) return null;
StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(netID.Value);
if (storageContainerData != null) {
CrateConfig crateConfig = LootManager.GetCrateConfigByPresetName(storageContainerData.presetName);
if (crateConfig != null && !crateConfig.lootTableConfig.isCustomLoot) return true;
}
return null;
}
object OnCustomLootNPC(NetworkableId netID) {
if (eventController == null || netID == null) return null;
ScientistNPC scientistNPC = NpcSpawnManager.GetScientistByNetId(netID.Value);
if (scientistNPC != null) {
NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(scientistNPC.displayName);
if (npcConfig != null && !npcConfig.lootTableConfig.isCustomLoot) return true;
}
return null;
}
object OnContainerPopulate(LootContainer lootContainer) {
if (eventController == null || lootContainer == null || lootContainer.net == null) return null;
StorageContainerData storageContainerData = LootManager.GetContainerDataByNetId(lootContainer.net.ID.Value);
if (storageContainerData != null) {
CrateConfig crateConfig = LootManager.GetCrateConfigByPresetName(storageContainerData.presetName);
if (crateConfig != null && !crateConfig.lootTableConfig.isLootTablePLugin) return true;
}
return null;
}
object OnCorpsePopulate(NPCPlayerCorpse corpse) {
if (eventController == null || corpse == null) return null;
NpcConfig npcConfig = NpcSpawnManager.GetNpcConfigByDisplayName(corpse.playerName);
if (npcConfig != null && !npcConfig.lootTableConfig.isAlphaLoot) return true;
return null;
}
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;
}
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;
}
void SetOwnerPveMode(string eventName, BasePlayer player) {
if (eventController == null || string.IsNullOrEmpty(eventName) || eventName != Name || !player.IsRealPlayer()) return;
if (eventName == Name) PveModeManager.OnNewOwnerSet(player);
}
void ClearOwnerPveMode(string shortname) {
if (eventController == null || string.IsNullOrEmpty(shortname)) return;
if (shortname == Name) PveModeManager.OnOwnerDeleted();
}
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;
}
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
#endregion Hooks
#region Commands
[ChatCommand("atrainstart")]
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")]
void ChatStopCommand(BasePlayer player, string command, string[] arg) {
if (player.IsAdmin) EventLauncher.StopEvent();
}
[ConsoleCommand("atrainstart")]
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")]
void ConsoleStopCommand(ConsoleSystem.Arg arg) {
if (arg.Player() == null) EventLauncher.StopEvent();
}
[ChatCommand("atrainstartunderground")]
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")]
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")]
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")]
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")]
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")]
void ConsoleSaveCustomWagonCommand(ConsoleSystem.Arg arg) {
if (arg.Player() != null) return;
string customizationPresetName = arg.Args[0];
string wagonShortPrefabName = arg.Args[1];
WagonCustomizator.MapSaver.CreateOrAddNewWagonToData(customizationPresetName, wagonShortPrefabName);
}
#endregion Commands
#region Methods
void Unsubscribes() {
foreach (string hook in subscribeMethods) Unsubscribe(hook);
}
void Subscribes() {
foreach (string hook in subscribeMethods) Subscribe(hook);
}
void UpdateConfig() {
if (_config.versionConfig != Version) {
PluginConfig defaultConfig = PluginConfig.DefaultConfig();
if (_config.versionConfig.Minor == 4) {
if (_config.versionConfig.Patch <= 1) {
CrateConfig crateNormalConfig = new CrateConfig {
presetName = "crate_normal_default", prefab = "assets/bundled/prefabs/radtown/crate_normal.prefab", hackTime = 0, lootTableConfig = new LootTableConfig {
minItemsAmount = 1, maxItemsAmount = 2, items = new List<LootItemConfig> {
new LootItemConfig {
shortname = "scrap", minAmount = 100, maxAmount = 200, chance = 100f, isBlueprint = false, skin = 0, name = ""
}
}
}
}
;
CrateConfig crateNormal2Config = new CrateConfig {
presetName = "crate_normal2_default", prefab = "assets/bundled/prefabs/radtown/crate_normal_2.prefab", hackTime = 0, lootTableConfig = new LootTableConfig {
minItemsAmount = 1, maxItemsAmount = 2, items = new List<LootItemConfig> {
new LootItemConfig {
shortname = "scrap", minAmount = 100, maxAmount = 200, chance = 100f, isBlueprint = false, skin = 0, name = ""
}
}
}
}
;
_config.crateConfigs.Add(crateNormalConfig);
_config.crateConfigs.Add(crateNormal2Config);
TurretConfig turretConfig = _config.turretConfigs.FirstOrDefault(x => true);
WagonConfig halloweenWagoConfig = new WagonConfig {
presetName = "halloween_wagon", prefabName = "assets/content/vehicles/trains/wagons/trainwagonunloadableloot.entity.prefab", brradleys = new Dictionary<string, HashSet<LocationConfig>>(), crates = new Dictionary<string, HashSet<LocationConfig>> {
["crate_normal_default"]
= new HashSet<LocationConfig> {
new LocationConfig {
position = "(0.407, 2.403, -3.401)", rotation = "(303.510, 0, 328.794)"
}
, new LocationConfig {
position = "(-0.374, 2.416, 3.104)", rotation = "(21.106, 261.772, 352.540)"
}
}
, ["crate_normal2_default"] = new HashSet<LocationConfig> {
new LocationConfig {
position = "(-0.095, 1.817, -0.217)", rotation = "(19.048, 336.704, 359.624)"
}
}
}
, samsites = new Dictionary<string, HashSet<LocationConfig>>(), decors = new Dictionary<string, HashSet<LocationConfig>>(), npcs = new Dictionary<string, HashSet<LocationConfig>>(), turrets = new Dictionary<string, HashSet<LocationConfig>> {
[turretConfig.presetName]
= new HashSet<LocationConfig> {
new LocationConfig {
position = "(-0.940, 1.559, -6.811)", rotation = "(0, 180, 0)"
}
, new LocationConfig {
position = "(0.940, 1.559, -6.811)", rotation = "(0, 180, 0)"
}
, new LocationConfig {
position = "(-0.940, 1.559, 6.811)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(0.940, 1.559, 6.811)", rotation = "(0, 0, 0)"
}
}
}
,
}
;
_config.wagonConfigs.Add(halloweenWagoConfig);
NpcConfig npcConfig = _config.npcConfigs.FirstOrDefault(x => true);
LocomotiveConfig halloweenLocomotive = new LocomotiveConfig {
presetName = "locomotive_halloween", prefabName = "assets/content/vehicles/trains/locomotive/locomotive.entity.prefab", engineForce = 500000f, maxSpeed = 14, brradleys = new Dictionary<string, HashSet<LocationConfig>> {
}
, turrets = new Dictionary<string, HashSet<LocationConfig>> {
}
, npcs = new Dictionary<string, HashSet<LocationConfig>> {
[npcConfig.displayName]
= new HashSet<LocationConfig> {
new LocationConfig {
position = "(-1.341, 1.546, 2)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(-1.341, 1.546, -2)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(-1.341, 1.546, -6)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, 2)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, -2)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, -6)", rotation = "(0, 0, 0)"
}
}
}
, crates = new Dictionary<string, HashSet<LocationConfig>> {
}
, samsites = new Dictionary<string, HashSet<LocationConfig>> {
}
, decors = new Dictionary<string, HashSet<LocationConfig>> {
}
}
;
_config.locomotiveConfigs.Add(halloweenLocomotive);
WagonConfig samsiteWagomConfig = _config.wagonConfigs.FirstOrDefault(x => x.presetName.Contains("sam"));
WagonConfig crateWagomConfig = _config.wagonConfigs.FirstOrDefault(x => x.presetName.Contains("crate"));
EventConfig halloweenTrainConfig = new EventConfig {
presetName = "train_halloween", displayName = en ? "Halloween Train" : "Хэллоуинский Поезд", isUndergroundTrain = false, eventTime = 3600, stopTime = 300, isAutoStart = true, chance = 0, locomotivePreset = "locomotive_halloween", wagonsPreset = new List<string>(), heliPreset = ""
}
;
if (crateWagomConfig != null) halloweenTrainConfig.wagonsPreset.Add(crateWagomConfig.presetName);
halloweenTrainConfig.wagonsPreset.Add(halloweenWagoConfig.presetName);
if (samsiteWagomConfig != null) halloweenTrainConfig.wagonsPreset.Add(samsiteWagomConfig.presetName);
_config.eventConfigs.Add(halloweenTrainConfig);
}
if (_config.versionConfig.Patch <= 3) {
_config.customizationConfig = new CustomizationConfig {
isElectricFurnacesEnable = true, isBoilersEnable = true, isFireEnable = true
}
;
}
if (_config.versionConfig.Patch <= 4) {
if (_config.customizationConfig == null) {
_config.customizationConfig = new CustomizationConfig {
isElectricFurnacesEnable = true, isBoilersEnable = true, isFireEnable = true
}
;
}
}
if (_config.versionConfig.Patch <= 6) {
_config.customizationConfig.isLightOnlyAtNight = true;
_config.mainConfig.isRestoreStopTimeAfterDamageOrLoot = true;
}
if (_config.versionConfig.Patch <= 7) {
_config.customizationConfig.profileName = "";
_config.eventConfigs.Add (new EventConfig {
presetName = "train_xmas_easy", displayName = en ? "Small Christmas train" : "Маленький Новогодний Поезд", isUndergroundTrain = true, eventTime = 3600, stopTime = 300, isAutoStart = true, chance = 0, locomotivePreset = "locomotive_default", wagonsPreset = new List<string> {
"xmas_wagon_1"
}
, heliPreset = ""
}
);
_config.eventConfigs.Add (new EventConfig {
presetName = "train_xmas_medium", displayName = en ? "Medium Christmas train" : "Средний Новогодний Поезд", isUndergroundTrain = true, eventTime = 3600, stopTime = 300, isAutoStart = true, chance = 0, locomotivePreset = "locomotive_turret", wagonsPreset = new List<string> {
"xmas_wagon_1", "xmas_wagon_2"
}
, heliPreset = ""
}
);
_config.eventConfigs.Add (new EventConfig {
presetName = "train_xmas_hard", displayName = en ? "Big Christmas train" : "Большой Новогодний Поезд", isUndergroundTrain = false, eventTime = 3600, stopTime = 300, isAutoStart = true, chance = 0, locomotivePreset = "locomotive_new", wagonsPreset = new List<string> {
"wagon_crate_2", "xmas_wagon_2", "wagon_bradley"
}
, heliPreset = ""
}
);
_config.wagonConfigs.Add (new WagonConfig {
presetName = "xmas_wagon_1", prefabName = "assets/content/vehicles/trains/wagons/trainwagonunloadableloot.entity.prefab", brradleys = new Dictionary<string, HashSet<LocationConfig>>(), crates = new Dictionary<string, HashSet<LocationConfig>> {
["xmas_crate"]
= new HashSet<LocationConfig> {
new LocationConfig {
position = "(-0.148, 2.707, -1.613)", rotation = "(72.214, 0, 0)"
}
// ... [Code preview truncated due to length. Full source in attached file] ...