public Schematic(Player player, SchematicData data) { _player = player; SchematicData = data; foreach (SchematicSlotData slotData in SchematicData.Slots) { SchematicSlot slot = SchematicSlotFactory.Create(slotData); if (null == slot) { continue; } _slots.Add(slotData.Id, slot); _slotList.Add(slot); } #if UNITY_EDITOR _debugSlots = Slots.ToArray(); #endif }
protected override async UniTask OnExecuteAsync() { // Command: /saveSchematic if (!(Context.Actor is UnturnedUser uPlayer)) { throw new CommandWrongUsageException(Context); } if (Context.Parameters.Length <= 1 || string.IsNullOrWhiteSpace(Context.Parameters[0])) { await Context.Actor.PrintMessageAsync(m_StringLocalizer["CommandSaveSchematic:Help"]); //UnturnedChat.Say(player, "Invalid Syntax, use /SaveSchematic <name> <distance> [Optional Parameters: -Owner (Only gets structures placed by you) -Group (only gets structures placed by your current group), Input any Steamid64 to only get results from it"); return; } if (!int.TryParse(Context.Parameters[1], out var radius)) { await Context.Actor.PrintMessageAsync(m_StringLocalizer["CommandSaveSchematic:Help"]); //UnturnedChat.Say(player, "Invalid Syntax, use /SaveSchematic <name> <distance> [Optional Parameters: -Owner (Only gets structures placed by you) -Group (only gets structures placed by your current group), Input any Steamid64 to only get results from it"); return; } var name = Context.Parameters[0].Replace(" ", ""); var ConfigUseDB = m_Configuration.GetSection("UseDatabase").Get <bool>(); if (ConfigUseDB) { var Schematic = await m_SchematicsInfoRepo.FindSchematicAsync(name); if (Schematic != null) { throw new UserFriendlyException(m_StringLocalizer["CommandSaveSchematic:schematic_already_exists", new { Name = name }]); } } else { var Schematics = await m_DataStore.LoadAsync <SchematicsDataStore>("Schematics"); if (Schematics != null) { var FindTheSchematic = Schematics.Schematics.FirstOrDefault(i => i.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (FindTheSchematic != null) { throw new UserFriendlyException(m_StringLocalizer[ "CommandSaveSchematic:schematic_already_exists", new { Name = name }]); } } } // This is lazy, probably better way to do it then using Contains. var fullcommand = string.Join(" ", Context.Parameters).ToLower(); ulong SpecificSteamid64 = 0; var GroupOnly = false; if (fullcommand.Contains("-owner")) { SpecificSteamid64 = uPlayer.SteamId.m_SteamID; } if (fullcommand.Contains("-group")) { GroupOnly = true; } var match = new Regex(@"[0-9]{17}", RegexOptions.IgnoreCase).Match(fullcommand); if (match.Success && ulong.TryParse(match.Value, out var result)) { SpecificSteamid64 = result; } var setsteamid64string = SpecificSteamid64 == 0 ? "false" : SpecificSteamid64.ToString(); radius += 92; var Barricades = GetBarricadeTransforms(uPlayer, radius, SpecificSteamid64, GroupOnly, false); var Structures = GetStructureTransforms(uPlayer, radius, SpecificSteamid64, GroupOnly, false); //Logger.Log($"We have found Structures: {Structures.Count} and Barricades: {Barricades.Count}"); var MemStream = new MemoryStream(); var river = new BinaryWriter(MemStream); river.Write((byte)2); river.Write(ConfigUseDB); river.Write((uint)Provider.time); river.Write(uPlayer.Player.Transform.Position.X); river.Write(uPlayer.Player.Transform.Position.Y); river.Write(uPlayer.Player.Transform.Position.Z); river.Write(Barricades.Count); river.Write(Structures.Count); foreach (var bdata in Barricades) { river.Write((UInt16)bdata.bdata.barricade.id); river.Write((UInt16)bdata.bdata.barricade.health); river.Write((UInt16)bdata.bdata.barricade.state.Length); river.Write(bdata.bdata.barricade.state); river.Write(bdata.bdata.point.x); river.Write(bdata.bdata.point.y); river.Write(bdata.bdata.point.z); river.Write((byte)bdata.bdata.angle_x); river.Write((byte)bdata.bdata.angle_y); river.Write((byte)bdata.bdata.angle_z); river.Write((UInt64)bdata.bdata.owner); river.Write((UInt64)bdata.bdata.group); } foreach (var sdata in Structures) { river.Write(sdata.sdata.structure.id); river.Write(sdata.sdata.structure.health); river.Write(sdata.sdata.point.x); river.Write(sdata.sdata.point.y); river.Write(sdata.sdata.point.z); river.Write(sdata.sdata.angle_x); river.Write(sdata.sdata.angle_y); river.Write(sdata.sdata.angle_z); river.Write(sdata.sdata.owner); river.Write(sdata.sdata.group); } var ByteArray = MemStream.ToArray(); river.Dispose(); MemStream.Dispose(); var newSchematic = new SchematicData { Length = ByteArray.Length, Schematic = ByteArray, Name = name, MadeAt = DateTime.UtcNow, MadeBy = Context.Actor.FullActorName, MadeInServer = Provider.serverName }; if (ConfigUseDB) { await m_SchematicsInfoRepo.UploadSchematicAsync(newSchematic); } else { var Schematics = await m_DataStore.LoadAsync <SchematicsDataStore>("Schematics"); if (Schematics != null) { Schematics.Schematics.Add(newSchematic); await m_DataStore.SaveAsync("Schematics", Schematics); } else { Schematics = new SchematicsDataStore { Schematics = new List <SchematicData> { newSchematic } }; await m_DataStore.SaveAsync("Schematics", Schematics); } //SendMessageAndLog(player, $"Done, we have saved Structures: {Structures.Count} and Barricades: {Barricades.Count} to {(Schematics.Instance.Configuration.Instance.UseDatabase ? "Database and Files" : "Files")} called {name}.", $"Saved {Structures.Count + Barricades.Count} elements for {player.CharacterName} to {(Schematics.Instance.Configuration.Instance.UseDatabase ? "Database and Files" : "Files")} called {name}.") m_Logger.LogInformation( $"Saved {Structures.Count + Barricades.Count} elements for {uPlayer.FullActorName} to {(ConfigUseDB ? "Database" : "Files")} called {name}."); await uPlayer.PrintMessageAsync(m_StringLocalizer["CommandSaveSchematic:save_successful", new { StructureCount = Structures.Count, BarricadeCount = Barricades.Count, SaveType = ConfigUseDB ? "Database" : "Files", Name = name }]); } }
public async Task UploadSchematicAsync(SchematicData data) { await m_DbContext.Schematics.AddAsync(data); await m_DbContext.SaveChangesAsync(); }
public Player(int deviceId, SchematicData schematicData) { DeviceId = deviceId; Schematic = new Schematic(this, schematicData); }
public async Task <int> DeleteSchematicAsync(SchematicData data) { m_DbContext.Schematics.Remove(data); return(await m_DbContext.SaveChangesAsync()); }