Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of RideMeExtended v1.2.0
RideMeExtended.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using KinematicCharacterController; using On.RoR2; using RoR2; using RoR2.Networking; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")] [assembly: AssemblyCompany("RideMeExtended")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RideMeExtended")] [assembly: AssemblyTitle("RideMeExtended")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace RideMeExtended; public class RideableController : NetworkBehaviour, IInteractable, IDisplayNameProvider { internal const string DisplayNameToken = "RIDE_INTERACTION"; private const string ContextToken = "RIDE_CONTEXT"; public TeamIndex TeamIndex; public CharacterBody CharacterBody; public List<RideSeat> AvailableSeats = new List<RideSeat>(); [SyncVar] public bool CanRide = true; public bool NetworkCanRide { get { return CanRide; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<bool>(value, ref CanRide, 1u); } } private void Start() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)Run.instance)) { return; } CanRide = true; TeamIndex = ((Component)this).GetComponent<TeamComponent>().teamIndex; CharacterBody = ((Component)this).GetComponent<CharacterBody>(); string bodyName = BodyCatalog.GetBodyName(BodyCatalog.FindBodyIndex(((Object)CharacterBody).name)); if (!string.IsNullOrEmpty(bodyName) && RideMeExtended.AvailableSeatsDictionary.ContainsKey(bodyName)) { Func<CharacterBody, List<RideSeat>> func = RideMeExtended.AvailableSeatsDictionary[bodyName]; if (func != null) { List<RideSeat> list = func(CharacterBody); if (list == null) { return; } { foreach (RideSeat item in list) { item.SeatOwner = this; item.SeatUser = null; AvailableSeats.Add(item); } return; } } } ModelLocator component = ((Component)this).GetComponent<ModelLocator>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.modelTransform)) { ChildLocator component2 = ((Component)component.modelTransform).GetComponent<ChildLocator>(); if (Object.op_Implicit((Object)(object)component2)) { Transform val = component2.FindChild("Chest"); if (Object.op_Implicit((Object)(object)val)) { AvailableSeats.Add(new RideSeat { SeatUser = null, SeatOwner = this, SeatTransform = val, PositionOffsetGetter = GetLegacyPositionOffset }); return; } } AvailableSeats.Add(new RideSeat { SeatUser = null, SeatOwner = this, SeatTransform = ((Component)this).GetComponent<ModelLocator>().modelTransform, PositionOffsetGetter = GetLegacyPositionOffset }); } else { AvailableSeats.Add(new RideSeat { SeatUser = null, SeatOwner = this, SeatTransform = ((Component)this).transform, PositionOffsetGetter = GetLegacyPositionOffset }); } } private static Vector3 GetLegacyPositionOffset(RideSeat seat) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return RideMeExtendedConfig.defaultSeatPositionOffset; } public string GetContextString(Interactor activator) { return Language.GetString("RIDE_CONTEXT"); } public override int GetNetworkChannel() { return QosChannelIndex.defaultReliable.intVal; } public Interactability GetInteractability(Interactor activator) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) if (CanRide && Object.op_Implicit((Object)(object)activator) && Object.op_Implicit((Object)(object)((Component)activator).gameObject) && (Object)(object)((Component)activator).gameObject != (Object)(object)((Component)this).gameObject) { TeamComponent component = ((Component)activator).GetComponent<TeamComponent>(); RiderController component2 = ((Component)activator).GetComponent<RiderController>(); RideableController component3 = ((Component)activator).GetComponent<RideableController>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component2) && (RideMeExtendedConfig.canRideOtherTeams || component.teamIndex == TeamIndex) && component2.CurrentSeat == null && (!Object.op_Implicit((Object)(object)component3) || !component3.AvailableSeats.Any((RideSeat x) => Object.op_Implicit((Object)(object)x.SeatUser))) && AvailableSeats.Any((RideSeat x) => !Object.op_Implicit((Object)(object)x.SeatUser))) { return (Interactability)2; } } return (Interactability)0; } [Server] public void OnInteractionBegin(Interactor activator) { RiderController component = ((Component)activator).GetComponent<RiderController>(); if (CanRide && Object.op_Implicit((Object)(object)component)) { int nextAvailableSeatIndex = GetNextAvailableSeatIndex(component.CurrentSeat); if (nextAvailableSeatIndex != -1) { RpcEnterSeat(nextAvailableSeatIndex, ((Component)activator).gameObject); } } } [ClientRpc] public void RpcEnterSeat(int seatIndex, GameObject rider) { //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)rider)) { return; } RiderController component = rider.GetComponent<RiderController>(); if (!Object.op_Implicit((Object)(object)component)) { return; } RideSeat seatAtIndex = GetSeatAtIndex(seatIndex); if (seatAtIndex == null) { return; } RideSeat currentSeat = component.CurrentSeat; if (component.CurrentSeat != null) { component.CurrentSeat.SeatUser = null; } seatAtIndex.SeatUser = component; component.CurrentSeat = seatAtIndex; CharacterBody characterBody = component.CharacterBody; if (Object.op_Implicit((Object)(object)characterBody) && Object.op_Implicit((Object)(object)characterBody.characterMotor)) { if (Object.op_Implicit((Object)(object)((BaseCharacterController)characterBody.characterMotor).Motor)) { ((BaseCharacterController)characterBody.characterMotor).Motor.ForceUnground(0.1f); } characterBody.characterMotor.useGravity = false; characterBody.characterMotor.velocity = Vector3.zero; if (Object.op_Implicit((Object)(object)characterBody.characterDirection)) { ((Behaviour)characterBody.characterDirection).enabled = !seatAtIndex.AlignToSeatRotation; } } component.ToggleRiderCollisions(disable: true); RideMeExtended.Instance.Logger.LogMessage((object)(((Object)rider).name + " is now riding " + ((Object)this).name)); RideMeExtended.OnGlobalSeatChange?.Invoke(component, currentSeat, seatAtIndex); } public int GetNextAvailableSeatIndex(RideSeat currentSeat) { int count = AvailableSeats.Count; if (currentSeat != null && count > 1) { int num = AvailableSeats.IndexOf(currentSeat); if (num != -1) { for (int i = num + 1; num != i; i++) { if (i >= count) { i = 0; } if (!Object.op_Implicit((Object)(object)AvailableSeats[i].SeatUser)) { return i; } } return -1; } } return AvailableSeats.FindIndex((RideSeat x) => !Object.op_Implicit((Object)(object)x.SeatUser)); } public RideSeat GetSeatAtIndex(int index) { if (index >= 0 && index < AvailableSeats.Count) { return AvailableSeats[index]; } return null; } public string GetDisplayName() { return Language.GetString("RIDE_INTERACTION"); } public bool ShouldIgnoreSpherecastForInteractibility(Interactor activator) { return false; } public bool ShouldShowOnScanner() { return false; } public void OnEnable() { InstanceTracker.Add<RideableController>(this); } public void OnDisable() { InstanceTracker.Remove<RideableController>(this); } public void SetCanRide(bool value) { if (NetworkServer.active) { NetworkCanRide = value; } else { CmdSetCanRide(value); } } [Command] private void CmdSetCanRide(bool value) { NetworkCanRide = value; } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { writer.Write(CanRide); return true; } bool flag = false; if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(CanRide); } if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { CanRide = reader.ReadBoolean(); } else if ((reader.ReadPackedUInt32() & (true ? 1u : 0u)) != 0) { CanRide = reader.ReadBoolean(); } } public bool ShouldProximityHighlight() { return CanRide; } } public static class RideMeExtendedConfig { public static bool disableRiderHurtBoxEnabled; public static bool jumpRiderOnExitEnabled; public static float jumpRiderOnExitVelocity; public static Vector3 defaultSeatPositionOffset; public static bool canRideOtherTeams; public static void ReadConfig() { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) canRideOtherTeams = GetSetConfig("Riders", "Can ride the other teams", defaultValue: false, "Allows characters to ride other characters regardless of team").Value; disableRiderHurtBoxEnabled = GetSetConfig("Riders", "Disable hurtboxes upon riding", defaultValue: false, "Disable hurtboxes upon riding").Value; jumpRiderOnExitEnabled = GetSetConfig("Riders", "Enable jump on seat exit", defaultValue: true, "Enable jump on seat exit").Value; jumpRiderOnExitVelocity = GetSetConfig("Riders", "Jump velocity on seat exit", 20f, "Jump velocity on seat exit").Value; defaultSeatPositionOffset = GetSetConfig<Vector3>("Rideables", "Default seat position offset", new Vector3(0f, 3f, 0f), "Default seat position offset").Value; } internal static ConfigEntry<T> GetSetConfig<T>(string section, string key, T defaultValue, string description) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_0023: Expected O, but got Unknown return ((BaseUnityPlugin)RideMeExtended.Instance).Config.Bind<T>(new ConfigDefinition(section, key), defaultValue, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>())); } } [BepInPlugin("com.Mico27.RideMeExtended", "RideMeExtended", "1.2.0")] public sealed class RideMeExtended : BaseUnityPlugin { public delegate void SeatChangeCallback(RiderController rider, RideSeat oldSeat, RideSeat newSeat); public const string MODNAME = "RideMeExtended"; public const string MODAUTHOR = "Mico27"; public const string MODUID = "com.Mico27.RideMeExtended"; public const string MODVERSION = "1.2.0"; public const string developerPrefix = "Mico27"; public static RideMeExtended Instance; public static SeatChangeCallback OnGlobalSeatChange; public static HashSet<string> RiderBodyBlacklist = new HashSet<string>(); public static HashSet<string> RideableBodyBlacklist = new HashSet<string>(); internal static Dictionary<string, Func<CharacterBody, List<RideSeat>>> AvailableSeatsDictionary = new Dictionary<string, Func<CharacterBody, List<RideSeat>>>(); public ManualLogSource Logger => ((BaseUnityPlugin)this).Logger; public void Awake() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown Instance = this; try { RideMeExtendedConfig.ReadConfig(); Language.Init += new hook_Init(Language_Init); BodyCatalog.Init += new hook_Init(BodyCatalog_Init); GlobalEventManager.OnInteractionBegin += new hook_OnInteractionBegin(GlobalEventManager_OnInteractionBegin); } catch (Exception ex) { Logger.LogError((object)(ex.Message + " - " + ex.StackTrace)); } } private IEnumerator Language_Init(orig_Init orig) { yield return orig.Invoke(); Language.english.SetStringByToken("RIDE_INTERACTION", "Ride me"); Language.english.SetStringByToken("RIDE_CONTEXT", "Ride me"); } private IEnumerator BodyCatalog_Init(orig_Init orig) { yield return orig.Invoke(); GameObject[] bodyPrefabs = BodyCatalog.bodyPrefabs; foreach (GameObject val in bodyPrefabs) { if (!RiderBodyBlacklist.Contains(((Object)val).name) && !((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Rider blacklist", ((Object)val).name), false, new ConfigDescription("Makes " + ((Object)val).name + " not able to ride anything.", (AcceptableValueBase)null, Array.Empty<object>())).Value && !Object.op_Implicit((Object)(object)val.GetComponent<RiderController>())) { val.AddComponent<RiderController>(); } if (RideableBodyBlacklist.Contains(((Object)val).name) || ((BaseUnityPlugin)this).Config.Bind<bool>(new ConfigDefinition("Rideable blacklist", ((Object)val).name), false, new ConfigDescription("Makes " + ((Object)val).name + " not rideable.", (AcceptableValueBase)null, Array.Empty<object>())).Value) { continue; } if (((Object)val).name == "EngiTurretBody" || ((Object)val).name == "EngiWalkerTurretBody" || ((Object)val).name == "SquidTurretBody" || (RideMeExtendedConfig.canRideOtherTeams && val.layer != 0)) { val.layer = 0; } if (!Object.op_Implicit((Object)(object)val.GetComponent<RideableController>())) { val.AddComponent<RideableController>(); } Highlight val2 = val.GetComponent<Highlight>(); if (!Object.op_Implicit((Object)(object)val2)) { val2 = val.AddComponent<Highlight>(); } val2.highlightColor = (HighlightColor)0; val2.isOn = false; val2.strength = 1f; ModelLocator component = val.GetComponent<ModelLocator>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.modelTransform) && Object.op_Implicit((Object)(object)((Component)component.modelTransform).gameObject)) { CharacterModel component2 = ((Component)component.modelTransform).gameObject.GetComponent<CharacterModel>(); if (Object.op_Implicit((Object)(object)component2)) { val2.targetRenderer = (Renderer)(object)component2.mainSkinnedMeshRenderer; } } if (!Object.op_Implicit((Object)(object)val2.targetRenderer)) { val2.targetRenderer = val.GetComponentInChildren<Renderer>(); } GenericDisplayNameProvider val3 = val.GetComponent<GenericDisplayNameProvider>(); if (!Object.op_Implicit((Object)(object)val3)) { val3 = val.AddComponent<GenericDisplayNameProvider>(); } val3.displayToken = "RIDE_INTERACTION"; EntityLocator val4 = val.GetComponent<EntityLocator>(); if (!Object.op_Implicit((Object)(object)val4)) { val4 = val.AddComponent<EntityLocator>(); } val4.entity = val; } } private void GlobalEventManager_OnInteractionBegin(orig_OnInteractionBegin orig, GlobalEventManager self, Interactor interactor, IInteractable interactable, GameObject interactableObject) { if (!Object.op_Implicit((Object)(object)interactableObject.GetComponent<RideableController>())) { orig.Invoke(self, interactor, interactable, interactableObject); } } public static void RegisterRideSeats(string bodyName, Func<CharacterBody, List<RideSeat>> rideSeatsGetter) { AvailableSeatsDictionary[bodyName] = rideSeatsGetter; } } public class RiderController : NetworkBehaviour { public CharacterBody CharacterBody; public RideSeat CurrentSeat; private void Start() { if (Object.op_Implicit((Object)(object)Run.instance)) { CharacterBody = ((Component)this).GetComponent<CharacterBody>(); } } private void FixedUpdate() { //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)Run.instance) || !Object.op_Implicit((Object)(object)CharacterBody) || CurrentSeat == null) { return; } RideSeat currentSeat = CurrentSeat; if (Object.op_Implicit((Object)(object)currentSeat.SeatTransform) && (Object)(object)currentSeat.SeatUser == (Object)(object)this && Object.op_Implicit((Object)(object)currentSeat.SeatOwner) && currentSeat.SeatOwner.CanRide) { if (Util.HasEffectiveAuthority(((Component)this).gameObject)) { if (((ButtonState)(ref CharacterBody.inputBank.jump)).justPressed) { CmdExitSeat(); return; } if (((ButtonState)(ref CharacterBody.inputBank.interact)).justPressed && CurrentSeat.SeatOwner.GetNextAvailableSeatIndex(CurrentSeat) != -1) { CmdSwapSeat(); return; } } KinematicCharacterMotor motor = ((BaseCharacterController)CharacterBody.characterMotor).Motor; if (Object.op_Implicit((Object)(object)motor)) { Transform seatTransform = currentSeat.SeatTransform; Func<RideSeat, Vector3> positionOffsetGetter = currentSeat.PositionOffsetGetter; Vector3 val = ((positionOffsetGetter != null) ? (seatTransform.position + positionOffsetGetter(currentSeat)) : seatTransform.position); if (currentSeat.AlignToSeatRotation && Object.op_Implicit((Object)(object)CharacterBody.characterDirection)) { Func<RideSeat, Quaternion> rotationOffsetGetter = currentSeat.RotationOffsetGetter; Quaternion val2 = ((rotationOffsetGetter != null) ? (seatTransform.rotation * rotationOffsetGetter(currentSeat)) : seatTransform.rotation); motor.SetPositionAndRotation(val, val2, true); CharacterBody.characterDirection.targetTransform.rotation = val2; } else { motor.SetPosition(val, true); } } } else if (Util.HasEffectiveAuthority(((Component)this).gameObject)) { CmdExitSeat(); } } public override int GetNetworkChannel() { return QosChannelIndex.defaultReliable.intVal; } [Command] public void CmdExitSeat() { RpcExitSeat(); } [ClientRpc] public void RpcExitSeat() { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) if (CurrentSeat == null) { return; } RideSeat currentSeat = CurrentSeat; CurrentSeat.SeatUser = null; CurrentSeat = null; if (Object.op_Implicit((Object)(object)CharacterBody) && Object.op_Implicit((Object)(object)CharacterBody.characterMotor)) { CharacterMotor characterMotor = CharacterBody.characterMotor; characterMotor.useGravity = true; characterMotor.velocity = Vector3.zero; if (RideMeExtendedConfig.jumpRiderOnExitEnabled) { ((BaseCharacterController)characterMotor).Motor.ForceUnground(0.1f); characterMotor.velocity = new Vector3(characterMotor.velocity.x, Mathf.Max(characterMotor.velocity.y, RideMeExtendedConfig.jumpRiderOnExitVelocity), characterMotor.velocity.z); } if (Object.op_Implicit((Object)(object)CharacterBody.characterDirection)) { ((Behaviour)CharacterBody.characterDirection).enabled = true; } } ToggleRiderCollisions(disable: false); RideMeExtended.OnGlobalSeatChange?.Invoke(this, currentSeat, null); } [Command] public void CmdSwapSeat() { if (CurrentSeat != null && (Object)(object)CurrentSeat.SeatOwner != (Object)null) { int nextAvailableSeatIndex = CurrentSeat.SeatOwner.GetNextAvailableSeatIndex(CurrentSeat); if (nextAvailableSeatIndex != -1) { RpcSwapSeat(nextAvailableSeatIndex); } } } [ClientRpc] public void RpcSwapSeat(int seatIndex) { if (CurrentSeat == null || !((Object)(object)CurrentSeat.SeatOwner != (Object)null)) { return; } RideSeat seatAtIndex = CurrentSeat.SeatOwner.GetSeatAtIndex(seatIndex); if (seatAtIndex != null && CurrentSeat != seatAtIndex) { RideSeat currentSeat = CurrentSeat; CurrentSeat.SeatUser = null; CurrentSeat = seatAtIndex; seatAtIndex.SeatUser = this; if (Object.op_Implicit((Object)(object)CharacterBody.characterDirection)) { ((Behaviour)CharacterBody.characterDirection).enabled = !seatAtIndex.AlignToSeatRotation; } RideMeExtended.OnGlobalSeatChange?.Invoke(this, currentSeat, seatAtIndex); } } public void ToggleRiderCollisions(bool disable) { if (RideMeExtendedConfig.disableRiderHurtBoxEnabled && Object.op_Implicit((Object)(object)CharacterBody) && Object.op_Implicit((Object)(object)CharacterBody.modelLocator) && Object.op_Implicit((Object)(object)CharacterBody.modelLocator.modelTransform)) { HurtBoxGroup component = ((Component)CharacterBody.modelLocator.modelTransform).GetComponent<HurtBoxGroup>(); if (Object.op_Implicit((Object)(object)component)) { if (disable) { int hurtBoxesDeactivatorCounter = component.hurtBoxesDeactivatorCounter; component.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter + 1; } else { int hurtBoxesDeactivatorCounter = component.hurtBoxesDeactivatorCounter; component.hurtBoxesDeactivatorCounter = hurtBoxesDeactivatorCounter - 1; } } } if (Object.op_Implicit((Object)(object)CharacterBody) && Object.op_Implicit((Object)(object)CharacterBody.characterMotor) && Object.op_Implicit((Object)(object)CharacterBody.characterMotor.capsuleCollider)) { ((Collider)CharacterBody.characterMotor.capsuleCollider).enabled = !disable; } } public void OnEnable() { InstanceTracker.Add<RiderController>(this); } public void OnDisable() { InstanceTracker.Remove<RiderController>(this); } } public class RideSeat { public string Name; public Transform SeatTransform; public RideableController SeatOwner; public RiderController SeatUser; public Func<RideSeat, Vector3> PositionOffsetGetter; public Func<RideSeat, Quaternion> RotationOffsetGetter; public bool AlignToSeatRotation; }