C#:
using Rust;
using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Core.Configuration;
using Facepunch;
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins {
[Info("Trains", "Colon Blow", "1.0.5")]
class Trains : CovalencePlugin {
#region Load
[PluginReference]
Plugin TrainsE1;
const string permAdmin = "trains.admin";
const string permConductor = "trains.conductor";
List<ulong> playersInTrackMode = new List<ulong>();
List<BaseEntity> trackEditMarkers = new List<BaseEntity>();
private void OnServerInitialized() {
permission.RegisterPermission(permConductor, this);
permission.RegisterPermission(permAdmin, this);
LoadDataFile();
timer.In(5, RespawnAllTrains);
}
#endregion
#region Configuration
private static PluginConfig config;
private class PluginConfig {
public TrainSettings trainSettings {
get;
set;
}
public class TrainSettings {
[JsonProperty(PropertyName = "Data File Setting : Use Data File named : ")]
public string saveInfoName {
get;
set;
}
[JsonProperty(PropertyName = "Global Setting - Enable Event Train ? ")]
public bool enableEventTrain {
get;
set;
}
[JsonProperty(PropertyName = "Global Setting - Destroy things in trains way ?")]
public bool damageOnCollision {
get;
set;
}
[JsonProperty(PropertyName = "Global Setting - Eject Sleepers from train ?")]
public bool ejectSleepers {
get;
set;
}
[JsonProperty(PropertyName = "Global Setting - Trains speeds up and down depending on angle ? ")]
public bool useAngleSpeed {
get;
set;
}
[JsonProperty(PropertyName = "Editor - seconds to show current selected tracks waypoint number above waypoint when toggled (1k or more waypoints recommend 5 or less) ")]
public float timeShowText {
get;
set;
}
[JsonProperty(PropertyName = "Editor - seconds to show current selected tracks lines betweet waypoints (1k or more waypoints recommend 5 or less) ")]
public float timeShowLines {
get;
set;
}
[JsonProperty(PropertyName = "Editor - seconds to show current selected tracks stop number above stop when toggled ")]
public float timeShowStops {
get;
set;
}
[JsonProperty(PropertyName = "Custom Prefab - Prefab string for Train Type 5 (default is rowboat) ")]
public string customPrefabStr {
get;
set;
}
}
public static PluginConfig DefaultConfig() => new PluginConfig() {
trainSettings = new PluginConfig.TrainSettings {
saveInfoName = "Trains", enableEventTrain = true, damageOnCollision = true, ejectSleepers = true, useAngleSpeed = true, timeShowText = 15f, timeShowLines = 15f, timeShowStops = 15f, customPrefabStr = "assets/content/vehicles/boats/rowboat/rowboat.prefab",
}
}
;
}
protected override void LoadDefaultConfig() {
PrintWarning("New configuration file created!!");
config = PluginConfig.DefaultConfig();
}
protected override void LoadConfig() {
base.LoadConfig();
config = Config.ReadObject<PluginConfig>();
SaveConfig();
}
protected override void SaveConfig() {
Config.WriteObject(config);
}
#endregion
#region Localization
protected override void LoadDefaultMessages() {
lang.RegisterMessages(new Dictionary<string, string> {
["NotAuthorized"]
= "You are NOT Authorized to do that !!", ["ClearedData"] = "You have removed all saved tracks !!", ["TrackModeEnabled1"] = "Track Mode enabled.", ["TrackModeEnabled2"] = "Track Mode enabled and showing markers for track ", ["TrackModeDisabled"] = "Track Mode disable.", ["UnknownTrack"] = "The selected Track does not exist !!", ["KnownTrack"] = "The selected Track already exists, please use another name !!", ["SelectTrack"] = "You need to select Track to edit !!", ["CreatedTrack"] = "You createed new track ", ["RemovedTrack"] = "You removed track ", ["ShowMarkers"] = "Now showing all Track Markers", ["HideMarkers"] = "Now hiding all track Markers", ["ToggledMiddleMouse"] = "Middle Mouse Button Toggled to allow adding waypoints to selected Track.", ["UnToggledMiddleMouse"] = "Middle Mouse Button Toggled to allow adding waypoints to selected Track.", ["UnknownCommand"] = "You must specify a secondary commmand !!", ["UnknownWaypoint"] = "You must specify a secondary commmand !!", ["MarkedWaypoint"] = "You Marked a new waypoint location for ", ["DeletedWaypoint"] = "You Have Removed the Last Waypoint in Current Track list ", ["MarkedStoppoint"] = "You Marked a new stop location for ", ["DeletedStoppoint"] = "You Have Removed the Last Stop Point in Current Track list ", ["ChangedTrainType"] = "You have changed current tracks train type.", ["ChangedLooping"] = "You have changed whether current track loops or not.", ["NotEditMode"] = "You must NOT be in track edit mode to do that !!", ["EditMode"] = "You must be in edit mode to do that !!"
}
, this);
}
#endregion
#region Data
static StoredData storedData = new StoredData();
DynamicConfigFile dataFile;
public class StoredData {
public Dictionary<string, TrainTrackData> trainTrackData = new Dictionary<string, TrainTrackData>();
public class TrainTrackData {
public int trainType;
public bool looping;
public bool autospawn;
public bool autostart;
public float maxSpeed;
public float stopWaitTime;
public List<Vector3> trackMarkers = new List<Vector3>();
public List<Vector3> trainStops = new List<Vector3>();
public TrainTrackData() {
}
}
public StoredData() {
}
}
private void LoadDataFile() {
dataFile = Interface.Oxide.DataFileSystem.GetFile("Trains/" + config.trainSettings.saveInfoName);
try {
storedData = dataFile.ReadObject<StoredData>();
}
catch {
}
if (storedData == null) storedData = new StoredData();
}
private void SaveData() {
if (dataFile != null && storedData != null) {
dataFile.WriteObject(storedData);
}
}
private void OnServerSave() {
if (storedData.trainTrackData.Count == 0) return;
SaveData();
}
#endregion
#region Commands
[Command("train")]
private void cmdTrainHelp(IPlayer player, string command) {
if (!player.HasPermission(permAdmin)) return;
StringBuilder newHelpString = new StringBuilder();
newHelpString.Append("<color=orange>/trackmode </color> - turns on train track edit mode on/off.(remove active trains)\n");
newHelpString.Append("<color=orange>/track.create </color><color=green>trackname</color> - creates specified track.\n");
newHelpString.Append("<color=orange>/track.remove </color> - removes selected track while in edit mode.\n");
newHelpString.Append("<color=orange>/track.edit </color><color=green>trackname</color> - changed current track in edit mode.\n");
newHelpString.Append("<color=orange>/track.traintype </color> - changes train type of selected track while in edit mode.\n");
newHelpString.Append("<color=orange>/track.trainloop </color> - changes train looping or not of selected track while in edit mode.\n");
newHelpString.Append("<color=orange>/track.showlines </color> - toggles visual waypoint lines on and off for all tracks.\n");
newHelpString.Append("<color=orange>/track.showtext </color> - toggles visual waypoint text on and off for all tracks.\n");
newHelpString.Append("<color=orange>/track.mark </color> - use to mark current player position as next waypoint for selected track in edit mode.\n");
newHelpString.Append("<color=orange>/track.markstop </color> - use to mark current player position as next stop point for selected track in edit mode.\n");
newHelpString.Append("<color=orange>/track.deletelastmark </color> - deletes the last waypoint position marked of selected track in edit mode.\n");
newHelpString.Append("<color=orange>/track.deletelaststop </color> - deletes the last stop position marked of selected track in edit mode.\n");
newHelpString.Append("<color=orange>/train.eraseall</color> - removes all waypoints and stops from databases.\n");
newHelpString.Append("<color=orange>/train.spawn </color><color=green>trackname</color> - spawns train on specifed track.\n");
newHelpString.Append("<color=orange>/train.setconfig </color><color=green>config_name</color> - sets config to that name, creates a new blank config if it doesnt exist\n");
player.Reply(newHelpString.ToString());
}
[Command("trackmode")]
private void cmdTrackEnable(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasGui = basePlayer.GetComponent<TrackEditGUI>();
if (hasGui) hasGui.OnDestroy();
playersInTrackMode.Remove(basePlayer.userID);
player.Message(lang.GetMessage("TrackModeDisabled", this, player.Id));
RespawnAllTrains();
return;
}
else {
playersInTrackMode.Add(basePlayer.userID);
DestroyAll<TrainEntity>();
var addEditor = basePlayer.gameObject.AddComponent<TrackEditGUI>();
string trackName = string.Join(" ", addEditor.trackstring).ToLower();
if (storedData.trainTrackData.Any()) {
trackName = storedData.trainTrackData.First().Key;
}
addEditor.RefreshTrackList(basePlayer, trackName);
player.Message(lang.GetMessage("TrackModeEnabled1", this, player.Id));
}
}
[Command("track.create")]
private void cmdTrackCreate(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
if (args.Length > 0) {
string trackName = args[0].ToLower();
if (!storedData.trainTrackData.ContainsKey(trackName)) {
storedData.trainTrackData.Add(args[0].ToLower(), new StoredData.TrainTrackData {
trainType = 1, looping = false, autospawn = true, autostart = true, maxSpeed = 10f, stopWaitTime = 10f, trackMarkers = new List<Vector3>(), trainStops = new List<Vector3>()
}
);
SaveData();
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
else player.Message(lang.GetMessage("KnownTrack", this, player.Id));
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.remove")]
private void cmdTrackRemove(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
if (args.Length > 0) {
string trackName = string.Join(" ", args).ToLower();
CuiHelper.DestroyUi(basePlayer, trackName);
if (storedData.trainTrackData.ContainsKey(trackName)) {
storedData.trainTrackData.Remove(trackName);
SaveData();
player.Message(lang.GetMessage("RemovedTrack", this, player.Id) + trackName);
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
hasEditor.trackstring = trackName;
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.edit")]
private void cmdTrackEdit(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
if (args.Length > 0) {
string trackName = string.Join(" ", args).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.traintype")]
private void cmdTrackTrainType(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
int traintype = storedData.trainTrackData[trackName].trainType;
if (traintype == 1) traintype = 2;
else if (traintype == 2) traintype = 3;
else if (traintype == 3) traintype = 4;
else if (traintype == 4) traintype = 5;
else if (traintype >= 5) traintype = 1;
storedData.trainTrackData[trackName].trainType = traintype;
SaveData();
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.trainloop")]
private void cmdTrackTrainLoop(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
bool looping = storedData.trainTrackData[trackName].looping;
looping = !looping;
storedData.trainTrackData[trackName].looping = looping;
SaveData();
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.autospawn")]
private void cmdTrackAutoSpawn(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
bool autospawn = storedData.trainTrackData[trackName].autospawn;
autospawn = !autospawn;
storedData.trainTrackData[trackName].autospawn = autospawn;
SaveData();
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.autostart")]
private void cmdTrackAutoStart(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
bool autostart = storedData.trainTrackData[trackName].autostart;
autostart = !autostart;
storedData.trainTrackData[trackName].autostart = autostart;
SaveData();
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.maxspeed")]
private void cmdTrackMaxSpeed(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
float maxTrainSpeed = storedData.trainTrackData[trackName].maxSpeed;
maxTrainSpeed += 2f;
if (maxTrainSpeed > 20f) maxTrainSpeed = 2f;
storedData.trainTrackData[trackName].maxSpeed = maxTrainSpeed;
SaveData();
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.waittime")]
private void cmdTrackWaitTime(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
float trainWaitTime = storedData.trainTrackData[trackName].stopWaitTime;
trainWaitTime += 5f;
if (trainWaitTime > 60f) trainWaitTime = 5f;
storedData.trainTrackData[trackName].stopWaitTime = trainWaitTime;
SaveData();
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.showlines")]
private void cmdTrackShowLines(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID) && basePlayer.net?.connection?.authLevel >= 1) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
hasEditor.enableShowLines = !hasEditor.enableShowLines;
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
}
[Command("track.showtext")]
private void cmdTrackShowText(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID) && basePlayer.net?.connection?.authLevel >= 1) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
hasEditor.enableShowText = !hasEditor.enableShowText;
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
}
[Command("track.showstops")]
private void cmdTrackShowStops(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID) && basePlayer.net?.connection?.authLevel >= 1) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
hasEditor.enableShowStops = !hasEditor.enableShowStops;
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
}
[Command("track.enablemiddle")]
private void cmdTrackEnableMiddle(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
hasEditor.enableMiddleMouse = !hasEditor.enableMiddleMouse;
hasEditor.RefreshTrackList(basePlayer, trackName);
if (hasEditor.enableMiddleMouse) player.Message(lang.GetMessage("ToggledMiddleMouse", this, player.Id));
else player.Message(lang.GetMessage("UnToggledMiddleMouse", this, player.Id));
}
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("track.mark")]
private void cmdTrackMarkWaypoint(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
storedData.trainTrackData[trackName].trackMarkers.Add(basePlayer.transform.position);
SaveData();
player.Message(lang.GetMessage("MarkedWaypoint", this, player.Id) + trackName);
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
[Command("track.markstop")]
private void cmdTrackMarkStop(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName)) {
storedData.trainTrackData[trackName].trainStops.Add(basePlayer.transform.position);
SaveData();
player.Message(lang.GetMessage("MarkedStoppoint", this, player.Id) + trackName);
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
[Command("track.deletelastmark")]
private void cmdTrackDeleteLastMark(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName) && storedData.trainTrackData[trackName].trackMarkers.Count > 0) {
Vector3 lastpos = storedData.trainTrackData[trackName].trackMarkers.Last();
if (lastpos != null) {
storedData.trainTrackData[trackName].trackMarkers.Remove(lastpos);
SaveData();
player.Message(lang.GetMessage("DeletedWaypoint", this, player.Id) + trackName);
}
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
[Command("track.deletelaststop")]
private void cmdTrackDeleteLastStop(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
string trackName = string.Join(" ", hasEditor.trackstring).ToLower();
if (storedData.trainTrackData.ContainsKey(trackName) && storedData.trainTrackData[trackName].trainStops.Count > 0) {
Vector3 lastpos = storedData.trainTrackData[trackName].trainStops.Last();
if (lastpos != null) {
storedData.trainTrackData[trackName].trainStops.Remove(lastpos);
SaveData();
player.Message(lang.GetMessage("DeletedStoppoint", this, player.Id) + trackName);
}
hasEditor.RefreshTrackList(basePlayer, trackName);
}
}
}
[Command("track.eraseall")]
private void cmdTrackEraseAll(IPlayer player, string command) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (playersInTrackMode.Contains(basePlayer.userID)) {
storedData.trainTrackData.Clear();
SaveData();
player.Message(lang.GetMessage("ClearData", this, player.Id));
RefeshPlayerGUI(basePlayer);
}
else player.Message(lang.GetMessage("EditMode", this, player.Id));
}
[Command("train.setconfig")]
private void cmdTrainsSetConfig(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
var basePlayer = player.Object as BasePlayer;
if (!playersInTrackMode.Contains(basePlayer.userID)) {
if (args.Length > 0) {
DestroyAll<TrainEntity>();
string configName = args[0].ToString();
config.trainSettings.saveInfoName = configName;
SaveConfig();
SaveData();
LoadDataFile();
LoadConfig();
timer.Once(2f, () => RespawnAllTrains());
player.Message(lang.GetMessage("<color=yellow>Created new Data File called : </color> ", this, player.Id) + configName);
}
}
else player.Message(lang.GetMessage("NotEditMode", this, player.Id));
}
[Command("train.spawn")]
private void cmdTrainSpawnTrain(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
if (args != null && args.Length > 0) {
if (storedData.trainTrackData.ContainsKey(args[0].ToLower())) {
AddTrainEntityToTrack(args[0].ToLower());
SaveData();
}
else player.Message(lang.GetMessage("UnknownTrack", this, player.Id));
}
}
[Command("train.spawnevent1")]
private void cmdTrainSpawnTrainEvent1(IPlayer player, string command, string[] args) {
if (!player.HasPermission(permAdmin)) return;
if (TrainsE1 == null) return;
if (args != null && args.Length > 0) {
if (storedData.trainTrackData.ContainsKey(args[0].ToLower())) {
TrainsE1?.Call("SpawnEventTrain", storedData.trainTrackData[args[0].ToLower()].trackMarkers, storedData.trainTrackData[args[0].ToLower()].trainStops);
}
else player.Message(lang.GetMessage("UnknownTrack", this, player.Id));
}
}
#endregion
#region Hooks
private void RefeshPlayerGUI(BasePlayer basePlayer) {
var hasEditGUI = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditGUI) hasEditGUI.OnDestroy();
basePlayer.gameObject.AddComponent<TrackEditGUI>();
}
private void AddTrainEntityToTrack(string listname) {
if (storedData.trainTrackData[listname].trackMarkers.ElementAtOrDefault(0) == null) return;
Vector3 position = storedData.trainTrackData[listname].trackMarkers.ElementAtOrDefault(0);
string strPrefab = "assets/prefabs/visualization/sphere.prefab";
BaseEntity sphereEntity = GameManager.server.CreateEntity(strPrefab, position, Quaternion.identity, true);
SphereEntity ball = sphereEntity.GetComponent<SphereEntity>();
ball.lerpRadius = 1f;
ball.lerpSpeed = 100f;
StabilityEntity getStab = sphereEntity.GetComponent<StabilityEntity>();
if (getStab) getStab.grounded = true;
sphereEntity.Spawn();
TrainEntity addTrainEntity = sphereEntity.gameObject.AddComponent<TrainEntity>();
addTrainEntity.SpawnTrain(listname);
}
private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo) {
if (entity == null || hitInfo == null || entity is BasePlayer) return;
var istrain = entity.GetComponentInParent<TrainEntity>();
if (istrain) {
hitInfo.damageTypes.ScaleAll(0);
}
}
private object OnStructureRotate(BaseCombatEntity entity, BasePlayer player) {
var istrain = entity.GetComponentInParent<TrainEntity>();
if (istrain) return false;
return null;
}
private object OnStructureUpgrade(BaseCombatEntity entity, BasePlayer player, BuildingGrade.Enum grade) {
var istrain = entity.GetComponentInParent<TrainEntity>();
if (istrain) return false;
return null;
}
private object OnEntityGroundMissing(BaseEntity entity) {
var istrain = entity.GetComponentInParent<TrainEntity>();
if (istrain != null) return false;
return null;
}
private object OnSwitchToggle(ElectricSwitch electricSwitch, BasePlayer player) {
if (electricSwitch == null || player == null) return null;
var isTrainEntity = electricSwitch.GetComponentInParent<TrainEntity>();
if (isTrainEntity) {
if (permission.UserHasPermission(player.UserIDString, permConductor)) return null;
if (permission.UserHasPermission(player.UserIDString, permAdmin)) return null;
else return false;
}
return null;
}
private object CanPickupEntity(BasePlayer player, BaseCombatEntity entity) {
if (entity == null || player == null) return null;
if (entity.GetComponentInParent<TrainEntity>()) return false;
return null;
}
private void OnPlayerInput(BasePlayer basePlayer, InputState input) {
if (input.WasJustPressed(BUTTON.FIRE_THIRD)) {
if (playersInTrackMode.Contains(basePlayer.userID)) {
var hasEditor = basePlayer.GetComponent<TrackEditGUI>();
if (hasEditor) {
if (!hasEditor.enableMiddleMouse) return;
string trackName = hasEditor.trackstring;
if (storedData.trainTrackData.ContainsKey(trackName)) {
storedData.trainTrackData[trackName].trackMarkers.Add(basePlayer.transform.position);
SaveData();
hasEditor.RefreshTrackList(basePlayer, trackName);
if (basePlayer != null && basePlayer.net?.connection?.authLevel >= 1) basePlayer.SendConsoleCommand("ddraw.text", new object[] {
10.0f, Color.red, basePlayer.transform.position + Vector3.up, "X"
}
);
}
}
}
}
}
private void RespawnAllTrains() {
DestroyAll<TrainEntity>();
if (storedData.trainTrackData.Any()) {
foreach (string listname in storedData.trainTrackData.Keys) {
if (storedData.trainTrackData[listname].trackMarkers.Count > 0 && storedData.trainTrackData[listname].autospawn) AddTrainEntityToTrack(listname);
}
}
}
private void OnPlayerSleepEnded(BasePlayer player) {
if (!config.trainSettings.ejectSleepers) return;
if (player.net?.connection?.authLevel >= 0) {
var onTrain = player.GetComponentInParent<TrainEntity>();
if (onTrain) player.SetParent(null, true, true);
}
}
private void OnPlayerDisconnected(BasePlayer player) {
if (!config.trainSettings.ejectSleepers) return;
var onTrain = player.GetComponentInParent<TrainEntity>();
if (onTrain) player.SetParent(null, true, true);
}
private void Unload() {
DestroyAll<TrainEntity>();
DestroyAll<TrackEditGUI>();
SaveData();
}
private static void DestroyAll<T>() {
var objects = GameObject.FindObjectsOfType(typeof(T));
if (objects != null) foreach (var gameObj in objects) GameObject.Destroy(gameObj);
}
#endregion
#region Trolley Entity
class TrainEntity : MonoBehaviour {
Trains instance;
BaseEntity railCart;
BoxCollider boxcollider;
Rigidbody rigidHitBody;
int traintype;
float steps;
BaseEntity furnace1, furnace2, frontwall, frontdoor, midwall, rearwall, reardoor;
BaseEntity frontsign;
BaseEntity frontDoorWay, rearDoorWay;
BaseEntity frontLowWall, rearLowWall;
BaseEntity floor1, floor2, floor3, floor4;
BaseEntity ceiling1, ceiling2, ceiling3, ceiling4;
BaseEntity rightwall1, rightwall2, rightwall3, rigthwall4;
BaseEntity leftwall1, leftwall2, leftwall3, leftwall4;
BaseEntity wheel1, wheel2, wheel3, wheel4, wheel5, wheel6, wheel7, wheel8;
BaseEntity lightright, lightleft;
BaseEntity lightright2, lightleft2;
BaseEntity logoleft1, logoleft2, logoright1, logoright2;
BaseEntity chair1, chair2, chair3, chair4, chair5, chair6;
BaseEntity seatback1, seatback2, seat1, seat2;
BaseEntity rowBoat;
public BaseEntity frontlock;
public BaseEntity frontswitch;
int counter;
public bool npcmove;
bool findnext;
bool moveforward;
bool findnextstop;
public bool loopmovement;
bool useAngleSpeed;
bool spawncomplete;
bool autoStartTrain;
bool setGameObjectActive;
float maxSpeed;
float stopWait;
string lockCodestr;
string usingListNamed;
public List<Vector3> movetolist;
public List<Vector3> stoplist;
public Vector3 movetopoint;
Vector3 lastStopPos;
Vector3 currentPos, targetDir, newDir;
string floorprefab = "assets/prefabs/building core/floor/floor.prefab";
string frameprefab = "assets/prefabs/building core/wall.frame/wall.frame.prefab";
string wheelprefab = "assets/prefabs/deployable/spinner_wheel/spinner.wheel.deployed.prefab";
string wallprefab = "assets/prefabs/building core/wall/wall.prefab";
string windowwallprefab = "assets/prefabs/building core/wall.window/wall.window.prefab";
string wallframeprefab = "assets/prefabs/building core/wall.frame/wall.frame.prefab";
string doorwayprefab = "assets/prefabs/building core/wall.doorway/wall.doorway.prefab";
string solorpanelprefab = "assets/prefabs/deployable/playerioents/generators/solar_panels_roof/solarpanel.large.deployed.prefab";
string batteryprefab = "assets/prefabs/deployable/playerioents/batteries/smallrechargablebattery.deployed.prefab";
string lightprefab = "assets/prefabs/tools/flashlight/flashlight.entity.prefab";
string lowwallprefab = "assets/prefabs/building core/wall.low/wall.low.prefab";
string simplelightprefab = "assets/prefabs/deployable/ceiling light/ceilinglight.deployed.prefab";
string doorcontroller = "assets/prefabs/deployable/playerioents/simpleswitch/switch.prefab";
string rugprefab = "assets/prefabs/deployable/rug/rug.deployed.prefab";
string refineryprefab = "assets/prefabs/deployable/oil refinery/refinery_small_deployed.prefab";
string garagedoorprefab = "assets/prefabs/building/wall.frame.garagedoor/wall.frame.garagedoor.prefab";
string chairprefab = "assets/bundled/prefabs/static/chair.invisible.static.prefab";
string seatprefab = "assets/prefabs/deployable/hitch & trough/hitchtrough.deployed.prefab";
string customPrefab = config.trainSettings.customPrefabStr;
private void Awake() {
instance = new Trains();
movetopoint = new Vector3();
movetolist = new List<Vector3>();
stoplist = new List<Vector3>();
lastStopPos = new Vector3();
railCart = GetComponentInParent<BaseEntity>();
currentPos = railCart.transform.position;
counter = 0;
steps = 0f;
moveforward = true;
findnext = true;
findnextstop = true;
spawncomplete = false;
loopmovement = false;
traintype = 1;
npcmove = true;
setGameObjectActive = false;
useAngleSpeed = config.trainSettings.useAngleSpeed;
}
public void SpawnTrain(string listname) {
usingListNamed = listname;
if (listname == null) {
print("Debug...no list for trains to spawn on !!");
return;
}
movetopoint = storedData.trainTrackData[listname].trackMarkers.ElementAtOrDefault(0);
movetolist = storedData.trainTrackData[listname].trackMarkers;
stoplist = storedData.trainTrackData[listname].trainStops;
loopmovement = storedData.trainTrackData[listname].looping;
traintype = storedData.trainTrackData[listname].trainType;
autoStartTrain = storedData.trainTrackData[listname].autostart;
maxSpeed = storedData.trainTrackData[listname].maxSpeed;
stopWait = storedData.trainTrackData[listname].stopWaitTime;
SpawnRailBase();
}
BaseEntity SpawnPart(string prefab, BaseEntity entitypart, bool setactive, int eulangx, int eulangy, int eulangz, float locposx, float locposy, float locposz, BaseEntity parent, ulong skinid) {
entitypart = new BaseEntity();
entitypart = GameManager.server.CreateEntity(prefab, railCart.transform.position, railCart.transform.rotation, setactive);
entitypart.transform.localEulerAngles = new Vector3(eulangx, eulangy, eulangz);
entitypart.transform.localPosition = new Vector3(locposx, locposy, locposz);
entitypart.SetParent(parent, 0, false, false);
entitypart.skinID = skinid;
entitypart.enableSaving = false;
entitypart?.Spawn();
SpawnRefresh(entitypart);
return entitypart;
}
private void SpawnRailBase() {
if (traintype == 1) SpawnRailCart1();
if (traintype == 2) SpawnRailCart2();
if (traintype == 3) SpawnEngine();
if (traintype == 4) SpawnCoasterCar();
if (traintype == 5) SpawnCustomPrefab();
}
private void SpawnCoasterCar() {
frontswitch = SpawnPart(doorcontroller, frontswitch, setGameObjectActive, 0, 180, 0, -0.5f, 0.5f, 1.4f, railCart, 1);
frontswitch.SetFlag(BaseEntity.Flags.Reserved8, true, false);
frontswitch.SetFlag(BaseEntity.Flags.On, autoStartTrain, false);
floor1 = SpawnPart(floorprefab, floor1, setGameObjectActive, 0, 0, 0, 0f, 1f, 0f, railCart, 1);
chair1 = SpawnPart(chairprefab, chair1, false, 0, 0, 0, 1.0f, 1f, 0.8f, railCart, 1);
chair2 = SpawnPart(chairprefab, chair2, false, 0, 0, 0, 0.0f, 1f, 0.8f, railCart, 1);
chair3 = SpawnPart(chairprefab, chair3, false, 0, 0, 0, -1.0f, 1f, 0.8f, railCart, 1);
chair4 = SpawnPart(chairprefab, chair4, false, 0, 0, 0, 1.0f, 1f, -0.8f, railCart, 1);
chair5 = SpawnPart(chairprefab, chair5, false, 0, 0, 0, 0.0f, 1f, -0.8f, railCart, 1);
chair6 = SpawnPart(chairprefab, chair6, false, 0, 0, 0, -1.0f, 1f, -0.8f, railCart, 1);
seatback1 = SpawnPart(lowwallprefab, seatback1, false, 0, 270, 10, 0.0f, 1f, 0.1f, railCart, 1);
seatback2 = SpawnPart(lowwallprefab, seatback2, false, 0, 270, 10, 0.0f, 1f, -1.4f, railCart, 1);
seat1 = SpawnPart(lowwallprefab, seat1, false, 0, 270, 90, 0.0f, 1.4f, 1.0f, railCart, 1);
seat2 = SpawnPart(lowwallprefab, seat2, false, 0, 270, 90, 0.0f, 1.4f, -0.5f, railCart, 1);
rightwall1 = SpawnPart(lowwallprefab, rightwall1, setGameObjectActive, 0, 0, 0, 1.4f, 0.7f, 0.0f, railCart, 1);
leftwall1 = SpawnPart(lowwallprefab, leftwall1, setGameObjectActive, 0, 180, 0, -1.4f, 0.7f, 0.0f, railCart, 1);
frontLowWall = SpawnPart(lowwallprefab, frontDoorWay, setGameObjectActive, 0, 270, 0, 0f, 0.7f, 1.5f, railCart, 1);
rearLowWall = SpawnPart(lowwallprefab, rearDoorWay, setGameObjectActive, 0, 90, 0, 0f, 0.7f, -1.5f, railCart, 1);
lightleft = SpawnPart(lightprefab, lightleft, true, -15, 10, 0, 1.1f, 1f, 1.5f, railCart, 1);
lightright = SpawnPart(lightprefab, lightright, true, -15, 10, 0, -1.1f, 1f, 1.5f, railCart, 1);
lightleft2 = SpawnPart(lightprefab, lightleft, true, -15, 190, 0, 1.1f, 1f, -1.5f, railCart, 1);
lightright2 = SpawnPart(lightprefab, lightright, true, -15, 190, 0, -1.1f, 1f, -1.5f, railCart, 1);
wheel1 = SpawnPart(wheelprefab, wheel1, setGameObjectActive, 90, 0, 90, 0.75f, 0.5f, 1.0f, railCart, 1);
wheel2 = SpawnPart(wheelprefab, wheel2, setGameObjectActive, 90, 0, 90, -0.75f, 0.5f, 1.0f, railCart, 1);
wheel3 = SpawnPart(wheelprefab, wheel3, setGameObjectActive, 90, 0, 90, 0.75f, 0.5f, -1.0f, railCart, 1);
wheel4 = SpawnPart(wheelprefab, wheel4, setGameObjectActive, 90, 0, 90, -0.75f, 0.5f, -1.0f, railCart, 1);
spawncomplete = true;
}
private void SpawnEngine() {
frontswitch = SpawnPart(doorcontroller, frontswitch, setGameObjectActive, 0, 180, 0, -0.3f, 0.9f, 0f, railCart, 1);
frontswit
// ... [Code preview truncated due to length. Full source in attached file] ...