using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using FistVR; using H3MP.Scripts; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyCompany("Packer")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("H3MP networking tools for easy syncing mods")] [assembly: AssemblyFileVersion("0.9.0.0")] [assembly: AssemblyInformationalVersion("0.9.0+4451aca4407294906a656f22f8ac49eee81db56c")] [assembly: AssemblyProduct("Packer.NetworkingTools")] [assembly: AssemblyTitle("Networking Tools")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.9.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string id = null, string name = null, string version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string id = null, string name = null, string version = null) { } } } namespace H3MP.Networking { [BepInPlugin("Packer.NetworkingTools", "Networking Tools", "0.9.0")] [BepInProcess("h3vr.exe")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class NetworkingToolsPlugin : BaseUnityPlugin { internal static ManualLogSource Logger { get; private set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; } } public class CustomConnection { public delegate void UpdateHandlerDelegate(int clientID, PacketData packet); private bool Ready = false; public string Name; private string ToClientName = "ToClient"; private int toClient_ID; private string ToServerName = "ToServer"; private int toServer_ID; public int ToClientID => toClient_ID; public int ToServerID => toServer_ID; public event UpdateHandlerDelegate ServerHandlerEvent; public event UpdateHandlerDelegate ClientHandlerEvent; public CustomConnection(string connectionName) { ToClientName = connectionName + "ToClient"; ToServerName = connectionName + "ToServer"; Name = connectionName; } public void Setup() { //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Expected O, but got Unknown //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Expected O, but got Unknown if (Ready) { return; } Ready = true; NetworkingToolsPlugin.Logger.LogMessage((object)(Name + " Setup")); if (Tools.IsHost()) { if (Mod.registeredCustomPacketIDs.ContainsKey(ToClientName)) { toClient_ID = Mod.registeredCustomPacketIDs[ToClientName]; } else { toClient_ID = Server.RegisterCustomPacketType(ToClientName, 0); } Mod.customPacketHandlers[toClient_ID] = new CustomPacketHandler(ClientReceiver_Handler); if (Mod.registeredCustomPacketIDs.ContainsKey(ToServerName)) { toServer_ID = Mod.registeredCustomPacketIDs[ToServerName]; } else { toServer_ID = Server.RegisterCustomPacketType(ToServerName, 0); } Mod.customPacketHandlers[toServer_ID] = new CustomPacketHandler(ServerReceiver_Handler); return; } if (Mod.registeredCustomPacketIDs.ContainsKey(ToClientName)) { toClient_ID = Mod.registeredCustomPacketIDs[ToClientName]; Mod.customPacketHandlers[toClient_ID] = new CustomPacketHandler(ClientReceiver_Handler); } else { ClientSend.RegisterCustomPacketType(ToClientName); Mod.CustomPacketHandlerReceived += new CustomPacketHandlerReceivedDelegate(ClientIdentifier_Received); } if (Mod.registeredCustomPacketIDs.ContainsKey(ToServerName)) { toServer_ID = Mod.registeredCustomPacketIDs[ToServerName]; Mod.customPacketHandlers[toServer_ID] = new CustomPacketHandler(ServerReceiver_Handler); } else { ClientSend.RegisterCustomPacketType(ToServerName); Mod.CustomPacketHandlerReceived += new CustomPacketHandlerReceivedDelegate(ServerIdentifier_Received); } } public void ServerToClients(PacketData packet) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown Packet val = new Packet(packet.ToArray()); ServerSend.SendTCPDataToAll(val, true); NetworkingToolsPlugin.Logger.LogDebug((object)"Server To Clients"); } public void ServerToSelectClients(PacketData packet, List clientIDs) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown Packet val = new Packet(packet.ToArray()); ServerSend.SendTCPDataToClients(val, clientIDs, -1, true); NetworkingToolsPlugin.Logger.LogDebug((object)"Server To Select Clients"); } public void ServerToClient(int clientID, PacketData packet) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown Packet val = new Packet(packet.ToArray()); ServerSend.SendTCPData(clientID, val, true); NetworkingToolsPlugin.Logger.LogDebug((object)"Server To Client"); } public void ClientToServer(PacketData packet) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown Packet val = new Packet(packet.ToArray()); ClientSend.SendTCPData(val, true); NetworkingToolsPlugin.Logger.LogDebug((object)"Client To Server - Send Data"); } private void ClientReceiver_Handler(int clientID, Packet packet) { if (this.ClientHandlerEvent != null) { PacketData packetData = new PacketData(packet.ToArray()); packetData.readPos = packet.readPos; this.ClientHandlerEvent(clientID, packetData); } NetworkingToolsPlugin.Logger.LogMessage((object)"Client - Client Receiver"); } private void ServerReceiver_Handler(int clientID, Packet packet) { if (this.ServerHandlerEvent != null) { PacketData packetData = new PacketData(packet.ToArray()); packetData.readPos = packet.readPos; this.ServerHandlerEvent(clientID, packetData); } NetworkingToolsPlugin.Logger.LogMessage((object)"Server - Server Receiver"); } private void ClientIdentifier_Received(string identifier, int index) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown if (identifier == ToClientName) { NetworkingToolsPlugin.Logger.LogMessage((object)"Client Handshake"); toClient_ID = index; Mod.customPacketHandlers[index] = new CustomPacketHandler(ClientReceiver_Handler); Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(ClientIdentifier_Received); } } private void ServerIdentifier_Received(string identifier, int index) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown if (identifier == ToServerName) { NetworkingToolsPlugin.Logger.LogMessage((object)"Server Handshake"); toServer_ID = index; Mod.customPacketHandlers[index] = new CustomPacketHandler(ServerReceiver_Handler); Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(ServerIdentifier_Received); } } } public class PacketData : IDisposable { public List buffer; public byte[] readableBuffer; public int readPos; private bool disposed = false; public PacketData() { buffer = new List(); readPos = 0; } public PacketData(int _id) { buffer = new List(); readPos = 0; Write(_id); } public PacketData(byte[] _data) { buffer = new List(); readPos = 0; SetBytes(_data); } public void SetBytes(byte[] _data) { Write(_data); readableBuffer = buffer.ToArray(); } public void WriteLength() { buffer.InsertRange(0, BitConverter.GetBytes(buffer.Count)); } public void InsertInt(int _value) { buffer.InsertRange(0, BitConverter.GetBytes(_value)); } public byte[] ToArray() { readableBuffer = buffer.ToArray(); return readableBuffer; } public int Length() { return buffer.Count; } public int UnreadLength() { return Length() - readPos; } public void Reset(bool _shouldReset = true) { if (_shouldReset) { buffer.Clear(); readableBuffer = null; readPos = 0; } else { readPos -= 4; } } public void Write(byte _value) { buffer.Add(_value); } public void Write(byte[] _value) { buffer.AddRange(_value); } public void Write(short _value) { buffer.AddRange(BitConverter.GetBytes(_value)); } public void Write(ushort _value) { buffer.AddRange(BitConverter.GetBytes(_value)); } public void Write(int _value) { buffer.AddRange(BitConverter.GetBytes(_value)); } public void Write(uint _value) { buffer.AddRange(BitConverter.GetBytes(_value)); } public void Write(long _value) { buffer.AddRange(BitConverter.GetBytes(_value)); } public void Write(float _value) { buffer.AddRange(BitConverter.GetBytes(_value)); } public void Write(double _value) { buffer.AddRange(BitConverter.GetBytes(_value)); } public void Write(bool _value) { buffer.AddRange(BitConverter.GetBytes(_value)); } public void Write(string _value) { Write(_value.Length); buffer.AddRange(Encoding.ASCII.GetBytes(_value)); } public void Write(Vector3 _value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) Write(_value.x); Write(_value.y); Write(_value.z); } public void Write(Vector2 _value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) Write(_value.x); Write(_value.y); } public void Write(Quaternion _value) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) Write(_value.x); Write(_value.y); Write(_value.z); Write(_value.w); } public void Write(Damage damage) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) Write(damage.point); Write(damage.Source_IFF); Write(damage.Source_Point); Write(damage.Dam_Blunt); Write(damage.Dam_Piercing); Write(damage.Dam_Cutting); Write(damage.Dam_TotalKinetic); Write(damage.Dam_Thermal); Write(damage.Dam_Chilling); Write(damage.Dam_EMP); Write(damage.Dam_TotalEnergetic); Write(damage.Dam_Stunning); Write(damage.Dam_Blinding); Write(damage.hitNormal); Write(damage.strikeDir); Write(damage.edgeNormal); Write(damage.damageSize); Write((byte)damage.Class); } public void Write(SosigConfigTemplate config) { //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0494: Unknown result type (might be due to invalid IL or missing references) //IL_0499: Unknown result type (might be due to invalid IL or missing references) //IL_049d: Unknown result type (might be due to invalid IL or missing references) Write(config.AppliesDamageResistToIntegrityLoss); Write(config.DoesDropWeaponsOnBallistic); Write(config.TotalMustard); Write(config.BleedDamageMult); Write(config.BleedRateMultiplier); Write(config.BleedVFXIntensity); Write(config.SearchExtentsModifier); Write(config.ShudderThreshold); Write(config.ConfusionThreshold); Write(config.ConfusionMultiplier); Write(config.ConfusionTimeMax); Write(config.StunThreshold); Write(config.StunMultiplier); Write(config.StunTimeMax); Write(config.HasABrain); Write(config.HasNightVision); Write(config.RegistersPassiveThreats); Write(config.CanBeKnockedOut); Write(config.MaxUnconsciousTime); Write(config.IgnoresNeedForWeapons); Write(config.AssaultPointOverridesSkirmishPointWhenFurtherThan); Write(config.ViewDistance); Write(config.HearingDistance); Write(config.MaxFOV); Write(config.StateSightRangeMults); Write(config.StateHearingRangeMults); Write(config.StateFOVMults); Write(config.CanPickup_Ranged); Write(config.CanPickup_Melee); Write(config.CanPickup_Other); Write(config.MaxThreatingIFFReactionRange_Visual); Write(config.MaxThreatingIFFReactionRange_Sonic); Write(config.AggroSensitivityMultiplier); Write(config.EntityRecognitionSpeedMultiplier); Write(config.CombatTargetIdentificationSpeedMultiplier); Write(config.DoesJointBreakKill_Head); Write(config.DoesJointBreakKill_Upper); Write(config.DoesJointBreakKill_Lower); Write(config.DoesSeverKill_Head); Write(config.DoesSeverKill_Upper); Write(config.DoesSeverKill_Lower); Write(config.DoesExplodeKill_Head); Write(config.DoesExplodeKill_Upper); Write(config.DoesExplodeKill_Lower); Write(config.CrawlSpeed); Write(config.SneakSpeed); Write(config.WalkSpeed); Write(config.RunSpeed); Write(config.TurnSpeed); Write(config.MovementRotMagnitude); Write(config.DamMult_Projectile); Write(config.DamMult_Explosive); Write(config.DamMult_Melee); Write(config.DamMult_Piercing); Write(config.DamMult_Blunt); Write(config.DamMult_Cutting); Write(config.DamMult_Thermal); Write(config.DamMult_Chilling); Write(config.DamMult_EMP); Write(config.CanBeSurpressed); Write(config.SuppressionMult); Write(config.CanBeGrabbed); Write(config.CanBeSevered); Write(config.CanBeStabbed); Write(config.MaxJointLimit); if (config.LinkDamageMultipliers == null || config.LinkDamageMultipliers.Count == 0) { Write((byte)0); } else { Write((byte)config.LinkDamageMultipliers.Count); foreach (float linkDamageMultiplier in config.LinkDamageMultipliers) { Write(linkDamageMultiplier); } } if (config.LinkStaggerMultipliers == null || config.LinkStaggerMultipliers.Count == 0) { Write((byte)0); } else { Write((byte)config.LinkStaggerMultipliers.Count); foreach (float linkStaggerMultiplier in config.LinkStaggerMultipliers) { Write(linkStaggerMultiplier); } } if (config.StartingLinkIntegrity == null || config.StartingLinkIntegrity.Count == 0) { Write((byte)0); } else { Write((byte)config.StartingLinkIntegrity.Count); foreach (Vector2 item in config.StartingLinkIntegrity) { Write(item); } } if (config.StartingChanceBrokenJoint == null || config.StartingChanceBrokenJoint.Count == 0) { Write((byte)0); } else { Write((byte)config.StartingChanceBrokenJoint.Count); foreach (float item2 in config.StartingChanceBrokenJoint) { Write(item2); } } if (config.LinkSpawnChance == null || config.LinkSpawnChance.Count == 0) { Write((byte)0); } else { Write((byte)config.LinkSpawnChance.Count); foreach (float item3 in config.LinkSpawnChance) { Write(item3); } } Write(config.TargetCapacity); Write(config.TargetTrackingTime); Write(config.NoFreshTargetTime); Write(config.DoesAggroOnFriendlyFire); Write(config.UsesLinkSpawns); Write(config.TimeInSkirmishToAlert); } public byte ReadByte(bool _moveReadPos = true) { if (buffer.Count > readPos) { byte result = readableBuffer[readPos]; if (_moveReadPos) { readPos++; } return result; } throw new Exception("Could not read value of type 'byte'!"); } public byte[] ReadBytes(int _length, bool _moveReadPos = true) { if (_length == 0) { return null; } if (buffer.Count > readPos) { byte[] result = buffer.GetRange(readPos, _length).ToArray(); if (_moveReadPos) { readPos += _length; } return result; } throw new Exception("Could not read value of type 'byte[]'!"); } public short ReadShort(bool _moveReadPos = true) { if (buffer.Count > readPos) { short result = BitConverter.ToInt16(readableBuffer, readPos); if (_moveReadPos) { readPos += 2; } return result; } throw new Exception("Could not read value of type 'short'!"); } public ushort ReadUShort(bool _moveReadPos = true) { if (buffer.Count > readPos) { ushort result = BitConverter.ToUInt16(readableBuffer, readPos); if (_moveReadPos) { readPos += 2; } return result; } throw new Exception("Could not read value of type 'ushort'!"); } public int ReadInt(bool _moveReadPos = true) { if (buffer.Count > readPos) { int result = BitConverter.ToInt32(readableBuffer, readPos); if (_moveReadPos) { readPos += 4; } return result; } throw new Exception("Could not read value of type 'int'!"); } public uint ReadUInt(bool _moveReadPos = true) { if (buffer.Count > readPos) { uint result = BitConverter.ToUInt32(readableBuffer, readPos); if (_moveReadPos) { readPos += 4; } return result; } throw new Exception("Could not read value of type 'uint'!"); } public long ReadLong(bool _moveReadPos = true) { if (buffer.Count > readPos) { long result = BitConverter.ToInt64(readableBuffer, readPos); if (_moveReadPos) { readPos += 8; } return result; } throw new Exception("Could not read value of type 'long'!"); } public float ReadFloat(bool _moveReadPos = true) { if (buffer.Count > readPos) { float result = BitConverter.ToSingle(readableBuffer, readPos); if (_moveReadPos) { readPos += 4; } return result; } throw new Exception("Could not read value of type 'float'!"); } public double ReadDouble(bool _moveReadPos = true) { if (buffer.Count > readPos) { double result = BitConverter.ToDouble(readableBuffer, readPos); if (_moveReadPos) { readPos += 8; } return result; } throw new Exception("Could not read value of type 'double'!"); } public bool ReadBool(bool _moveReadPos = true) { if (buffer.Count > readPos) { bool result = BitConverter.ToBoolean(readableBuffer, readPos); if (_moveReadPos) { readPos++; } return result; } throw new Exception("Could not read value of type 'bool'!"); } public string ReadString(bool _moveReadPos = true) { try { int num = ReadInt(); string @string = Encoding.ASCII.GetString(readableBuffer, readPos, num); if (_moveReadPos && @string.Length > 0) { readPos += num; } return @string; } catch { throw new Exception("Could not read value of type 'string'!"); } } public Vector3 ReadVector3(bool _moveReadPos = true) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) return new Vector3(ReadFloat(_moveReadPos), ReadFloat(_moveReadPos), ReadFloat(_moveReadPos)); } public Vector2 ReadVector2(bool _moveReadPos = true) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) return new Vector2(ReadFloat(_moveReadPos), ReadFloat(_moveReadPos)); } public Quaternion ReadQuaternion(bool _moveReadPos = true) { //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_0025: Unknown result type (might be due to invalid IL or missing references) return new Quaternion(ReadFloat(_moveReadPos), ReadFloat(_moveReadPos), ReadFloat(_moveReadPos), ReadFloat(_moveReadPos)); } public SosigConfigTemplate ReadSosigConfig(bool full = false, bool _moveReadPos = true) { //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014f: 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_015c: 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_0414: Unknown result type (might be due to invalid IL or missing references) SosigConfigTemplate val = ScriptableObject.CreateInstance(); val.AppliesDamageResistToIntegrityLoss = ReadBool(); val.DoesDropWeaponsOnBallistic = ReadBool(); val.TotalMustard = ReadFloat(); val.BleedDamageMult = ReadFloat(); val.BleedRateMultiplier = ReadFloat(); val.BleedVFXIntensity = ReadFloat(); val.SearchExtentsModifier = ReadFloat(); val.ShudderThreshold = ReadFloat(); val.ConfusionThreshold = ReadFloat(); val.ConfusionMultiplier = ReadFloat(); val.ConfusionTimeMax = ReadFloat(); val.StunThreshold = ReadFloat(); val.StunMultiplier = ReadFloat(); val.StunTimeMax = ReadFloat(); val.HasABrain = ReadBool(); val.HasNightVision = ReadBool(); val.RegistersPassiveThreats = ReadBool(); val.CanBeKnockedOut = ReadBool(); val.MaxUnconsciousTime = ReadFloat(); val.IgnoresNeedForWeapons = ReadBool(); val.AssaultPointOverridesSkirmishPointWhenFurtherThan = ReadFloat(); val.ViewDistance = ReadFloat(); val.HearingDistance = ReadFloat(); val.MaxFOV = ReadFloat(); val.StateSightRangeMults = ReadVector3(); val.StateHearingRangeMults = ReadVector3(); val.StateFOVMults = ReadVector3(); val.CanPickup_Ranged = ReadBool(); val.CanPickup_Melee = ReadBool(); val.CanPickup_Other = ReadBool(); val.MaxThreatingIFFReactionRange_Visual = ReadFloat(); val.MaxThreatingIFFReactionRange_Sonic = ReadFloat(); val.AggroSensitivityMultiplier = ReadFloat(); val.EntityRecognitionSpeedMultiplier = ReadFloat(); val.CombatTargetIdentificationSpeedMultiplier = ReadFloat(); val.DoesJointBreakKill_Head = ReadBool(); val.DoesJointBreakKill_Upper = ReadBool(); val.DoesJointBreakKill_Lower = ReadBool(); val.DoesSeverKill_Head = ReadBool(); val.DoesSeverKill_Upper = ReadBool(); val.DoesSeverKill_Lower = ReadBool(); val.DoesExplodeKill_Head = ReadBool(); val.DoesExplodeKill_Upper = ReadBool(); val.DoesExplodeKill_Lower = ReadBool(); val.CrawlSpeed = ReadFloat(); val.SneakSpeed = ReadFloat(); val.WalkSpeed = ReadFloat(); val.RunSpeed = ReadFloat(); val.TurnSpeed = ReadFloat(); val.MovementRotMagnitude = ReadFloat(); val.DamMult_Projectile = ReadFloat(); val.DamMult_Explosive = ReadFloat(); val.DamMult_Melee = ReadFloat(); val.DamMult_Piercing = ReadFloat(); val.DamMult_Blunt = ReadFloat(); val.DamMult_Cutting = ReadFloat(); val.DamMult_Thermal = ReadFloat(); val.DamMult_Chilling = ReadFloat(); val.DamMult_EMP = ReadFloat(); val.CanBeSurpressed = ReadBool(); val.SuppressionMult = ReadFloat(); val.CanBeGrabbed = ReadBool(); val.CanBeSevered = ReadBool(); val.CanBeStabbed = ReadBool(); val.MaxJointLimit = ReadFloat(); byte b = ReadByte(); if (b > 0) { val.LinkDamageMultipliers = new List(); for (int i = 0; i < b; i++) { val.LinkDamageMultipliers.Add(ReadFloat()); } } byte b2 = ReadByte(); if (b2 > 0) { val.LinkStaggerMultipliers = new List(); for (int j = 0; j < b2; j++) { val.LinkStaggerMultipliers.Add(ReadFloat()); } } byte b3 = ReadByte(); if (b3 > 0) { val.StartingLinkIntegrity = new List(); for (int k = 0; k < b3; k++) { val.StartingLinkIntegrity.Add(ReadVector2()); } } byte b4 = ReadByte(); if (b4 > 0) { val.StartingChanceBrokenJoint = new List(); for (int l = 0; l < b4; l++) { val.StartingChanceBrokenJoint.Add(ReadFloat()); } } byte b5 = ReadByte(); if (b5 > 0) { val.LinkSpawnChance = new List(); for (int m = 0; m < b5; m++) { val.LinkSpawnChance.Add(ReadFloat()); } } val.TargetCapacity = ReadInt(); val.TargetTrackingTime = ReadFloat(); val.NoFreshTargetTime = ReadFloat(); val.DoesAggroOnFriendlyFire = ReadBool(); val.UsesLinkSpawns = ReadBool(); val.TimeInSkirmishToAlert = ReadFloat(); return val; } public Damage ReadDamage(bool _moveReadPos = true) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) Damage val = new Damage(); val.point = ReadVector3(); val.Source_IFF = ReadInt(); val.Source_Point = ReadVector3(); val.Dam_Blunt = ReadFloat(); val.Dam_Piercing = ReadFloat(); val.Dam_Cutting = ReadFloat(); val.Dam_TotalKinetic = ReadFloat(); val.Dam_Thermal = ReadFloat(); val.Dam_Chilling = ReadFloat(); val.Dam_EMP = ReadFloat(); val.Dam_TotalEnergetic = ReadFloat(); val.Dam_Stunning = ReadFloat(); val.Dam_Blinding = ReadFloat(); val.hitNormal = ReadVector3(); val.strikeDir = ReadVector3(); val.edgeNormal = ReadVector3(); val.damageSize = ReadFloat(); val.Class = (DamageClass)ReadByte(); return val; } protected virtual void Dispose(bool _disposing) { if (!disposed) { if (_disposing) { buffer = null; readableBuffer = null; readPos = 0; } disposed = true; } } public void Dispose() { Dispose(_disposing: true); GC.SuppressFinalize(this); } } public class Tools { private static int enabled = 2; public static List connections = new List(); public static bool H3MPEnabled { get { if (enabled == 2) { enabled = (byte)(Chainloader.PluginInfos.ContainsKey("VIP.TommySoucy.H3MP") ? 1 : 0); } return enabled == 1; } } private static bool isServerRunning { get { if ((Object)(object)Mod.managerObject == (Object)null) { return false; } return true; } } private static bool isHosting { get { if ((Object)(object)Mod.managerObject == (Object)null) { return false; } if (ThreadManager.host) { return true; } return false; } } private static int[] playerIds { get { int[] array = new int[GameManager.players.Count]; int num = 0; foreach (KeyValuePair player in GameManager.players) { array[num] = player.Key; num++; } return array; } } private static int getLocalPlayerID => GameManager.ID; public static bool ServerRunning() { if (H3MPEnabled) { return isServerRunning; } return false; } public static bool IsClient() { if (ServerRunning()) { return isClient(); } return false; } private static bool isClient() { if ((Object)(object)Mod.managerObject == (Object)null) { return false; } if (!ThreadManager.host) { return true; } return false; } public static bool IsHost() { if (ServerRunning()) { return isHosting; } return false; } public static void SetLocalPlayerIFF(int iff) { GM.CurrentPlayerBody.SetPlayerIFF(iff); if (ServerRunning()) { setLocalPlayerIFF(iff); } } private static void setLocalPlayerIFF(int iff) { if (ThreadManager.host) { ServerSend.PlayerIFF(0, GM.CurrentPlayerBody.GetPlayerIFF()); } else { ClientSend.PlayerIFF(GM.CurrentPlayerBody.GetPlayerIFF()); } } public static int GetPlayerCount() { if (H3MPEnabled) { return GetNetworkPlayerCount(); } return 1; } private static int GetNetworkPlayerCount() { return GameManager.players.Count; } public static int[] GetPlayerIDs() { if (!H3MPEnabled) { return null; } return playerIds; } public static int GetLocalPlayerID() { if (!H3MPEnabled) { return -1; } return getLocalPlayerID; } public static PlayerData GetPlayerData(int clientID) { if (!H3MPEnabled) { return GetLocalPlayerData(); } return getPlayerData(clientID); } private static PlayerData getPlayerData(int clientID) { if (clientID == GameManager.ID) { PlayerData localPlayerData = GetLocalPlayerData(); localPlayerData.username = ((object)Mod.config["Username"]).ToString(); return localPlayerData; } PlayerData playerData = new PlayerData(); playerData.head = GameManager.players[clientID].head; playerData.username = GameManager.players[clientID].username; playerData.handLeft = GameManager.players[clientID].leftHand; playerData.handRight = GameManager.players[clientID].rightHand; playerData.iff = GameManager.players[clientID].IFF; playerData.health = GameManager.players[clientID].health; playerData.ID = clientID; return playerData; } private static PlayerData GetLocalPlayerData() { PlayerData playerData = new PlayerData(); playerData.username = "Player"; playerData.head = GM.CurrentPlayerBody.Head; playerData.handLeft = GM.CurrentPlayerBody.LeftHand; playerData.handRight = GM.CurrentPlayerBody.RightHand; playerData.iff = GM.CurrentPlayerBody.GetPlayerIFF(); playerData.health = GM.CurrentPlayerBody.Health; return playerData; } public static CustomConnection CreateCustomConnection(string connectionName) { CustomConnection customConnection = connections.FirstOrDefault((CustomConnection obj) => obj.Name == connectionName); CustomConnection customConnection2; if (customConnection != null) { customConnection2 = customConnection; NetworkingToolsPlugin.Logger.LogMessage((object)("Found Existing connection " + connectionName)); } else { customConnection2 = new CustomConnection(connectionName); connections.Add(customConnection2); NetworkingToolsPlugin.Logger.LogMessage((object)("Created new connection " + connectionName)); } customConnection2.Setup(); return customConnection2; } } [Serializable] public class PlayerData { public Transform head; public string username; public Transform handLeft; public Transform handRight; public int ID; public float health; public int iff; public static PlayerData GetPlayer(int clientID) { return new PlayerData { head = GameManager.players[clientID].head, username = GameManager.players[clientID].username, handLeft = GameManager.players[clientID].leftHand, handRight = GameManager.players[clientID].rightHand, ID = clientID, health = GameManager.players[clientID].health, iff = GameManager.players[clientID].IFF }; } } internal static class PluginInfo { internal const string NAME = "Networking Tools"; internal const string GUID = "Packer.NetworkingTools"; internal const string VERSION = "0.9.0"; } }