C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using Newtonsoft.Json;
using CompanionServer.Handlers;
using Oxide.Plugins.ArmoredTrainExtensionMethods;
using UnityEngine;
using System;
using Oxide.Core.Plugins;
using Network;
using Rust;
using System.Collections;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using Time = UnityEngine.Time;
using System.Reflection;
using System.IO;
using static ProtoBuf.PatternFirework;
namespace Oxide.Plugins {
[Info("ArmoredTrain", "Adem", "1.5.1")]
class ArmoredTrain : RustPlugin {
[PluginReference]
Plugin NpcSpawn, PveMode, GUIAnnouncements, DiscordMessages, Economics, ServerRewards, IQEconomic, Friends, Clans;
#region Variables
const bool en = true;
static ArmoredTrain ins;
Coroutine autoEventCoroutine;
Train train;
bool isEventActive = false;
bool underGround = false;
internal List<Transform> railTransformList = new List<Transform>();
HashSet<string> subscribeMethods = new HashSet<string> {
"CanBradleyApcTarget", "OnEntityTakeDamage", "OnButtonPress", "OnTurretTarget", "CanLootEntity", "CanHackCrate", "OnLootEntity", "OnEntityDeath", "OnEntityKill", "OnLootEntity", "OnCorpsePopulate", "OnTrainCarUncouple", "OnEntitySpawned", "CanTrainCarCouple", "CanMountEntity", "OnSamSiteModeToggle", "OnPlayerViolation", "CanBradleySpawnNpc", "OnCustomNpcTarget", "CanPopulateLoot", "CanEntityTakeDamage", "CanEntityBeTargeted", "OnCustomLootContainer", "SetOwnerPveMode", "ClearOwnerPveMode"
}
;
Coroutine startEventCoroutine;
#endregion Variables
#region ExternalAPI
bool IsArmoredTrainActive() => isEventActive;
bool StopArmoredTrain() {
if (!isEventActive) return false;
train.StopTrain(null);
return true;
}
bool StartArmoredTrainEvent() {
if (isEventActive) return false;
StartEvent();
return true;
}
bool EndArmoredTrainEvent() {
if (!isEventActive) return false;
EndEvent();
return true;
}
Vector3 ArmoredTrainLocomotivePosition() {
if (!isEventActive) return Vector3.zero;
return train.locomotive.trainEngine.transform.position;
}
bool IsTrainBradley(ulong netID) {
if (!isEventActive) return false;
return train.IsTrainBradley(netID);
}
bool IsTrainHeli(ulong netID) {
if (!isEventActive) return false;
return train.IsTrainHeli(netID);
}
bool IsTrainCrate(ulong netID) {
if (!isEventActive) return false;
return train.IsTrainCrate(netID);
}
bool IsTrainSamSite(ulong netID) {
if (!isEventActive) return false;
return train.IsTrainSamSite(netID);
}
bool IsTrainWagon(ulong netID) {
if (!isEventActive) return false;
return train.IsTrainWagon(netID);
}
bool IsTrainTurret(ulong netID) {
if (!isEventActive) return false;
return train.IsTrainTurret(netID);
}
#endregion ExternalAPI
#region Hooks
void Init() => Unsubscribes();
void OnServerInitialized() {
ins = this;
LoadDefaultMessages();
UpdateConfig();
WagonCustomizator.LoadCurrentCustomizationProfile();
PostLoadCheck();
if (_config.mainConfig.isAutoEvent) autoEventCoroutine = ServerMgr.Instance.StartCoroutine(AutoEventCorountine());
}
void OnButtonPress(PressButton button, BasePlayer player) {
if (!isEventActive || !button.IsExists() || player == null || button.net == null) return;
if (train.IsTrainButton(button.net.ID.Value)) OnPlayerTryStopTrain(player);
}
object CanPickupEntity(BasePlayer player, PressButton entity) {
if (!isEventActive || !entity.IsExists() || player == null || entity.net == null) return null;
if (train.IsTrainButton(entity.net.ID.Value)) return false;
return null;
}
object OnTrainCarUncouple(TrainCar trainCar, BasePlayer player) {
if (!isEventActive || trainCar == null || player == null || trainCar.net == null) return null;
if (train.IsTrainWagon(trainCar.net.ID.Value)) return true;
return null;
}
object CanTrainCarCouple(TrainCar trainCar1, TrainCar trainCar2) {
if (!isEventActive || _config.mainConfig.allowConnectWagons || !trainCar1.IsExists() || !trainCar2.IsExists() || trainCar1.net == null || trainCar2.net == null) return null;
if (!train.IsTrainWagon(trainCar1.net.ID.Value) && !train.IsTrainWagon(trainCar2.net.ID.Value)) return null;
return false;
}
object CanMountEntity(BasePlayer player, BaseVehicleSeat entity) {
if (!isEventActive || !player.userID.IsSteamId() || entity == null || entity.VehicleParent() == null || entity.VehicleParent().net == null || !train.IsTrainWagon(entity.VehicleParent().net.ID.Value)) return null;
return true;
}
object OnTurretTarget(AutoTurret turret, BaseCombatEntity entity) {
if (!isEventActive || !turret.IsExists() || !entity.IsExists() || turret.net == null) return null;
if (!train.IsTrainTurret(turret.net.ID.Value)) return null;
BasePlayer player = entity as BasePlayer;
if (!player.IsRealPlayer()) return true;
if (!train.IsTrainCanAttack()) return true;
return null;
}
object CanBradleyApcTarget(BradleyAPC apc, BasePlayer player) {
if (!isEventActive || !apc.IsExists() || !player.IsRealPlayer() || apc.net == null) return null;
if (!train.IsTrainBradley(apc.net.ID.Value)) return null;
if (!train.IsTrainCanAttack()) return false;
return null;
}
object CanSamSiteShoot(SamSite samSite) {
if (!isEventActive || samSite == null || samSite.net == null) return null;
if (!train.IsTrainSamSite(samSite.net.ID.Value)) return null;
if (!train.IsTrainCanAttack()) return true;
return null;
}
object OnSamSiteModeToggle(SamSite samSite, BasePlayer player, bool flag) {
if (samSite == null || player == null || samSite.net == null) return null;
if (train.IsTrainSamSite(samSite.net.ID.Value)) return true;
return null;
}
object CanHelicopterTarget(PatrolHelicopterAI heli, BasePlayer player) {
if (!isEventActive || train == null || !heli.helicopterBase.IsExists() || heli.helicopterBase.net == null) return null;
if (!train.IsTrainHeli(heli.helicopterBase.net.ID.Value)) return null;
if (!train.IsTrainCanAttack()) return false;
return null;
}
void OnEntitySpawned(HelicopterDebris entity) {
if (!isEventActive || !entity.IsExists() || entity.transform == null || train == null || train.locomotive == null) return;
if (Vector3.Distance(entity.transform.position, train.locomotive.baseWagonEntity.transform.position) < 20 || train.wagons.Any(x => x != null && x.baseWagonEntity.IsExists() && Vector3.Distance(entity.transform.position, x.baseWagonEntity.transform.position) < 20)) entity.Kill();
}
object OnEntityTakeDamage(ScientistNPC scientistNPC, HitInfo info) {
if (!isEventActive || scientistNPC == null || scientistNPC.net == null) return null;
if (!_config.NPCConfigs.Any(x => x.name == scientistNPC.displayName) && !_config.driverConfigs.Any(x => x.name == scientistNPC.displayName)) return null;
OnTrainAttacked(info.InitiatorPlayer);
if (!_config.mainConfig.allowDriverDamage && train.IsTrainDriver(scientistNPC.net.ID.Value)) return true;
return null;
}
object OnEntityTakeDamage(BradleyAPC bradley, HitInfo info) {
if (!isEventActive || bradley == null || bradley.net == null) return null;
if (!train.IsTrainBradley(bradley.net.ID.Value)) return null;
return train.OnTrainAttacked(info);
}
object OnEntityTakeDamage(AutoTurret autoTurret, HitInfo info) {
if (!isEventActive || autoTurret == null || autoTurret.net == null) return null;
if (!train.IsTrainTurret(autoTurret.net.ID.Value)) return null;
return train.OnTrainAttacked(info);
}
object OnEntityTakeDamage(SamSite samSite, HitInfo info) {
if (!isEventActive || samSite == null || samSite.net == null) return null;
if (!train.IsTrainSamSite(samSite.net.ID.Value)) return null;
return train.OnTrainAttacked(info);
}
object OnEntityTakeDamage(TrainCar trainEngine, HitInfo info) {
if (train == null || trainEngine == null || trainEngine.net == null) return null;
if (!train.IsTrainWagon(trainEngine.net.ID.Value)) return null;
return true;
}
object OnEntityTakeDamage(PressButton pressButton, HitInfo info) {
if (!isEventActive || pressButton == null || pressButton.net == null) return null;
if (train.IsTrainButton(pressButton.net.ID.Value)) return true;
return null;
}
void OnEntityDeath(BradleyAPC entity, HitInfo info) {
if (!isEventActive || entity == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
BaseWagon baseWagon = train.locomotive.bradleys.Any(y => y != null && y.net != null && y.net.ID == entity.net.ID) ? train.locomotive : train.wagons.FirstOrDefault(x => x != null && x.bradleys.Any(y => y != null && y.net != null && y.net.ID == entity.net.ID));
if (baseWagon == null) return;
baseWagon.bradleys.Remove(entity);
EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "Bradley");
}
void OnEntityDeath(ScientistNPC scientistNPC, HitInfo info) {
if (!isEventActive || scientistNPC == null || info == null) return;
if (info.InitiatorPlayer.IsRealPlayer() && _config.NPCConfigs.Any(x => x != null && x.name == scientistNPC.displayName)) EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "Npc");
else if (_config.driverConfigs.Any(x => x != null && x.name == scientistNPC.displayName) && train.IsTrainDriver(scientistNPC.net.ID.Value)) OnPlayerTryStopTrain(info.InitiatorPlayer);
}
void OnEntityDeath(AutoTurret entity, HitInfo info) {
if (!isEventActive || entity == null || info == null || !info.InitiatorPlayer.IsRealPlayer()) return;
BaseWagon baseWagon = train.locomotive.turrets.Any(y => y != null && y.net != null && y.net.ID == entity.net.ID) ? train.locomotive : train.wagons.FirstOrDefault(x => x != null && x.turrets.Any(y => y != null && y.net != null && y.net.ID == entity.net.ID));
if (baseWagon == null) return;
baseWagon.turrets.Remove(entity);
EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "Turret");
}
void OnEntityDeath(PatrolHelicopter entity, HitInfo info) {
if (!isEventActive || entity == null || info == null || !info.InitiatorPlayer.IsRealPlayer() || entity.net == null) return;
if (!train.IsTrainHeli(entity.net.ID.Value)) return;
if (_config.supportedPluginsConfig.economy.enable) EconomyManager.ActionEconomy(info.InitiatorPlayer.userID, "Heli");
}
void OnEntityKill(BasePlayer player) {
if (!isEventActive || !player.IsRealPlayer()) return;
if (ZoneController.IsPlayerInZone(player.userID)) ZoneController.OnPlayerLeaveZone(player);
}
void OnEntityKill(TrainCar trainCar) {
if (!isEventActive || trainCar == null || trainCar.net == null) return;
if (!train.IsTrainWagon(trainCar.net.ID.Value)) return;
train.DiconnectTrain();
}
object CanLootEntity(BasePlayer player, LootContainer container) {
if (!isEventActive || !_config.mainConfig.needStopTrain || player == null || container == null || container.net == null) return null;
if (!train.IsTrainCrate(container.net.ID.Value)) return null;
if (container.transform.position.y - player.transform.position.y > 0.5) return true;
if (train.CanLoot()) return null;
NotifyManager.SendMessageToPlayer(player, "NeedStopTrain", _config.prefix);
return true;
}
object CanLootEntity(BasePlayer player, SamSite samSite) {
if (!isEventActive || samSite == null || samSite.net == null) return null;
if (train.IsTrainSamSite(samSite.net.ID.Value)) return true;
return null;
}
object CanHackCrate(BasePlayer player, HackableLockedCrate crate) {
if (!isEventActive || !_config.mainConfig.needStopTrain || player == null || crate == null || crate.net == null) return null;
BaseWagon crateWagon = train.GetWagonByLockedCrateNetId(crate.net.ID.Value);
if (crateWagon != null) {
if (!train.CanLoot()) {
NotifyManager.SendMessageToPlayer(player, "NeedStopTrain", _config.prefix);
return true;
}
else {
float hackTime = HackableLockedCrate.requiredHackSeconds - crate.hackSeconds;
train.OnLockedCrateStartHack(hackTime);
crateWagon.UpdateLockedCrateTimeWithDelay(crate);
EconomyManager.ActionEconomy(player.userID, "LockedCrate");
}
}
return null;
}
void OnLootEntity(BasePlayer player, LootContainer container) {
if (!isEventActive || player == null || container == null || container.net == null) return;
if (train.IsTrainCrate(container.net.ID.Value)) train.OnTrainCrateOpened(container, player);
}
void OnCorpsePopulate(BasePlayer entity, NPCPlayerCorpse corpse) {
if (!isEventActive || entity == null || corpse == null) return;
if (entity is ScientistNPC) {
NpcConfig npcConfig = _config.NPCConfigs.FirstOrDefault(x => x.name == entity.displayName);
if (npcConfig == null) return;
NextTick(() => {
if (corpse == null) return;
ItemContainer container = corpse.containers[0];
if (npcConfig.typeLootTable == 0) {
for (int i = container.itemList.Count - 1; i >= 0; i--) {
Item item = container.itemList[i];
if (npcConfig.wearItems.Any(x => x.shortName == item.info.shortname)) {
item.RemoveFromContainer();
item.Remove();
}
}
if (npcConfig.deleteCorpse && corpse != null && !corpse.IsDestroyed) corpse.Kill();
return;
}
if (npcConfig.typeLootTable == 2 || npcConfig.typeLootTable == 3) {
if (npcConfig.deleteCorpse && !corpse.IsDestroyed) corpse.Kill();
return;
}
container.ClearItemsContainer();
if (npcConfig.typeLootTable == 1 && npcConfig.lootTable.minAmount > 0) AddToContainerItem(container, npcConfig.lootTable, npcConfig.typeLootTable);
if (npcConfig.deleteCorpse && corpse != null && !corpse.IsDestroyed) corpse.Kill();
}
);
}
}
void Unload() {
EndEvent(true);
if (ins._config.supportedPluginsConfig.pveMode.enable && ins.plugins.Exists("PveMode")) ins.PveMode.Call("EventRemovePveMode", ins.Name, true);
}
object OnPlayerViolation(BasePlayer player, AntiHackType type, float amount) {
if (isEventActive && type == AntiHackType.FlyHack && train.IsPositionNearToTrain(player.transform.position)) return true;
return null;
}
#region OtherPlugins
object CanBradleySpawnNpc(BradleyAPC bradley) {
if (!isEventActive || bradley == null || bradley.net == null) return null;
if (train.IsTrainBradley(bradley.net.ID.Value)) return true;
return null;
}
object OnCustomNpcTarget(ScientistNPC npc, BasePlayer player) {
if (!isEventActive || npc == null) return null;
if (!_config.NPCConfigs.Any(x => x.name == npc.displayName)) return null;
if (!train.IsTrainCanAttack()) return false;
return null;
}
object CanPopulateLoot(ScientistNPC entity, NPCPlayerCorpse corpse) {
if (!isEventActive || entity == null || corpse == null) return null;
NpcConfig npcConfig = _config.NPCConfigs.FirstOrDefault(x => x.name == entity.displayName);
if (npcConfig != null && npcConfig.typeLootTable != 2) return true;
return null;
}
object CanPopulateLoot(LootContainer container) {
if (!isEventActive || container == null) return null;
string cratePresetName = null;
HackableLockedCrate hackableLockedCrate = container as HackableLockedCrate;
if (hackableLockedCrate != null) {
if (train.locomotive.lockedCrates.Any(y => y.Key != null && y.Key.net != null && y.Key.net.ID == container.net.ID)) {
cratePresetName = train.locomotive.lockedCrates[hackableLockedCrate];
}
else {
BaseWagon baseWagon = train.wagons.FirstOrDefault(x => x.lockedCrates.Any(y => y.Key != null && y.Key.net != null && y.Key.net.ID == container.net.ID));
if (baseWagon != null) cratePresetName = baseWagon.lockedCrates[hackableLockedCrate];
}
}
if (train.locomotive.crates.Any(y => y.Key != null && y.Key.net != null && y.Key.net.ID == container.net.ID)) {
cratePresetName = train.locomotive.crates[container];
}
else {
BaseWagon baseWagon = train.wagons.FirstOrDefault(x => x.crates.Any(y => y.Key != null && y.Key.net != null && y.Key.net.ID == container.net.ID));
if (baseWagon != null) cratePresetName = baseWagon.crates[container];
}
CrateConfig crateConfig = _config.crateConfigs.FirstOrDefault(x => x.presetName == cratePresetName);
if (crateConfig != null && crateConfig.typeLootTable != 2) return true;
return null;
}
object CanEntityTakeDamage(BasePlayer victim, HitInfo hitinfo) {
if (!isEventActive || hitinfo == null) return null;
if (victim.IsRealPlayer()) {
BasePlayer attacker = hitinfo.InitiatorPlayer;
if (_config.zoneConfig.isCreateZonePVP && !_config.supportedPluginsConfig.pveMode.enable && attacker.IsRealPlayer()) {
if (ZoneController.IsPlayerInZone(victim.userID) && ZoneController.IsPlayerInZone(attacker.userID)) return true;
}
if (hitinfo.Initiator == null) return null;
AutoTurret autoTurret = hitinfo.Initiator as AutoTurret;
if (autoTurret != null && autoTurret.net != null && train.IsTrainTurret(autoTurret.net.ID.Value)) {
if (!PveModeController.IsPveModeBlockAction(victim)) return true;
else return null;
}
SamSite samSite = hitinfo.Initiator as SamSite;
if (samSite != null && samSite.net != null && train.IsTrainSamSite(samSite.net.ID.Value)) {
if (!PveModeController.IsPveModeBlockAction(victim)) return true;
else return null;
}
return null;
}
return null;
}
object CanEntityTakeDamage(PlayerHelicopter victim, HitInfo hitinfo) {
if (!isEventActive || !victim.IsExists() || hitinfo.Initiator == null) return null;
SamSite samSite = hitinfo.Initiator as SamSite;
if (samSite != null && samSite.net != null && train.IsTrainSamSite(samSite.net.ID.Value)) {
BasePlayer heliDriver = victim.GetDriver();
if (heliDriver != null && !PveModeController.IsPveModeBlockAction(heliDriver)) return true;
else return null;
}
return null;
}
object CanEntityTakeDamage(AutoTurret autoTurret, HitInfo hitinfo) {
if (!isEventActive || autoTurret == null || autoTurret.net == null) return null;
if (train.IsTrainTurret(autoTurret.net.ID.Value)) {
if (!hitinfo.InitiatorPlayer.IsRealPlayer()) return false;
train.OnTrainAttacked(hitinfo);
if (hitinfo.InitiatorPlayer != null && !PveModeController.IsPveModeBlockAction(hitinfo.InitiatorPlayer)) return true;
else return null;
}
return null;
}
object CanEntityTakeDamage(SamSite samSite, HitInfo hitinfo) {
if (!isEventActive || samSite == null || samSite.net == null) return null;
if (train.IsTrainSamSite(samSite.net.ID.Value)) {
if (!hitinfo.InitiatorPlayer.IsRealPlayer()) return false;
train.OnTrainAttacked(hitinfo);
if (hitinfo.InitiatorPlayer != null && !PveModeController.IsPveModeBlockAction(hitinfo.InitiatorPlayer)) return true;
else return null;
}
return null;
}
object CanEntityBeTargeted(BasePlayer player, AutoTurret turret) {
if (!isEventActive || train == null || !turret.IsExists() || !player.IsExists() || turret.net == null || turret.net.ID == null) return null;
if (train.IsTrainTurret(turret.net.ID.Value)) {
if (!player.IsRealPlayer()) return false;
if (!train.IsTrainCanAttack()) return false;
if (player != null && !PveModeController.IsPveModeBlockAction(player)) return true;
else return null;
}
return null;
}
object CanEntityBeTargeted(PlayerHelicopter entity, SamSite samSite) {
if (!isEventActive || samSite == null || samSite.net == null) return null;
if (train.IsTrainSamSite(samSite.net.ID.Value)) {
BasePlayer heliDriver = entity.GetDriver();
if (heliDriver != null && !PveModeController.IsPveModeBlockAction(heliDriver)) return true;
else return null;
}
return null;
}
object OnCustomLootContainer(NetworkableId netID) {
if (!isEventActive || netID == null) return null;
LootContainer lootContainer;
lootContainer = train.locomotive.lockedCrates.Keys.FirstOrDefault(y => y != null && y.net.ID.Value == netID.Value);
if (lootContainer != null) {
BaseWagon baseWagon = train.wagons.FirstOrDefault(x => x.lockedCrates.Any(y => y.Key != null && y.Key.net.ID.Value == netID.Value));
if (baseWagon != null) lootContainer = lootContainer = baseWagon.lockedCrates.Keys.FirstOrDefault(x => x != null && x.net.ID.Value == netID.Value);
if (lootContainer == null) {
if (lootContainer == null) lootContainer = train.locomotive.crates.Keys.FirstOrDefault(y => y != null && y.net.ID.Value == netID.Value);
if (lootContainer == null) {
BaseWagon baseWagon1 = train.wagons.FirstOrDefault(x => x.crates.Any(y => y.Key != null && y.Key.net.ID.Value == netID.Value));
if (baseWagon1 != null) lootContainer = lootContainer = baseWagon1.crates.Keys.FirstOrDefault(x => x != null && x.net.ID.Value == netID.Value);
}
}
}
return CanPopulateLoot(lootContainer);
}
void SetOwnerPveMode(string eventName, BasePlayer owner) {
if (eventName == Name) PveModeController.SetPveModeOwner(owner);
}
void ClearOwnerPveMode(string eventName) {
if (eventName == Name) PveModeController.ClearPveModeOwner();
}
#endregion OtherPlugins
#endregion Hooks
#region Commands
[ChatCommand("atrainstart")]
void ChatStartCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (isEventActive) {
NotifyManager.SendMessageToPlayer(player, "EventActive", _config.prefix);
return;
}
if (arg != null && arg.Length >= 1) StartEvent(arg[0], player);
else StartEvent("", player);
}
[ChatCommand("atrainstartunderground")]
void ChatStarttUndergroundCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (isEventActive) {
NotifyManager.SendMessageToPlayer(player, "EventActive", _config.prefix);
return;
}
if (arg != null && arg.Length >= 1) StartEvent(arg[0], player, 100);
else StartEvent("", player, 100);
}
[ChatCommand("atrainstartaboveground")]
void ChatStarttAbovegroundCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (isEventActive) {
NotifyManager.SendMessageToPlayer(player, "EventActive", _config.prefix);
return;
}
if (arg != null && arg.Length >= 1) StartEvent(arg[0], player, 0);
else StartEvent("", player, 0);
}
[ChatCommand("atrainstop")]
void ChatStopCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (isEventActive) EndEvent();
}
[ConsoleCommand("atrainstart")]
void ConsoleStartCommand(ConsoleSystem.Arg arg) {
if (arg.Player() != null) return;
if (arg.Args != null && arg.Args.Length > 0) StartEvent(arg.Args[0]);
StartEvent();
Puts(_config.prefix + " Event activated");
}
[ConsoleCommand("atrainstartunderground")]
void ConsoleStartUndergroundCommand(ConsoleSystem.Arg arg) {
if (arg.Player() != null) return;
if (arg.Args != null && arg.Args.Length > 0) StartEvent(arg.Args[0]);
StartEvent(underGroundChance : 100);
Puts(_config.prefix + " Event activated");
}
[ConsoleCommand("atrainstartaboveground")]
void ConsoleStartAbovegroundCommand(ConsoleSystem.Arg arg) {
if (arg.Player() != null) return;
if (arg.Args != null && arg.Args.Length > 0) StartEvent(arg.Args[0]);
StartEvent(underGroundChance : 0);
Puts(_config.prefix + " Event activated");
}
[ConsoleCommand("atrainstop")]
void ConsoleStopCommand(ConsoleSystem.Arg arg) {
if (arg.Player() == null && isEventActive) EndEvent();
}
[ChatCommand("atrainpoint")]
void SpawnPointCommand(BasePlayer player, string command, string[] arg) {
if (!player.IsAdmin) return;
if (CheckRailsInPosition(player.transform.position)) {
_config.mainConfig.customSpawnPoints.Add(player.transform.position.ToString());
PrintToChat(player, _config.prefix + " New spawn point <color=#738d43>successfully</color> added");
SaveConfig();
return;
}
PrintToChat(player, _config.prefix + " <color=#ce3f27>Couldn't</color> find the rails");
}
[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 Actions
void OnPlayerTryStopTrain(BasePlayer player) {
train.StopTrain(player);
train.BecomeAgressive(player);
}
void OnTrainAttacked(BasePlayer attacker) {
train.BecomeAgressive(attacker);
if (_config.mainConfig.stopTrainAfterReceivingDamage) OnPlayerTryStopTrain(attacker);
}
#endregion Actions
#region Methods
void UpdateConfig() {
if (_config.versionConfig == Version) return;
if (_config.versionConfig.Minor == 0) {
if (_config.versionConfig.Patch <= 1) {
_config.mainConfig.customSpawnPoints = new List<string>();
_config.mainConfig.isUnderGround = true;
}
if (_config.versionConfig.Patch <= 3) {
foreach (NpcConfig npcConfig in _config.NPCConfigs) {
npcConfig.kit = "";
foreach (NpcBelt npcBelt in npcConfig.beltItems) npcBelt.Mods = new HashSet<string>();
}
}
if (_config.versionConfig.Patch <= 5) {
_config.driverConfigs = new HashSet<DriverConfig> {
new DriverConfig {
name = "Train_Driver_1", health = 200f, wearItems = new List<NpcWear> {
new NpcWear {
shortName = "metal.plate.torso", skinID = 1988476232
}
, new NpcWear {
shortName = "riot.helmet", skinID = 1988478091
}
, new NpcWear {
shortName = "pants", skinID = 1582399729
}
, new NpcWear {
shortName = "tshirt", skinID = 1582403431
}
, new NpcWear {
shortName = "shoes.boots", skinID = 0
}
}
, kit = ""
}
}
;
foreach (LocomotiveConfig locomotiveConfig in _config.locomotiveConfigs) locomotiveConfig.driverName = "Train_Driver_1";
}
if (_config.versionConfig.Patch <= 6) {
_config.samsiteConfigs = new HashSet<SamSiteConfig> {
new SamSiteConfig {
presetName = "samsite_default", hp = 1000f, countAmmo = 100
}
}
;
foreach (BaseWagonConfig baseWagonConfig in _config.wagonConfigs) {
if (baseWagonConfig.prefabName == "assets/content/vehicles/trains/wagons/trainwagonc.entity.prefab") {
baseWagonConfig.samsites = new Dictionary<string, HashSet<LocationConfig>> {
["samsite_default"]
= new HashSet<LocationConfig> {
new LocationConfig {
position = "(0, 4.216, 0)", rotation = "(0, 180, 0)"
}
}
}
;
}
else baseWagonConfig.samsites = new Dictionary<string, HashSet<LocationConfig>>();
}
foreach (BaseWagonConfig baseWagonConfig in _config.locomotiveConfigs) {
baseWagonConfig.samsites = new Dictionary<string, HashSet<LocationConfig>>();
}
}
if (_config.versionConfig.Patch <= 7) {
foreach (NpcConfig npcConfig in _config.NPCConfigs) {
npcConfig.turretDamageScale = 1;
}
}
_config.versionConfig = new VersionNumber(1, 1, 0);
foreach (BaseWagonConfig locomotiveConfig in _config.wagonConfigs) {
if (locomotiveConfig.prefabName == "assets/content/vehicles/train/trainwagond.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/train/trainwagonc.entity.prefab";
else if (locomotiveConfig.prefabName == "assets/content/vehicles/train/trainwagonb.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/train/trainwagonb.entity.prefab";
else if (locomotiveConfig.prefabName == "assets/content/vehicles/train/trainwagonc.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/train/trainwagonunloadablefuel.entity.prefab";
}
}
if (_config.versionConfig.Minor == 1) {
if (_config.versionConfig.Patch < 3) {
foreach (BaseWagonConfig locomotiveConfig in _config.wagonConfigs) {
if (locomotiveConfig.prefabName == "assets/content/vehicles/train/trainwagond.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/train/trainwagonc.entity.prefab";
else if (locomotiveConfig.prefabName == "assets/content/vehicles/train/trainwagonb.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/train/trainwagonb.entity.prefab";
else if (locomotiveConfig.prefabName == "assets/content/vehicles/train/trainwagonc.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/train/trainwagonunloadablefuel.entity.prefab";
}
}
if (_config.versionConfig.Patch < 4) {
_config.locomotiveConfigs.Add(new LocomotiveConfig {
presetName = "locomotive_new", prefabName = "assets/content/vehicles/locomotive/locomotive.entity.prefab", engineForce = 500000f, maxSpeed = 14, driverName = "Train_Driver_1", brradleys = new Dictionary<string, HashSet<LocationConfig>> {
}
, turrets = new Dictionary<string, HashSet<LocationConfig>> {
["turret_m249"]
= new HashSet<LocationConfig> {
new LocationConfig {
position = "(-0.554, 1.546, -8.849)", rotation = "(0, 180, 0)"
}
, new LocationConfig {
position = "(0.554, 1.546, -8.849)", rotation = "(0, 180, 0)"
}
}
}
, NPCs = new Dictionary<string, HashSet<LocationConfig>> {
["TrainNPC"]
= new HashSet<LocationConfig> {
new LocationConfig {
position = "(-1.341, 1.546, 2)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(-1.341, 1.546, 0)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(-1.341, 1.546, -2)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(-1.341, 1.546, -4)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(-1.341, 1.546, -6)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(-1.341, 1.546, -8)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, 2)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, 0)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, -2)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, -4)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, -6)", rotation = "(0, 0, 0)"
}
, new LocationConfig {
position = "(1.341, 1.546, -8)", rotation = "(0, 0, 0)"
}
}
}
, crates = new Dictionary<string, HashSet<LocationConfig>> {
}
, samsites = new Dictionary<string, HashSet<LocationConfig>> {
}
, decors = new Dictionary<string, HashSet<LocationConfig>> {
}
}
);
_config.trainConfigs.Add(new TrainConfig {
presetName = "train_hard_new", trainName = "Giant Train", isUndergroundTrain = false, eventTime = 3600, stopTime = 120, automaticStart = false, chance = 20, locomotivePreset = "locomotive_new", wagonsPreset = new List<string> {
"wagon_bradley", "wagon_crate_2", "wagon_bradley", "wagon_samsite"
}
, heliPreset = "heli_1"
}
);
}
if (_config.versionConfig.Patch < 5) {
foreach (BaseWagonConfig wagonConfig in _config.wagonConfigs) {
if (wagonConfig.presetName == "wagon_crate_1") {
wagonConfig.prefabName = "assets/content/vehicles/train/trainwagonc.entity.prefab";
}
}
}
if (_config.versionConfig.Patch < 9) {
foreach (LocomotiveConfig locomotiveConfig in _config.locomotiveConfigs) {
if (locomotiveConfig.prefabName == "assets/content/vehicles/workcart/workcart_aboveground.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/trains/workcart/workcart_aboveground.entity.prefab";
else if (locomotiveConfig.prefabName == "assets/content/vehicles/workcart/workcart_aboveground2.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/trains/workcart/workcart_aboveground2.entity.prefab";
else if (locomotiveConfig.prefabName == "assets/content/vehicles/locomotive/locomotive.entity.prefab") locomotiveConfig.prefabName = "assets/content/vehicles/trains/locomotive/locomotive.entity.prefab";
}
foreach (BaseWagonConfig baseWagonConfig in _config.wagonConfigs) {
if (baseWagonConfig.prefabName == "assets/content/vehicles/train/trainwagona.entity.prefab") baseWagonConfig.prefabName = "assets/content/vehicles/trains/wagons/trainwagona.entity.prefab";
else if (baseWagonConfig.prefabName == "assets/content/vehicles/train/trainwagonb.entity.prefab") baseWagonConfig.prefabName = "assets/content/vehicles/trains/wagons/trainwagonb.entity.prefab";
else if (baseWagonConfig.prefabName == "assets/content/vehicles/train/trainwagonc.entity.prefab") baseWagonConfig.prefabName = "assets/content/vehicles/trains/wagons/trainwagonc.entity.prefab";
else if (baseWagonConfig.prefabName == "assets/content/vehicles/train/trainwagonunloadable.entity.prefab") baseWagonConfig.prefabName = "assets/content/vehicles/trains/wagons/trainwagonunloadable.entity.prefab";
else if (baseWagonConfig.prefabName == "assets/content/vehicles/train/trainwagonunloadablefuel.entity.prefab") baseWagonConfig.prefabName = "assets/content/vehicles/trains/wagons/trainwagonunloadablefuel.entity.prefab";
else if (baseWagonConfig.prefabName == "assets/content/vehicles/train/trainwagonunloadableloot.entity.prefab") baseWagonConfig.prefabName = "assets/content/vehicles/trains/wagons/trainwagonunloadableloot.entity.prefab";
}
}
if (_config.versionConfig.Patch == 9) {
_config.wagonConfigs.Add(new BaseWagonConfig {
presetName = "caboose_wagon", prefabName = "assets/content/vehicles/trains/caboose/traincaboose.entity.prefab", brradleys = new Dictionary<string, HashSet<LocationConfig>>(), crates = new Dictionary<string, HashSet<LocationConfig>>(), samsites = new Dictionary<string, HashSet<LocationConfig>>(), decors = new Dictionary<string, HashSet<LocationConfig>>(), NPCs = new Dictionary<string, HashSet<LocationConfig>>(), turrets = new Dictionary<string, HashSet<LocationConfig>>()
}
);
_config.trainConfigs.Add(new TrainConfig {
presetName = "train_caboose", trainName = "Caboose", isUndergroundTrain = false, eventTime = 3600, stopTime = 0, automaticStart = false, chance = 20, locomotivePreset = _config.locomotiveConfigs.FirstOrDefault(x => true).presetName, wagonsPreset = new List<string> {
"caboose_wagon"
}
, heliPreset = ""
}
);
}
_config.versionConfig = new VersionNumber(1, 2, 0);
}
if (_config.versionConfig.Minor == 2) {
if (_config.versionConfig.Patch <= 4) {
_config.mainConfig.selfDestructionConfig = new SelfDestructionConfig {
enable = true, beepingTime = 10
}
;
}
_config.versionConfig = new VersionNumber(1, 3, 0);
}
if (_config.versionConfig.Minor == 3) {
if (_config.versionConfig.Patch <= 5) {
_config.markerConfig.useShopMarker = true;
_config.markerConfig.useRingMarker = true;
}
if (_config.versionConfig.Patch <= 6) {
foreach (HeliConfig heliConfig in _config.heliConfigs) heliConfig.outsideTime = 30;
}
if (_config.versionConfig.Patch <= 7) {
foreach (DriverConfig driverConfig in _config.driverConfigs) driverConfig.turretDamageScale = 0.5f;
}
_config.versionConfig = new VersionNumber(1, 4, 0);
}
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", typeLootTable = 0, crateUnlockTime = 0, ownLootTable = new LootTableConfig {
minAmount = 1, maxAmount = 2, itemsConfig = new List<ItemConfig> {
new ItemConfig {
shortName = "scrap", minAmount = 100, maxAmount = 200, chance = 100f, isBluePrint = false, skinID = 0, name = ""
}
}
}
}
;
CrateConfig crateNormal2Config = new CrateConfig {
presetName = "crate_normal2_default", prefab = "assets/bundled/prefabs/radtown/crate_normal_2.prefab", typeLootTable = 0, crateUnlockTime = 0, ownLootTable = new LootTableConfig {
minAmount = 1, maxAmount = 2, itemsConfig = new List<ItemConfig> {
new ItemConfig {
shortName = "scrap", minAmount = 100, maxAmount = 200, chance = 100f, isBluePrint = false, skinID = 0, name = ""
}
}
}
}
;
_config.crateConfigs.Add(crateNormalConfig);
_config.crateConfigs.Add(crateNormal2Config);
TurretConfig turretConfig = _config.turretConfigs.FirstOrDefault(x => true);
BaseWagonConfig halloweenWagoConfig = new BaseWagonConfig {
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 Diction
// ... [Code preview truncated due to length. Full source in attached file] ...