示例#1
0
        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
                                                                  }]);
            }
        }
示例#3
0
        public async Task UploadSchematicAsync(SchematicData data)
        {
            await m_DbContext.Schematics.AddAsync(data);

            await m_DbContext.SaveChangesAsync();
        }
示例#4
0
 public Player(int deviceId, SchematicData schematicData)
 {
     DeviceId  = deviceId;
     Schematic = new Schematic(this, schematicData);
 }
示例#5
0
 public async Task <int> DeleteSchematicAsync(SchematicData data)
 {
     m_DbContext.Schematics.Remove(data);
     return(await m_DbContext.SaveChangesAsync());
 }