using System; using System.Numerics; using Barotrauma.LuaCs.Configuration; using Barotrauma.LuaCs.Data; using FluentResults; using Microsoft.Xna.Framework; using Vector2 = Microsoft.Xna.Framework.Vector2; using Vector3 = Microsoft.Xna.Framework.Vector3; using Vector4 = Microsoft.Xna.Framework.Vector4; namespace Barotrauma.LuaCs.Services; public class ConfigInitializers : IService { // parameterless .ctor public ConfigInitializers() { } public void Dispose() { // stateless service return; } // stateless service public bool IsDisposed => false; private Result> CreateConfigEntry(IConfigInfo configInfo, Action, INetReadMessage> readHandler, Action, INetWriteMessage> writeHandler) where T : IEquatable { throw new NotImplementedException(); } private Result> CreateConfigList(IConfigInfo configInfo, Action, INetReadMessage> readHandler, Action, INetWriteMessage> writeHandler) where T : IEquatable { throw new NotImplementedException(); } public void RegisterTypeInitializers(IConfigService configService) { if (configService == null) throw new ArgumentNullException($"{nameof(RegisterTypeInitializers)}: {nameof(IConfigService)} is null."); /*configService.RegisterTypeInitializer>(this.CreateConfigBool); configService.RegisterTypeInitializer>(this.CreateConfigSbyte); configService.RegisterTypeInitializer>(this.CreateConfigByte); configService.RegisterTypeInitializer>(this.CreateConfigShort); configService.RegisterTypeInitializer>(this.CreateConfigUShort); configService.RegisterTypeInitializer>(this.CreateConfigInt32); configService.RegisterTypeInitializer>(this.CreateConfigUInt32); configService.RegisterTypeInitializer>(this.CreateConfigInt64); configService.RegisterTypeInitializer>(this.CreateConfigUInt64); configService.RegisterTypeInitializer>(this.CreateConfigFloat32); configService.RegisterTypeInitializer>(this.CreateConfigFloat64); configService.RegisterTypeInitializer>(this.CreateConfigFloat128); configService.RegisterTypeInitializer>(this.CreateConfigChar); configService.RegisterTypeInitializer>(this.CreateConfigString); configService.RegisterTypeInitializer>(this.CreateConfigColor); configService.RegisterTypeInitializer>(this.CreateConfigVector2); configService.RegisterTypeInitializer>(this.CreateConfigVector3); configService.RegisterTypeInitializer>(this.CreateConfigVector4);*/ } #region InitializerWrappers_NetworkInjected private void AssignValueConditional(T val, ISettingEntry inst) where T : IEquatable { #if SERVER if (inst.SyncType is NetSync.None or NetSync.ServerAuthority) throw new InvalidOperationException($"[Server] Tried to assign a net value to a type that does not support sync: {inst.SyncType}. Name: {inst.InternalName}, Package: {inst.OwnerPackage.Name}"); inst.TrySetValue(val); #else if (inst.SyncType is NetSync.None or NetSync.ClientOneWay) throw new InvalidOperationException($"[Client] Tried to assign a net value to a type that does not support sync: {inst.SyncType}. Name: {inst.InternalName}, Package: {inst.OwnerPackage.Name}"); inst.TrySetValue(val); #endif } private Result> CreateConfigBool(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadBoolean(), inst); }, (inst, writeMsg) => { writeMsg.WriteBoolean(inst.Value); }); } private Result> CreateConfigSbyte(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional((sbyte)readMsg.ReadInt16(), inst); }, (inst, writeMsg) => { writeMsg.WriteInt16((short)inst.Value); }); } private Result> CreateConfigByte(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional((byte)readMsg.ReadUInt16(), inst); }, (inst, writeMsg) => { writeMsg.WriteUInt16((byte)inst.Value); }); } private Result> CreateConfigShort(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadInt16(), inst); }, (inst, writeMsg) => { writeMsg.WriteInt16(inst.Value); }); } private Result> CreateConfigUShort(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadUInt16(), inst); }, (inst, writeMsg) => { writeMsg.WriteUInt16(inst.Value); }); } private Result> CreateConfigInt32(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadInt32(), inst); }, (inst, writeMsg) => { writeMsg.WriteInt32(inst.Value); }); } private Result> CreateConfigUInt32(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadUInt32(), inst); }, (inst, writeMsg) => { writeMsg.WriteUInt32(inst.Value); }); } private Result> CreateConfigInt64(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadInt64(), inst); }, (inst, writeMsg) => { writeMsg.WriteInt64(inst.Value); }); } private Result> CreateConfigUInt64(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadUInt64(), inst); }, (inst, writeMsg) => { writeMsg.WriteUInt64(inst.Value); }); } private Result> CreateConfigFloat32(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadSingle(), inst); }, (inst, writeMsg) => { writeMsg.WriteSingle(inst.Value); }); } private Result> CreateConfigFloat64(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadDouble(), inst); }, (inst, writeMsg) => { writeMsg.WriteDouble(inst.Value); }); } private Result> CreateConfigFloat128(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { var decimalArr = new int[4]; decimalArr[0] = readMsg.ReadInt32(); decimalArr[1] = readMsg.ReadInt32(); decimalArr[2] = readMsg.ReadInt32(); decimalArr[3] = readMsg.ReadInt32(); AssignValueConditional(new decimal(decimalArr), inst); }, (inst, writeMsg) => { var decimalArr = Decimal.GetBits(inst.Value); writeMsg.WriteInt32(decimalArr[0]); writeMsg.WriteInt32(decimalArr[1]); writeMsg.WriteInt32(decimalArr[2]); writeMsg.WriteInt32(decimalArr[3]); }); } private Result> CreateConfigChar(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional((char)readMsg.ReadUInt16(), inst); }, (inst, writeMsg) => { writeMsg.WriteUInt16(inst.Value); }); } private Result> CreateConfigString(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadString(), inst); }, (inst, writeMsg) => { writeMsg.WriteString(inst.Value); }); } private Result> CreateConfigColor(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(readMsg.ReadColorR8G8B8A8(), inst); }, (inst, writeMsg) => { writeMsg.WriteColorR8G8B8A8(inst.Value); }); } private Result> CreateConfigVector2(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(new Vector2(readMsg.ReadSingle(), readMsg.ReadSingle()), inst); }, (inst, writeMsg) => { writeMsg.WriteSingle(inst.Value.X); writeMsg.WriteSingle(inst.Value.Y); }); } private Result> CreateConfigVector3(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(new Vector3(readMsg.ReadSingle(), readMsg.ReadSingle(), readMsg.ReadSingle()), inst); }, (inst, writeMsg) => { writeMsg.WriteSingle(inst.Value.X); writeMsg.WriteSingle(inst.Value.Y); writeMsg.WriteSingle(inst.Value.Z); }); } private Result> CreateConfigVector4(IConfigInfo configInfo) { return CreateConfigEntry(configInfo, (inst, readMsg) => { AssignValueConditional(new Vector4( readMsg.ReadSingle(), readMsg.ReadSingle(), readMsg.ReadSingle(), readMsg.ReadSingle()), inst); }, (inst, writeMsg) => { writeMsg.WriteSingle(inst.Value.X); writeMsg.WriteSingle(inst.Value.Y); writeMsg.WriteSingle(inst.Value.Z); writeMsg.WriteSingle(inst.Value.W); }); } #endregion }