Merge branch 'develop'
This commit is contained in:
+3
-2
@@ -12,11 +12,12 @@ indent_style = space
|
||||
indent_size = 4
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[{*.yaml,*.yml}]
|
||||
indent_size = 2
|
||||
|
||||
[*.json]
|
||||
ij_formatter_enabled = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
# C# files
|
||||
[*.cs]
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
# Single Player Tarkov - Server Project
|
||||
|
||||
This is the Server project for the Single Player Tarkov mod for Escape From Tarkov. It can be run locally to replicate responses to the modified Escape From Tarkov client
|
||||
|
||||
|
||||
# Table of Contents
|
||||
|
||||
- [Features](#features)
|
||||
- [Installation](#installation)
|
||||
- [Requirements](#requirements)
|
||||
- [Initial Setup](#initial-setup)
|
||||
- [Development](#development)
|
||||
- [Commands](#commands)
|
||||
- [Debugging](#debugging)
|
||||
- [Mod Debugging](#mod-debugging)
|
||||
- [Contributing](#contributing)
|
||||
- [Branches](#branchs)
|
||||
- [Pull Request Guidelines](#pull-request-guidelines)
|
||||
- [Tests](#tests)
|
||||
- [License](#license)
|
||||
|
||||
## Features
|
||||
|
||||
For a full list of features, please see [FEATURES.md](FEATURES.md)
|
||||
|
||||
## Installation
|
||||
|
||||
### Requirements
|
||||
|
||||
This project has been built in [Visual Studio](https://visualstudio.microsoft.com/) (VS) and [Rider](https://www.jetbrains.com/rider/) using [.NET](https://dotnet.microsoft.com/en-us/)
|
||||
|
||||
### Initial Setup
|
||||
|
||||
To prepare the project for development you will need to:
|
||||
|
||||
1. Run `git clone https://github.com/sp-tarkov/server-csharp.git server` to clone the repository
|
||||
2. Run `git lfs pull` to download LFS files locally.
|
||||
3. Open the `project/server-csharp.sln` file in Visual Studio or Rider
|
||||
4. Run `Build > Build Solution (CTRL + SHIFT + B)` in the IDE
|
||||
|
||||
## Development
|
||||
|
||||
### Commands
|
||||
|
||||
### Debugging
|
||||
|
||||
To debug the project in Visual Studio Code:
|
||||
1. Choose `Server` and `Spt Server Debug` in the debug dropdowns
|
||||
2. Choose `Debug > Start Debugging (F5)` to run the server
|
||||
|
||||
### Mod Debugging
|
||||
|
||||
To debug a server mod in Visual Studio, you can copy the mod DLL into the `user/mods` folder and then start the server
|
||||
|
||||
## Contributing
|
||||
|
||||
We're really excited that you're interested in contributing! Before submitting your contribution, please consider the following:
|
||||
|
||||
### Branches
|
||||
|
||||
- **master**
|
||||
The default branch used for the latest stable release. This branch is protected and typically is only merged with release branches.
|
||||
- **development**
|
||||
The main branch for server development. PRs should target this.
|
||||
|
||||
### Pull Request Guidelines
|
||||
|
||||
- **Keep Them Small**
|
||||
If you're fixing a bug, try to keep the changes to the bug fix only. If you're adding a feature, try to keep the changes to the feature only. This will make it easier to review and merge your changes.
|
||||
- **Perform a Self-Review**
|
||||
Before submitting your changes, review your own code. This will help you catch any mistakes you may have made.
|
||||
- **Remove Noise**
|
||||
Remove any unnecessary changes to white space, code style formatting, or some text change that has no impact related to the intention of the PR.
|
||||
- **Create a Meaningful Title**
|
||||
When creating a PR, make sure the title is meaningful and describes the changes you've made.
|
||||
- **Write Detailed Commit Messages**
|
||||
Bring out your table manners, speak the Queen's English and be on your best behaviour.
|
||||
|
||||
### Style Guide
|
||||
|
||||
TODO: style guidance
|
||||
Ensure that your code is automatically formatted whenever you save a file.
|
||||
|
||||
### Tests
|
||||
|
||||
We have a number of tests that are run automatically when you submit a pull request. You can run these tests locally by running The unit test sub-project. If you're adding a new feature or fixing a bug, please conceder adding tests to cover your changes so that we can ensure they don't break in the future.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the NCSA Open Source License. See the [LICENSE](LICENSE.md) file for details.
|
||||
@@ -0,0 +1,36 @@
|
||||
name: .NET Format
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- develop
|
||||
pull_request:
|
||||
branches-ignore:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
dotnet-format:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.BYPASS_WORKFLOW_PAT }}
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 9.0
|
||||
|
||||
- name: Restore Tool Dependencies
|
||||
run: dotnet tool install -g csharpier
|
||||
|
||||
- name: CSharpier Format
|
||||
run: csharpier format .
|
||||
|
||||
- uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
commit_message: .NET Format Style Fixes
|
||||
commit_user_name: Format Bot
|
||||
+1
-3
@@ -2,9 +2,7 @@
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
Server/user/
|
||||
SPTarkov.Server/user
|
||||
SPTarkov.Server/Assets
|
||||
Libraries/SPTarkov.Server.Assets/SPT_Data/checks.dat
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
|
||||
@@ -1,25 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<Import Project="..\Build.props" />
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
|
||||
<PackageReference Include="FastCloner" Version="3.3.4" />
|
||||
<PackageReference Include="FastCloner" Version="3.3.8" />
|
||||
<ProjectReference Include="..\Libraries\SPTarkov.Server.Core\SPTarkov.Server.Core.csproj" />
|
||||
<ProjectReference Include="..\Libraries\SPTarkov.Server.Assets\SPTarkov.Server.Assets.csproj" />
|
||||
<ProjectReference Include="..\Libraries\SPTarkov.Common\SPTarkov.Common.csproj" />
|
||||
<ProjectReference Include="..\Libraries\SPTarkov.DI\SPTarkov.DI.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="Assets\**">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -20,9 +20,8 @@ public class ClonerBenchmarks
|
||||
[GlobalSetup]
|
||||
public void Setup()
|
||||
{
|
||||
var jsonUtil = new JsonUtil([ new SptJsonConverterRegistrator() ]);
|
||||
var importer = new ImporterUtil(new MockLogger<ImporterUtil>(), new FileUtil(),
|
||||
jsonUtil);
|
||||
var jsonUtil = new JsonUtil([new SptJsonConverterRegistrator()]);
|
||||
var importer = new ImporterUtil(new MockLogger<ImporterUtil>(), new FileUtil(), jsonUtil);
|
||||
var loadTask = importer.LoadRecursiveAsync<Templates>("./Assets/database/templates/");
|
||||
loadTask.Wait();
|
||||
_templates = loadTask.Result;
|
||||
|
||||
@@ -6,7 +6,12 @@ namespace Benchmarks.Mock;
|
||||
|
||||
public class MockLogger<T> : ISptLogger<T>
|
||||
{
|
||||
public void LogWithColor(string data, LogTextColor? textColor = null, LogBackgroundColor? backgroundColor = null, Exception? ex = null)
|
||||
public void LogWithColor(
|
||||
string data,
|
||||
LogTextColor? textColor = null,
|
||||
LogBackgroundColor? backgroundColor = null,
|
||||
Exception? ex = null
|
||||
)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
+7
-9
@@ -1,11 +1,9 @@
|
||||
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Version>4.0.0-prerelease2</Version>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<RepositoryType>Git</RepositoryType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<Version>4.0.0-prerelease2</Version>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<RepositoryType>Git</RepositoryType>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v9.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v9.0": {
|
||||
"Ceciler.Launcher/1.0.0": {
|
||||
"dependencies": {
|
||||
"Ceciler.Interfaces": "1.0.0",
|
||||
"Mono.Cecil": "0.11.6"
|
||||
},
|
||||
"runtime": {
|
||||
"Ceciler.Launcher.dll": {}
|
||||
}
|
||||
},
|
||||
"Mono.Cecil/0.11.6": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/Mono.Cecil.Mdb.dll": {
|
||||
"assemblyVersion": "0.11.6.0",
|
||||
"fileVersion": "0.11.6.0"
|
||||
},
|
||||
"lib/netstandard2.0/Mono.Cecil.Pdb.dll": {
|
||||
"assemblyVersion": "0.11.6.0",
|
||||
"fileVersion": "0.11.6.0"
|
||||
},
|
||||
"lib/netstandard2.0/Mono.Cecil.Rocks.dll": {
|
||||
"assemblyVersion": "0.11.6.0",
|
||||
"fileVersion": "0.11.6.0"
|
||||
},
|
||||
"lib/netstandard2.0/Mono.Cecil.dll": {
|
||||
"assemblyVersion": "0.11.6.0",
|
||||
"fileVersion": "0.11.6.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ceciler.Interfaces/1.0.0": {
|
||||
"runtime": {
|
||||
"Ceciler.Interfaces.dll": {
|
||||
"assemblyVersion": "1.0.0.0",
|
||||
"fileVersion": "1.0.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"Ceciler.Launcher/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Mono.Cecil/0.11.6": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-f33RkDtZO8VlGXCtmQIviOtxgnUdym9xx/b1p9h91CRGOsJFxCFOFK1FDbVt1OCf1aWwYejUFa2MOQyFWTFjbA==",
|
||||
"path": "mono.cecil/0.11.6",
|
||||
"hashPath": "mono.cecil.0.11.6.nupkg.sha512"
|
||||
},
|
||||
"Ceciler.Interfaces/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net9.0",
|
||||
"framework": {
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "9.0.0"
|
||||
},
|
||||
"configProperties": {
|
||||
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -8,7 +8,10 @@ public static class MemberInfoExtensions
|
||||
public static string GetJsonName(this MemberInfo memberInfo)
|
||||
{
|
||||
return Attribute.IsDefined(memberInfo, typeof(JsonPropertyNameAttribute))
|
||||
? (Attribute.GetCustomAttribute(memberInfo, typeof(JsonPropertyNameAttribute)) as JsonPropertyNameAttribute).Name
|
||||
? (
|
||||
Attribute.GetCustomAttribute(memberInfo, typeof(JsonPropertyNameAttribute))
|
||||
as JsonPropertyNameAttribute
|
||||
).Name
|
||||
: memberInfo.Name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace SPTarkov.Common.Extensions;
|
||||
|
||||
public static class ObjectExtensions
|
||||
{
|
||||
private static readonly Dictionary<Type, Dictionary<string, PropertyInfo>> _indexedProperties = new();
|
||||
private static readonly Dictionary<Type, Dictionary<string, PropertyInfo>> _indexedProperties =
|
||||
new();
|
||||
private static readonly Lock _indexedPropertiesLockObject = new();
|
||||
|
||||
private static bool TryGetCachedProperty(Type type, string key, out PropertyInfo cachedProperty)
|
||||
@@ -14,7 +16,8 @@ public static class ObjectExtensions
|
||||
{
|
||||
if (!_indexedProperties.TryGetValue(type, out var properties))
|
||||
{
|
||||
properties = type.GetProperties().ToDictionary(prop => prop.GetJsonName(), prop => prop);
|
||||
properties = type.GetProperties()
|
||||
.ToDictionary(prop => prop.GetJsonName(), prop => prop);
|
||||
_indexedProperties.Add(type, properties);
|
||||
}
|
||||
|
||||
@@ -48,7 +51,7 @@ public static class ObjectExtensions
|
||||
return default;
|
||||
}
|
||||
|
||||
return (T?) cachedProperty.GetValue(obj);
|
||||
return (T?)cachedProperty.GetValue(obj);
|
||||
}
|
||||
|
||||
public static List<object> GetAllPropValuesAsList(this object? obj)
|
||||
@@ -60,6 +63,20 @@ public static class ObjectExtensions
|
||||
|
||||
foreach (var prop in list)
|
||||
{
|
||||
// Edge case
|
||||
if (Attribute.IsDefined(prop, typeof(JsonExtensionDataAttribute)))
|
||||
{
|
||||
if (prop.GetValue(obj) is not IDictionary<string, object> kvp)
|
||||
{
|
||||
// Not a dictionary, skip iterating over its keys/values
|
||||
continue;
|
||||
}
|
||||
|
||||
result.AddRange(kvp.Select(jsonExtensionKvP => jsonExtensionKvP.Value));
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
result.Add(prop.GetValue(obj));
|
||||
}
|
||||
|
||||
@@ -68,9 +85,37 @@ public static class ObjectExtensions
|
||||
|
||||
public static Dictionary<string, object?> GetAllPropsAsDict(this object? obj)
|
||||
{
|
||||
var props = obj.GetType().GetProperties();
|
||||
if (obj is null)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
return props.ToDictionary(prop => prop.Name, prop => prop.GetValue(obj));
|
||||
var resultDict = new Dictionary<string, object?>();
|
||||
foreach (var prop in obj.GetType().GetProperties())
|
||||
{
|
||||
// Edge case
|
||||
if (Attribute.IsDefined(prop, typeof(JsonExtensionDataAttribute)))
|
||||
{
|
||||
if (prop.GetValue(obj) is not IDictionary<string, object> kvp)
|
||||
{
|
||||
// Not a dictionary, skip iterating over its keys/values
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (var jsonExtensionKvP in kvp)
|
||||
{
|
||||
// Add contents of prop into dictionary we return
|
||||
resultDict.TryAdd(jsonExtensionKvP.Key, jsonExtensionKvP.Value);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Normal prop
|
||||
resultDict.Add(prop.Name, prop.GetValue(obj));
|
||||
}
|
||||
|
||||
return resultDict;
|
||||
}
|
||||
|
||||
public static T ToObject<T>(this JsonElement element)
|
||||
|
||||
@@ -8,7 +8,11 @@ public static class StringExtensions
|
||||
private static readonly Dictionary<string, Regex> _regexCache = new();
|
||||
private static readonly Lock _regexCacheLock = new();
|
||||
|
||||
public static string RegexReplace(this string source, [StringSyntax(StringSyntaxAttribute.Regex)] string regexString, string newValue)
|
||||
public static string RegexReplace(
|
||||
this string source,
|
||||
[StringSyntax(StringSyntaxAttribute.Regex)] string regexString,
|
||||
string newValue
|
||||
)
|
||||
{
|
||||
Regex regex;
|
||||
lock (_regexCacheLock)
|
||||
@@ -23,7 +27,11 @@ public static class StringExtensions
|
||||
return regex.Replace(source, newValue);
|
||||
}
|
||||
|
||||
public static bool RegexMatch(this string source, [StringSyntax(StringSyntaxAttribute.Regex)] string regexString, out Match? matchedString)
|
||||
public static bool RegexMatch(
|
||||
this string source,
|
||||
[StringSyntax(StringSyntaxAttribute.Regex)] string regexString,
|
||||
out Match? matchedString
|
||||
)
|
||||
{
|
||||
Regex regex;
|
||||
lock (_regexCacheLock)
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<Import Project="..\..\Build.props"/>
|
||||
|
||||
<Import Project="..\..\Build.props" />
|
||||
<PropertyGroup>
|
||||
<PackageId>SPTarkov.Common</PackageId>
|
||||
<Authors>Single Player Tarkov</Authors>
|
||||
@@ -14,13 +12,10 @@
|
||||
<OutputType>Library</OutputType>
|
||||
<IsPackable>true</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SemanticVersioning" Version="3.0.0"/>
|
||||
<PackageReference Include="SemanticVersioning" Version="3.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="..\..\LICENSE" Pack="true" Visible="false" PackagePath=""/>
|
||||
<None Include="..\..\LICENSE" Pack="true" Visible="false" PackagePath="" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,30 +1,22 @@
|
||||
namespace SPTarkov.DI.Annotations;
|
||||
|
||||
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
|
||||
public class Injectable(InjectionType injectionType = InjectionType.Scoped, Type? typeOverride = null, int typePriority = int.MaxValue) : Attribute
|
||||
public class Injectable(
|
||||
InjectionType injectionType = InjectionType.Scoped,
|
||||
Type? typeOverride = null,
|
||||
int typePriority = int.MaxValue
|
||||
) : Attribute
|
||||
{
|
||||
public InjectionType InjectionType
|
||||
{
|
||||
get;
|
||||
set;
|
||||
} = injectionType;
|
||||
public InjectionType InjectionType { get; set; } = injectionType;
|
||||
|
||||
public int TypePriority
|
||||
{
|
||||
get;
|
||||
set;
|
||||
} = typePriority;
|
||||
public int TypePriority { get; set; } = typePriority;
|
||||
|
||||
public Type? TypeOverride
|
||||
{
|
||||
get;
|
||||
set;
|
||||
} = typeOverride;
|
||||
public Type? TypeOverride { get; set; } = typeOverride;
|
||||
}
|
||||
|
||||
public enum InjectionType
|
||||
{
|
||||
Singleton,
|
||||
Transient,
|
||||
Scoped
|
||||
Scoped,
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ public class DependencyInjectionHandler
|
||||
|
||||
private bool _oneTimeUseFlag;
|
||||
|
||||
|
||||
public DependencyInjectionHandler(IServiceCollection serviceCollection)
|
||||
{
|
||||
_serviceCollection = serviceCollection;
|
||||
@@ -43,8 +42,9 @@ public class DependencyInjectionHandler
|
||||
public void AddInjectableTypesFromTypeList(IEnumerable<Type> types)
|
||||
{
|
||||
var typesToInject = types.Where(type =>
|
||||
Attribute.IsDefined(type, typeof(Injectable)) &&
|
||||
!_injectedTypeNames.ContainsKey($"{type.Namespace}.{type.Name}"));
|
||||
Attribute.IsDefined(type, typeof(Injectable))
|
||||
&& !_injectedTypeNames.ContainsKey($"{type.Namespace}.{type.Name}")
|
||||
);
|
||||
if (typesToInject.Any())
|
||||
{
|
||||
foreach (var type in typesToInject)
|
||||
@@ -58,16 +58,24 @@ public class DependencyInjectionHandler
|
||||
{
|
||||
if (_oneTimeUseFlag)
|
||||
{
|
||||
throw new Exception("Invalid usage of DependencyInjectionHandler, this is a one time use service!");
|
||||
throw new Exception(
|
||||
"Invalid usage of DependencyInjectionHandler, this is a one time use service!"
|
||||
);
|
||||
}
|
||||
_oneTimeUseFlag = true;
|
||||
var typeRefValues = _injectedTypeNames.Values
|
||||
.Select(t => new TypeRefContainer(((Injectable[]) Attribute.GetCustomAttributes(t, typeof(Injectable)))[0], t, t));
|
||||
var typeRefValues = _injectedTypeNames.Values.Select(t => new TypeRefContainer(
|
||||
((Injectable[])Attribute.GetCustomAttributes(t, typeof(Injectable)))[0],
|
||||
t,
|
||||
t
|
||||
));
|
||||
// All the components that have a type override, we need to find them and remove them before injecting everything
|
||||
var componentsToRemove = typeRefValues.Where(tr => tr.InjectableAttribute.TypeOverride != null).Select(tr =>
|
||||
string.IsNullOrEmpty(tr.InjectableAttribute.TypeOverride!.FullName)
|
||||
? $"{tr.InjectableAttribute.TypeOverride.Namespace}.{tr.InjectableAttribute.TypeOverride.Name}"
|
||||
: tr.InjectableAttribute.TypeOverride.FullName!)
|
||||
var componentsToRemove = typeRefValues
|
||||
.Where(tr => tr.InjectableAttribute.TypeOverride != null)
|
||||
.Select(tr =>
|
||||
string.IsNullOrEmpty(tr.InjectableAttribute.TypeOverride!.FullName)
|
||||
? $"{tr.InjectableAttribute.TypeOverride.Namespace}.{tr.InjectableAttribute.TypeOverride.Name}"
|
||||
: tr.InjectableAttribute.TypeOverride.FullName!
|
||||
)
|
||||
.ToHashSet();
|
||||
// All the components without the removed overrides
|
||||
var cleanedComponents = typeRefValues.Where(tr =>
|
||||
@@ -78,17 +86,27 @@ public class DependencyInjectionHandler
|
||||
return !componentsToRemove.Contains(name);
|
||||
});
|
||||
// All the components sorted and ready to be inserted into the DI container
|
||||
var sortedInjectableTypes = cleanedComponents.OrderBy(tRef => tRef.InjectableAttribute.TypePriority);
|
||||
var sortedInjectableTypes = cleanedComponents.OrderBy(tRef =>
|
||||
tRef.InjectableAttribute.TypePriority
|
||||
);
|
||||
|
||||
foreach (var typeRefToInject in sortedInjectableTypes)
|
||||
{
|
||||
var nodes = new Queue<TypeRefContainer>();
|
||||
nodes.Enqueue(typeRefToInject);
|
||||
foreach (var implementedInterface in typeRefToInject.Type.GetInterfaces()
|
||||
.Where(t => !t.Namespace.StartsWith("System")))
|
||||
foreach (
|
||||
var implementedInterface in typeRefToInject
|
||||
.Type.GetInterfaces()
|
||||
.Where(t => !t.Namespace.StartsWith("System"))
|
||||
)
|
||||
{
|
||||
nodes.Enqueue(new TypeRefContainer(typeRefToInject.InjectableAttribute, typeRefToInject.Type,
|
||||
implementedInterface));
|
||||
nodes.Enqueue(
|
||||
new TypeRefContainer(
|
||||
typeRefToInject.InjectableAttribute,
|
||||
typeRefToInject.Type,
|
||||
implementedInterface
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
while (nodes.Any())
|
||||
@@ -96,8 +114,13 @@ public class DependencyInjectionHandler
|
||||
var node = nodes.Dequeue();
|
||||
if (node.Type.BaseType != null && node.Type.BaseType != typeof(object))
|
||||
{
|
||||
nodes.Enqueue(new TypeRefContainer(node.InjectableAttribute, typeRefToInject.Type,
|
||||
node.Type.BaseType));
|
||||
nodes.Enqueue(
|
||||
new TypeRefContainer(
|
||||
node.InjectableAttribute,
|
||||
typeRefToInject.Type,
|
||||
node.Type.BaseType
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if (node.Type.IsGenericType)
|
||||
@@ -106,9 +129,11 @@ public class DependencyInjectionHandler
|
||||
}
|
||||
else
|
||||
{
|
||||
RegisterComponent(node.InjectableAttribute.InjectionType,
|
||||
RegisterComponent(
|
||||
node.InjectableAttribute.InjectionType,
|
||||
node.Type,
|
||||
node.ParentType);
|
||||
node.ParentType
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -118,7 +143,10 @@ public class DependencyInjectionHandler
|
||||
{
|
||||
try
|
||||
{
|
||||
_allLoadedTypes ??= AppDomain.CurrentDomain.GetAssemblies().SelectMany(t => t.GetTypes()).ToList();
|
||||
_allLoadedTypes ??= AppDomain
|
||||
.CurrentDomain.GetAssemblies()
|
||||
.SelectMany(t => t.GetTypes())
|
||||
.ToList();
|
||||
}
|
||||
catch (ReflectionTypeLoadException ex)
|
||||
{
|
||||
@@ -130,10 +158,12 @@ public class DependencyInjectionHandler
|
||||
var typeName = $"{typeRef.Type.Namespace}.{typeRef.Type.Name}";
|
||||
try
|
||||
{
|
||||
var matchedConstructors = _allConstructors.Where(c => c.GetParameters()
|
||||
.Any(p => p.ParameterType.IsGenericType &&
|
||||
p.ParameterType.GetGenericTypeDefinition().FullName == typeName
|
||||
)
|
||||
var matchedConstructors = _allConstructors.Where(c =>
|
||||
c.GetParameters()
|
||||
.Any(p =>
|
||||
p.ParameterType.IsGenericType
|
||||
&& p.ParameterType.GetGenericTypeDefinition().FullName == typeName
|
||||
)
|
||||
);
|
||||
|
||||
var constructorInfos = matchedConstructors.ToList();
|
||||
@@ -145,7 +175,11 @@ public class DependencyInjectionHandler
|
||||
foreach (var matchedConstructor in constructorInfos)
|
||||
{
|
||||
var constructorParams = matchedConstructor.GetParameters();
|
||||
foreach (var parameterInfo in constructorParams.Where(x => IsMatchingGenericType(x, typeName)))
|
||||
foreach (
|
||||
var parameterInfo in constructorParams.Where(x =>
|
||||
IsMatchingGenericType(x, typeName)
|
||||
)
|
||||
)
|
||||
{
|
||||
var parameters = parameterInfo.ParameterType.GetGenericArguments();
|
||||
var typedGeneric = typeRef.ParentType.MakeGenericType(parameters);
|
||||
@@ -166,8 +200,8 @@ public class DependencyInjectionHandler
|
||||
|
||||
private static bool IsMatchingGenericType(ParameterInfo paramInfo, string typeName)
|
||||
{
|
||||
return paramInfo.ParameterType.IsGenericType &&
|
||||
paramInfo.ParameterType.GetGenericTypeDefinition().FullName == typeName;
|
||||
return paramInfo.ParameterType.IsGenericType
|
||||
&& paramInfo.ParameterType.GetGenericTypeDefinition().FullName == typeName;
|
||||
}
|
||||
|
||||
private void RegisterComponent(
|
||||
@@ -188,7 +222,10 @@ public class DependencyInjectionHandler
|
||||
_serviceCollection.AddScoped(registrableInterface, implementationType);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(injectionType), $"Unknown injection type on {implementationType.Namespace}.{implementationType.Name}");
|
||||
throw new ArgumentOutOfRangeException(
|
||||
nameof(injectionType),
|
||||
$"Unknown injection type on {implementationType.Namespace}.{implementationType.Name}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,20 +234,23 @@ public class DependencyInjectionHandler
|
||||
var serviceKey = $"{implementationType.Namespace}.{implementationType.Name}";
|
||||
if (registrableInterface != implementationType)
|
||||
{
|
||||
_serviceCollection.AddSingleton(registrableInterface, (serviceProvider) =>
|
||||
{
|
||||
object service;
|
||||
lock (_injectedValuesLock)
|
||||
_serviceCollection.AddSingleton(
|
||||
registrableInterface,
|
||||
(serviceProvider) =>
|
||||
{
|
||||
if (!_injectedValues.TryGetValue(serviceKey, out service))
|
||||
object service;
|
||||
lock (_injectedValuesLock)
|
||||
{
|
||||
service = serviceProvider.GetService(implementationType);
|
||||
_injectedValues.Add(serviceKey, service);
|
||||
if (!_injectedValues.TryGetValue(serviceKey, out service))
|
||||
{
|
||||
service = serviceProvider.GetService(implementationType);
|
||||
_injectedValues.Add(serviceKey, service);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return service;
|
||||
});
|
||||
return service;
|
||||
}
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<Import Project="..\..\Build.props" />
|
||||
|
||||
<PropertyGroup>
|
||||
<PackageId>SPTarkov.DI</PackageId>
|
||||
<Authors>Single Player Tarkov</Authors>
|
||||
@@ -14,17 +12,16 @@
|
||||
<OutputType>Library</OutputType>
|
||||
<IsPackable>true</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.5" />
|
||||
<PackageReference
|
||||
Include="Microsoft.Extensions.DependencyInjection.Abstractions"
|
||||
Version="9.0.5"
|
||||
/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SPTarkov.Common\SPTarkov.Common.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="..\..\LICENSE" Pack="true" Visible="false" PackagePath="" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -2,10 +2,7 @@
|
||||
|
||||
public class SingletonStateHolder<T>
|
||||
{
|
||||
public T State
|
||||
{
|
||||
get;
|
||||
}
|
||||
public T State { get; }
|
||||
|
||||
public SingletonStateHolder(T state)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection.Emit;
|
||||
using System.Reflection.Emit;
|
||||
using HarmonyLib;
|
||||
|
||||
namespace SPTarkov.Reflection.CodeWrapper;
|
||||
@@ -30,35 +27,76 @@ public class CodeGenerator
|
||||
return new CodeInstruction(code.OpCode) { labels = GetLabelList(code) };
|
||||
}
|
||||
|
||||
if (code.OpCode == OpCodes.Ldfld || code.OpCode == OpCodes.Ldflda || code.OpCode == OpCodes.Stfld)
|
||||
if (
|
||||
code.OpCode == OpCodes.Ldfld
|
||||
|| code.OpCode == OpCodes.Ldflda
|
||||
|| code.OpCode == OpCodes.Stfld
|
||||
)
|
||||
{
|
||||
return new CodeInstruction(code.OpCode, AccessTools.Field(code.CallerType, code.OperandTarget as string)) { labels = GetLabelList(code) };
|
||||
return new CodeInstruction(
|
||||
code.OpCode,
|
||||
AccessTools.Field(code.CallerType, code.OperandTarget as string)
|
||||
)
|
||||
{
|
||||
labels = GetLabelList(code),
|
||||
};
|
||||
}
|
||||
|
||||
if (code.OpCode == OpCodes.Call || code.OpCode == OpCodes.Callvirt)
|
||||
{
|
||||
return new CodeInstruction(code.OpCode, AccessTools.Method(code.CallerType, code.OperandTarget as string, code.Parameters)) { labels = GetLabelList(code) };
|
||||
return new CodeInstruction(
|
||||
code.OpCode,
|
||||
AccessTools.Method(code.CallerType, code.OperandTarget as string, code.Parameters)
|
||||
)
|
||||
{
|
||||
labels = GetLabelList(code),
|
||||
};
|
||||
}
|
||||
|
||||
if (code.OpCode == OpCodes.Box)
|
||||
{
|
||||
return new CodeInstruction(code.OpCode, code.CallerType) { labels = GetLabelList(code) };
|
||||
return new CodeInstruction(code.OpCode, code.CallerType)
|
||||
{
|
||||
labels = GetLabelList(code),
|
||||
};
|
||||
}
|
||||
|
||||
if (code.OpCode == OpCodes.Br || code.OpCode == OpCodes.Brfalse || code.OpCode == OpCodes.Brtrue || code.OpCode == OpCodes.Brtrue_S
|
||||
|| code.OpCode == OpCodes.Brfalse_S || code.OpCode == OpCodes.Br_S)
|
||||
if (
|
||||
code.OpCode == OpCodes.Br
|
||||
|| code.OpCode == OpCodes.Brfalse
|
||||
|| code.OpCode == OpCodes.Brtrue
|
||||
|| code.OpCode == OpCodes.Brtrue_S
|
||||
|| code.OpCode == OpCodes.Brfalse_S
|
||||
|| code.OpCode == OpCodes.Br_S
|
||||
)
|
||||
{
|
||||
return new CodeInstruction(code.OpCode, code.OperandTarget) { labels = GetLabelList(code) };
|
||||
return new CodeInstruction(code.OpCode, code.OperandTarget)
|
||||
{
|
||||
labels = GetLabelList(code),
|
||||
};
|
||||
}
|
||||
|
||||
if (code.OpCode == OpCodes.Ldftn)
|
||||
{
|
||||
return new CodeInstruction(code.OpCode, AccessTools.Method(code.CallerType, code.OperandTarget as string, code.Parameters)) { labels = GetLabelList(code) };
|
||||
return new CodeInstruction(
|
||||
code.OpCode,
|
||||
AccessTools.Method(code.CallerType, code.OperandTarget as string, code.Parameters)
|
||||
)
|
||||
{
|
||||
labels = GetLabelList(code),
|
||||
};
|
||||
}
|
||||
|
||||
if (code.OpCode == OpCodes.Newobj)
|
||||
{
|
||||
return new CodeInstruction(code.OpCode, code.CallerType.GetConstructors().FirstOrDefault(x => x.GetParameters().Length == code.Parameters.Length)) { labels = GetLabelList(code) };
|
||||
return new CodeInstruction(
|
||||
code.OpCode,
|
||||
code.CallerType.GetConstructors()
|
||||
.FirstOrDefault(x => x.GetParameters().Length == code.Parameters.Length)
|
||||
)
|
||||
{
|
||||
labels = GetLabelList(code),
|
||||
};
|
||||
}
|
||||
|
||||
throw new ArgumentException($"Code with OpCode {code.OpCode.ToString()} is not supported.");
|
||||
@@ -71,6 +109,6 @@ public class CodeGenerator
|
||||
return [];
|
||||
}
|
||||
|
||||
return [ (Label)code.GetLabel() ];
|
||||
return [(Label)code.GetLabel()];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,22 +6,32 @@ public class CodeWithLabel : Code
|
||||
{
|
||||
public Label Label { get; }
|
||||
|
||||
public CodeWithLabel(OpCode opCode, Label label) : base(opCode)
|
||||
public CodeWithLabel(OpCode opCode, Label label)
|
||||
: base(opCode)
|
||||
{
|
||||
Label = label;
|
||||
}
|
||||
|
||||
public CodeWithLabel(OpCode opCode, Label label, object operandTarget) : base(opCode, operandTarget)
|
||||
public CodeWithLabel(OpCode opCode, Label label, object operandTarget)
|
||||
: base(opCode, operandTarget)
|
||||
{
|
||||
Label = label;
|
||||
}
|
||||
|
||||
public CodeWithLabel(OpCode opCode, Label label, Type callerType) : base(opCode, callerType)
|
||||
public CodeWithLabel(OpCode opCode, Label label, Type callerType)
|
||||
: base(opCode, callerType)
|
||||
{
|
||||
Label = label;
|
||||
}
|
||||
|
||||
public CodeWithLabel(OpCode opCode, Label label, Type callerType, object operandTarget, Type[] parameters = null) : base(opCode, callerType, operandTarget, parameters)
|
||||
public CodeWithLabel(
|
||||
OpCode opCode,
|
||||
Label label,
|
||||
Type callerType,
|
||||
object operandTarget,
|
||||
Type[] parameters = null
|
||||
)
|
||||
: base(opCode, callerType, operandTarget, parameters)
|
||||
{
|
||||
Label = label;
|
||||
}
|
||||
|
||||
@@ -25,13 +25,17 @@ public abstract class AbstractPatch
|
||||
_finalizerList = GetPatchMethods(typeof(PatchFinalizerAttribute));
|
||||
_ilManipulatorList = GetPatchMethods(typeof(PatchIlManipulatorAttribute));
|
||||
|
||||
if (_prefixList.Count == 0
|
||||
if (
|
||||
_prefixList.Count == 0
|
||||
&& _postfixList.Count == 0
|
||||
&& _transpilerList.Count == 0
|
||||
&& _finalizerList.Count == 0
|
||||
&& _ilManipulatorList.Count == 0)
|
||||
&& _ilManipulatorList.Count == 0
|
||||
)
|
||||
{
|
||||
throw new Exception($"{_harmony.Id}: At least one of the patch methods must be specified");
|
||||
throw new Exception(
|
||||
$"{_harmony.Id}: At least one of the patch methods must be specified"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,8 +55,14 @@ public abstract class AbstractPatch
|
||||
var T = GetType();
|
||||
var methods = new List<HarmonyMethod>();
|
||||
|
||||
foreach (var method in T.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public |
|
||||
BindingFlags.DeclaredOnly))
|
||||
foreach (
|
||||
var method in T.GetMethods(
|
||||
BindingFlags.Static
|
||||
| BindingFlags.NonPublic
|
||||
| BindingFlags.Public
|
||||
| BindingFlags.DeclaredOnly
|
||||
)
|
||||
)
|
||||
{
|
||||
if (method.GetCustomAttribute(attributeType) != null)
|
||||
{
|
||||
|
||||
@@ -1,27 +1,17 @@
|
||||
namespace SPTarkov.Reflection.Patching
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class PatchPrefixAttribute : Attribute
|
||||
{
|
||||
}
|
||||
public class PatchPrefixAttribute : Attribute { }
|
||||
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class PatchPostfixAttribute : Attribute
|
||||
{
|
||||
}
|
||||
public class PatchPostfixAttribute : Attribute { }
|
||||
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class PatchTranspilerAttribute : Attribute
|
||||
{
|
||||
}
|
||||
public class PatchTranspilerAttribute : Attribute { }
|
||||
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class PatchFinalizerAttribute : Attribute
|
||||
{
|
||||
}
|
||||
public class PatchFinalizerAttribute : Attribute { }
|
||||
|
||||
[AttributeUsage(AttributeTargets.Method)]
|
||||
public class PatchIlManipulatorAttribute : Attribute
|
||||
{
|
||||
}
|
||||
public class PatchIlManipulatorAttribute : Attribute { }
|
||||
}
|
||||
|
||||
@@ -1,26 +1,21 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<Import Project="..\..\Build.props"/>
|
||||
|
||||
<PropertyGroup>
|
||||
<PackageId>SPTarkov.Reflection</PackageId>
|
||||
<Authors>Single Player Tarkov</Authors>
|
||||
<Description>Reflection library for the Single Player Tarkov server.</Description>
|
||||
<Copyright>Copyright (c) Single Player Tarkov 2025</Copyright>
|
||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||
<PackageProjectUrl>https://sp-tarkov.com</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/sp-tarkov/server-csharp</RepositoryUrl>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<OutputType>Library</OutputType>
|
||||
<IsPackable>true</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="..\..\LICENSE" Pack="true" Visible="false" PackagePath=""/>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="HarmonyX" Version="2.14.0"/>
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="..\..\Build.props" />
|
||||
<PropertyGroup>
|
||||
<PackageId>SPTarkov.Reflection</PackageId>
|
||||
<Authors>Single Player Tarkov</Authors>
|
||||
<Description>Reflection library for the Single Player Tarkov server.</Description>
|
||||
<Copyright>Copyright (c) Single Player Tarkov 2025</Copyright>
|
||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||
<PackageProjectUrl>https://sp-tarkov.com</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/sp-tarkov/server-csharp</RepositoryUrl>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<OutputType>Library</OutputType>
|
||||
<IsPackable>true</IsPackable>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\LICENSE" Pack="true" Visible="false" PackagePath="" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="HarmonyX" Version="2.14.0" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -1,272 +0,0 @@
|
||||
{
|
||||
"assort-missing_loyalty_level_object": "تشكيلة التاجر {{traderId}} لا تحتوي على بيانات أغراض المستوى الولائي, سيتم اختصار الإزالة لتشكيلات المهام",
|
||||
"assort-missing_quest_assort_unlock": "تعذر البحث عن ملف تشكيلة المهام للتاجر {{traderName}} لفتح مهمة {{questName}}. عند اكمال هذه المهمة لن يمنح اي جائزة فتح غرض للشراء عند التاجر",
|
||||
"assort-missing_questassort": "تشكيلة التاجر %s لا تحتوي على ملف json لتشكيلة المهام, يتم الإزالة لتشكيلات المهام",
|
||||
"baseclass-item_not_found": "العنصر %s غير موجود في ذاكرة التخزين المؤقتة لقاعدة العناصر, تم إعادة توليد التخزين المؤقت",
|
||||
"baseclass-item_not_found_failed": "العنصر %s لا يزال غير موجود في ذاكرة التخزين المؤقتة الرئيسية بعد إعادة التوليد",
|
||||
"baseclass-missing_db_no_cache": "كانت قاعدة البيانات فارغة، تعذر إنشاء ذاكرة تخزين مؤقتة لقاعدة العناصر",
|
||||
"bleeding_edge_build": "بليدينق ايدج",
|
||||
"bot-compatibility_check_missing_props": "تعذر التحقق من العنصر: {{id}}{{name}} في الفُتْحَة: {{slot}} يمكن تجهيزه, إلا انه يفتقد قيمة ملكية",
|
||||
"bot-generation_failed": "فشل إنشاء البوت. يرجى الرجوع إلى سجل الخادم للحصول على مزيد من التفاصيل",
|
||||
"bot-incompatible_ammo_for_weapon_falling_back_to_default": "الذخيرة غير متوافقة {{chosenAmmo}} تم العثور عليها لـ {{weaponId}} - {{weaponName}}، العودة إلى الأساسي: {{defaultAmmo}}",
|
||||
"bot-invalid_item_compatibility_check": "غير قادر على التحقق من توافق العنصر مع العناصر المجهزة، العنصر المطلوب: {{itemTpl}} في الخانة: {{slot}} عنصر غير صالح",
|
||||
"bot-item_missing_props_property": "العنصر {{itemTpl}} {{name}} يفتقد إلى خاصية _props\n\n\n\n\n\n\n",
|
||||
"bot-item_spawn_limit_reached_skipping_item": "{{botRole}} غير قادر على توليد العنصر {{itemName}} بعد {{attempts}} محاولات، تجاهل حد التوليد",
|
||||
"bot-loot_type_not_found": "فشل النهب في ذاكرة التخزين المؤقت: {{lootType}} على البوت: {{botRole}}، كان pmc: {{isPmc}}",
|
||||
"bot-missing_application_context": "لا يمكن لـ applicationContext العثور على قيمة %s. هل قمت بإعادة تشغيل الخادم دون إعادة تشغيل اللعبة؟\n\n\n\n\n\n\n",
|
||||
"bot-missing_cartridge_slot": "غير قابل لإضافة المشط للسلاح لان الإضافة لا تحتوي على مشط اسطواني%s، سوف اتخطى",
|
||||
"bot-missing_container_with_tpl": "تعذر العثور على قالب الحاوية مع التفاصيل: %s",
|
||||
"bot-missing_equipment_settings": "بوت ال {{botRole}} يفقد اعدادات المعدات: غير قابل على حصول قيمة لل {{setting}}، الرجوع الى الاساس وهو: {{defaultValue}}",
|
||||
"bot-missing_equipment_settings_property": "{{botRole}} يفتقد قيمة إعدادات المعدات لـ: {{setting}} يتم الاعاده الى القيمة الافتراضية {{defaultValue}}",
|
||||
"bot-missing_item_template": "تعذر العثور على قالب العنصر باستخدام النمط: %s",
|
||||
"bot-missing_saved_match_info": "getBotCap() غير قادر على حفظ معلومات المطابقة، العودة إلى الإعدادات الافتراضية. هل قمت بإعادة تشغيل الخادم وليس العميل؟",
|
||||
"bot-missing_weapon_preset": "تعذر العثور على إعداد مُعيّن للسلاح باستخدام النمط : %s",
|
||||
"bot-mod_not_in_slot_filter_list": "الوضع : {{modId}} غير موجود في عامل تصفية العناصر المتوافقة للفتحة : '{{modSlot}}' للعنصر: {{parentName}}، تخطي - {{botRole}}",
|
||||
"bot-mod_slot_missing_from_item": "الخانة '{{modSlot}}' غير موجودة للعنصر: {{parentId}} {{parentName}} على {{botRole}}",
|
||||
"bot-no_ammo_found_in_bot_json": "غير قادر على العثور على الذخيرة لنوع البوت: %s",
|
||||
"bot-no_bot_cap_found_for_location": "ا توجد حدود لحد الموقع للروبوت %s، يتم استخدام القيمة الافتراضية ",
|
||||
"bot-no_bot_type_in_cache": "تحذير - ذاكرة التخزين المؤقتة للبوت لا تحتوي على معرفة حول النوع : %s ",
|
||||
"bot-no_caliber_data_for_weapon_falling_back_to_default": "تعذر العثور على بيانات العيار ل {{weaponId}} - {{weaponName}}, يتم الرجوع إلى ذخيرة الافتراضية: {{defaultAmmo}}",
|
||||
"bot-no_compatible_camora_ammo_found": "تعذر العثور على ذخيرة متوافقة للفتحة: %s. تم تخطي ملء فتحات الكامورا.\n\n\n\n\n\n\n",
|
||||
"bot-no_item_template_found_when_adding_mod": "تعذر العثور على قالب عنصر التعديل بالنمط: {{modId}} للفتحة {{modSlot}}\n\n\n\n\n\n\n",
|
||||
"bot-no_spawn_chance_defined_for_equipment_slot": "لم يتم تحديد فرصة الظهور للمعدات: %s\n\n\n\n\n\n\n",
|
||||
"bot-single_bot_generation_not_found_in_cache": "البوت: %s غير موجود في الذاكرة التخزين المؤقتة، يتم إنشاء نسخة جديدة، قد يتسبب ذلك في تشوش في اللعبة.\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_add_mod_item_invalid": "التعديل: {{itemName}} ليس عنصرًا صالحًا، تعذر إضافته إلى الفتحة: '{{modSlot}}' على العنصر: {{parentItemName}}, تخطي العملية.\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_add_mods_to_weapon_missing_ammo_slot": "تعذر إضافة التعديلات إلى السلاح: {{weaponName}} {{weaponId}} لأنه يفتقد إلى الفتحات أو الذخائر أو الحجرات - {{botRole}}\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_edit_limits_of_unknown_map": "تعذر تعديل حدود البوت للخريطة: %s لأنه لا يمكن العثور عليها.\n\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_filter_mod_slot_all_blacklisted": "تعذر إنشاء حوض ديناميكي لتعديلات الأسلحة بعد تصفية القائمة السوداء لجميع التعديلات للفتحة: %s، يتم تجاهل القائمة السوداء وإعادة إنشاء الحوض.\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_filter_mods_all_blacklisted": "تعذر تصفية التعديلات للفتحة: {{slotName}} على {{itemName}} لأن جميعها تمت إدراجها في القائمة السوداء، يتم تجاهل القائمة السوداء.\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_find_ammo_item": "تعذر العثور على قالب للذخيرة باستخدام النمط: %s\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_find_bot_in_cache": "تعذر العثور على الروبوت في الذاكرة التخزين المؤقتة بالاسم: %s\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_find_default_magazine_item": "تعذر العثور على قالب المخزن: %s في قاعدة البيانات\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_find_loot_n_value_for_bot": "تعذر العثور على قيمة N للغنيمة للبوت: %s، يتم استخدام قيمة N للسكاف بدلاً من ذلك.\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_find_magazine_item": "تعذر العثور على قالب المخزن: %s في قاعدة البيانات\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_find_spawn_limits_fallback_to_defaults": "تعذر العثور على حدود الظهور للدور: %s، يتم الرجوع إلى القيم الافتراضية\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_get_bot_difficulty_fallback_to_assault": "تعذر العثور على البوت: {{botType}} صعوبة {{difficulty}}، يتم استخدام صعوبة الهجوم كبديل\n\n\n\n\n\n\n",
|
||||
"bot-unable_to_get_bot_fallback_to_assault": "تعذر العثور على روبوت: %s JSON، يتم استخدام بوت الهجوم كبديل\n\n\n\n\n\n\n",
|
||||
"bot-weapon_contains_invalid_item": "مرفق السلاح المطلوبة: '{{modSlot}}' على سلاح: {{weaponTpl}} لديه عنصر غير صالح: {{modName}}",
|
||||
"bot-weapon_generated_incorrect_using_default": "تم إنشاء السلاح %s بشكل غير صحيح، يتم الرجوع إلى إعداد السلاح، انظر الخطأ أعلاه.\n\n\n\n\n\n\n",
|
||||
"bot-weapon_missing_magazine_or_chamber": "السلاح بالنمط: {{weaponId}} لا يحتوي على مخزن أو حجرة - {{botRole}}\n\n\n\n\n\n\n",
|
||||
"bot-weapon_missing_mod_slot": "الفتحة: {{modSlot}} لا توجد للسلاح: {{weaponId}} {{weaponName}} على {{botRole}}\n\n\n\n\n\n\n",
|
||||
"bot-weapons_required_slot_missing_item": "كانت الفتحة المطلوبة '{{modSlot}}' على {{modName}} {{slotId}} فارغة على {{botRole}}\n\n\n\n\n\n\n",
|
||||
"client_request": "[طلب السيرفر] %s\n\n\n\n\n\n\n",
|
||||
"client_request_ip": "[طلب الجهاز] {{ip}} {{url}}",
|
||||
"customisation-item_already_purchased": "تم شراء العنصر الخاص بالملابس {{itemId}} {{itemName}} بالفعل.\n\n\n\n\n\n\n",
|
||||
"customisation-unable_to_find_clothing_item_in_inventory": "لم يتم العثور على عنصر الملابس في المخزون بالرقم: %s\n\n\n\n\n\n\n",
|
||||
"customisation-unable_to_find_suit_by_id": "تعذر العثور على عرض لبيع ملابس التاجر بالرقم: %s\n\n\n\n\n\n\n",
|
||||
"dialog-missing_item_template": "تعذر العثور على نمط العنصر {{tpl}} في قاعدة البيانات، لا يمكن إرسال رسالة من نوع {{type}}، يتم تخطي العملية.\n\n\n\n\n\n\n\n",
|
||||
"event-unhandled_event": "[حدث غير معالج] %s\n\n\n\n\n\n\n",
|
||||
"executing_startup_callbacks": "الخادم: تنفيذ استدعاءات بدء التشغيل...\n\n\n\n\n\n\n",
|
||||
"fence-unable_to_find_assort_by_id": "تعذر العثور على تشكيلة فينس للمعرف: %s\n\n\n\n\n\n\n",
|
||||
"fixer-updated_pockets": "تم تحديث العنصر 'جيب' إلى الإصدار الجديد 18876 مع 3 فتحات خاصة.\n\n\n\n\n\n\n",
|
||||
"gameevent-bot_not_found": "addEventGearToScavs() - تعذر العثور على بوت من النوع %s في قاعدة البيانات، تخطي العملية.\n\n\n\n\n\n\n",
|
||||
"gameevent-no_gear_data": "لا توجد بيانات معدات في ملف التكوين seasonalevents.json للحدث %s.\n\n\n\n\n\n\n",
|
||||
"health-healing_item_not_found": "غير قادر على العثور على عنصر الشفاء %s في مخزون اللاعب",
|
||||
"health-unable_to_find_item_to_consume": "غير قادر على العثور على العنصر القابل للاستهلاك %s في مخزون اللاعب",
|
||||
"hideout-missing_recipe_for_area": "تعذر العثور على الوصفة: %s لنوع المنطقة.\n\n\n\n\n\n\n\n\n\n",
|
||||
"hideout-missing_recipe_in_db": "تعذر العثور على الوصفة بالمعرف: %s\n\n\n\n\n\n\n",
|
||||
"hideout-no_bitcoins_to_collect": "لا توجد بيتكوينات جاهزة للاستلام.\n\n\n\n\n\n\n",
|
||||
"hideout-unable_to_find_area": "غير قادر على العثور على منطقة المخبأ: %s في الملف الشخصي",
|
||||
"hideout-unable_to_find_area_in_database": "غير قادر على العثور على المنطقة: %s في قاعدة البيانات",
|
||||
"hideout-unable_to_find_item_in_inventory": "فشل العثور على العنصر في المخزون بمعرف %s",
|
||||
"hideout-unable_to_find_item_to_remove_from_area": "غير قادر على العثور على أي عنصر لإزالته من الخانة في المنطقة: %s",
|
||||
"hideout-unable_to_find_production_in_profile_by_recipie_id": "تعذر العثور على معرف وصفة المنتج: %s في الملف الشخصي",
|
||||
"hideout-unable_to_find_scav_case_recipie_in_database": "فشل العثور على وصفة صندوق السكاف بالمعرف: %s في قاعدة البيانات",
|
||||
"hideout-unable_to_find_scavcase_requested_item_in_profile_inventory": "تعذر العثور على العنصر: %s طلب من قبل صندوق السكاف",
|
||||
"hideout-unhandled_remove_item_from_area_request": "محاولة بدون معالجة لإزالة العنصر من منطقة المخبأ: %s",
|
||||
"http-unknown_error": "حدث خطأ غير معروف",
|
||||
"importing_database": "استيراد قاعدة البيانات...",
|
||||
"importing_database_finish": "انتهت عملية استيراد قاعدة البيانات",
|
||||
"importing_spt_configs": "استيراد الإعدادات...",
|
||||
"inraid-missing_standing_for_kill": "لم يتم العثور على قتل {{victimSide}}:{{victimRole}}",
|
||||
"insurance-missing_insurance_price_multiplier": "لم يتم العثور على مضاعف تأمين للتاجر: %s، تحقق من وجوده في InInsurance Config.js، تراجع إلى القيمة الافتراضية من: 0.3",
|
||||
"inventory-edit_trader_item": "غير قادر على تعديل عنصر التجار",
|
||||
"inventory-examine_item_does_not_exist": "فحص العنصر() - لا يوجد معرف ب %s",
|
||||
"inventory-fill_container_failed": "ملئ الحاوية MapWithItem() عاد بخطأ %s",
|
||||
"inventory-get_item_size_item_not_found_by_tpl": "الحصول على حجم لتخزين العنصر: %s غير موجود",
|
||||
"inventory-invalid_item_missing_from_db": "غير قادر على الحصول على العنصر: %s من قاعدة البيانات",
|
||||
"inventory-invalid_move_to_container": "محاولة نقل العنصر بمعرف الخانة: {{slotId}} إلى {{container}}، تم منع الفساد في الملف الشخصي",
|
||||
"inventory-item_missing_props_property": "رقم العنصر: اسم {{itemTpl}}: {{itemName}} يفتقد بعض الخصائص، لا يمكن الحصول على حجم له",
|
||||
"inventory-item_to_toggle_missing_upd": "عنصر المخزون مع الرقم _ %s يفتقد لكائن معلق، إضافة",
|
||||
"inventory-missing_stash_size": "غير قادر على تحديد حجم مكان التخزين لأنه لم يتم العثور على مكان للتخزين في مخزون اللاعب",
|
||||
"inventory-no_stash_space": "لا توجد مساحة تخزين كافية",
|
||||
"inventory-return_default_size": "تغيير القيمة الافتراضية للعنصر %s إلى حجم 1x1",
|
||||
"inventory-stash_not_found": "غير قادر على العثور على مكان تخزين %s في قاعدة البيانات",
|
||||
"inventory-unable_to_fill_container": "[خارج الحدود] للعنصر: {{id}}؛ رسالة الخطأ: {{error}}",
|
||||
"inventory-unable_to_find_item": "غير قادر على العثور على العنصر مع التفاعل: %s في قاعدة البيانات أو السوق السوداء",
|
||||
"inventory-unable_to_find_stash": "لم يتم العثور على مخبأ التخزين",
|
||||
"inventory-unable_to_toggle_item_not_found": "غير قادر على تشغيل عنصر المخزون بالمعرف: %s، العنصر غير موجود",
|
||||
"item-durability_value_invalid_use_default": "الحصول على قيمة الجودة لتصليح العنصر %s قيمة المتانة للعنصر غير صالحة، إرجاع القيمة الافتراضية إلى 1",
|
||||
"launcher-missing_property": "ملف اللاعب: %s ناقص خاصية الوصف \"descriptionLocaleKey\"",
|
||||
"launcher-profile-edgeofdarkness": "نفس \"بريبير تو اسكيب\" زائد: حجم صندوق التخزين (10x68) , معدات / بنود إضافية , سمعة بداية أعلى مع التجار , 1000 دولار و 250 يورو",
|
||||
"launcher-profile_leftbehind": "نفس الأساسي زائد: حجم صندوق التخزين (10x38) , معدات / بنود إضافية و 500 دولار",
|
||||
"launcher-profile_preparetoescape": "نفس \"لفت بيهايند\" زائد: حجم صندوق التخزين (10x48) , معدات / بنود إضافية , سمعة بداية أعلى مع التجار و 250 يورو",
|
||||
"launcher-profile_sptdeveloper": "ملف اللاعب مبرمج , مستوى اللاعب يبدأ من 69 , كثير من الروبل / دولار/ يورو , تبدأ USEC مع جميع المهام الجاهزة للبدء , BEAR يبدأ مع جميع المهام الجاهزة للتسليم و بالاكلافا ضد الاضرار",
|
||||
"launcher-profile_spteasystart": "كثير من الروبل / دولار/ يورو , بعض مهارات اللاعب بالمستوى 20 , الحد الأقصى لسمعة التجار , مستوى اللاعب يبدأ من 15 و المهام غير مكتملة",
|
||||
"launcher-profile_sptzerotohero": "ابدأ بدون شيء تقريبا، لا يوجد روبل / دولار/ يورو، بدون سمعة تجار ، سكين واحد و المهام غير مكتملة",
|
||||
"launcher-profile_standard": "مساوية لحجم صندوق التخزين الأساسي (10x28) و 500,000 روبل",
|
||||
"linux_use_priviledged_port_non_root": "لا يمكن ربط العمليات غير الجذرية بالمنافذ تحت 1024",
|
||||
"location-containers_generated_success": "مجموع الحاويات الثابتة %s تم إنشاؤها",
|
||||
"location-critical_error_see_log": "حدث خطأ حرج عند توليد الغنائم ، راجع سجل الخادم للحصول على التفاصيل",
|
||||
"location-dynamic_items_spawned_success": "مجموع العناصر الديناميكية التي تم نشرها %s",
|
||||
"location-generated_success": "%s موقع تم إنشاؤه",
|
||||
"location-missing_dynamic_template": "لا تحتوي نقطة التكاثر الديناميكية المختارة %s على قالب، تخطي",
|
||||
"location-missing_root_item": "فشل إنشاء العنصر() ، جذر العنصر فارغ ، تفاصيل: {{tpl}}، الوالد: {{parentId}}",
|
||||
"location-preset_not_found": "لم يتم العثور على الإعداد المسبق لـ {{tpl}}، الافتراضي: {{defaultId}} الاسم: {{defaultName}}، اسم الوالد: {{parentId}}",
|
||||
"location-spawn_point_count_requested_vs_found": "{{requested}} تم طلب مناطق الانتشار بينما {{found}} متوفرة {{mapName}}",
|
||||
"location-spawnpoint_missing_items": "نقطة التكاثر الديناميكية المختارة %s لا تحتوي على عناصر، تخطي",
|
||||
"location-unable_to_find_airdrop_drop_config_of_type": "غير قادر على العثور على إعدادات ضبط إسقاط الطائرة للنوع: %s، العودة إلى نوع الإسقاط: مختلط ",
|
||||
"location-unable_to_fix_broken_waves_missing_base": "%s هو json أساسي مفقود، نحن نتجنب إصلاح إصلاح موجة الخريطة إصلاحات",
|
||||
"location-unable_to_reparent_item": "فشل إنشاء العنصر() ، غير قادر على إعادة الربط مع الاصل {{tpl}}، معرف الاصل: {{parentId}}",
|
||||
"loot-item_missing_parentid": "العنصر: %s يفتقد قيمة parentId، لا يمكن استخدام العنصر كغنيمة.\n\n\n\n\n\n\n",
|
||||
"loot-non_item_picked_as_sealed_weapon_crate_reward": "سلاح غير صالح: %s، تم اختياره كمكافأة لصندوق السلاح المختوم، تعذر إنشاء الغنيمة.\n\n\n\n\n\n\n",
|
||||
"mailsend-missing_parent": "تعذر العثور على عنصر برقم الفتحة من: المسكن للرسالة إلى: {{traderId}}، المرسل: {{sender}}\n\n\n\n\n\n\n",
|
||||
"mailsend-missing_trader": "تعذر إرسال رسالة من النوع: {{messageType}} إلى اللاعب: {{sessionId}}، نظرًا لأن التاجر المحدد كان فارغًا.\n\n\n\n\n\n\n",
|
||||
"mod-send_bundle_url": "[حزمة] %s",
|
||||
"modloader-async_mod_error": "محمل الإضافات: حدث خطأ عند تحميل إضافة %s غير متزامنة",
|
||||
"modloader-checked": "تم التحقق\n\n\n\n\n\n\n",
|
||||
"modloader-checking_mod": "يتم التحقق: %s\n\n\n\n\n\n\n",
|
||||
"modloader-cyclic_dependency": "تم اكتشاف تبعية دائرية. يجب حل هذا الخطأ. لا يمكن للخادم أن يبدأ حتى يتم حل هذا وسيتم إيقاف التشغيل.\n\n\n\n\n\n\n",
|
||||
"modloader-dependency_container_not_initalized": "تم طلب حاوية التبعية ولكنها لم تتم مبادرتها.\n\n\n\n\n\n\n",
|
||||
"modloader-error_parsing_mod_load_order": "حدث خطأ أثناء تحليل ترتيب المودات.\n\n\n\n\n\n\n",
|
||||
"modloader-incompatibilities_not_string_array": "يجب أن يكون Mod %s package.json الخاصية 'incompatibilities' مصفوفة سلاسل",
|
||||
"modloader-incompatible_mod_found": "المود {{author}}-{{name}} غير متوافق مع {{incompatibleModName}}.\n\n\n\n\n\n\n",
|
||||
"modloader-installing_external_dependencies": "تثبيت الاعتمادات للإضافة: {{name}} بواسطة: {{author}}",
|
||||
"modloader-installing_external_dependencies_disabled": "الإضافة: {{name}}: {{author}} تتطلب اعتمادات خارجية ولكن الميزة معطلة حاليًا، اذهب إلى \"{{configPath}}\", اضبط \"{{configOption}}\" إلى \"صحيح\" و أعد تشغيل الخادم.\nبتمكينك هذا فإنك تتحمل كل المسؤولية عن ما سيتم تحميله من قبل {{name}} إلى جهازك.",
|
||||
"modloader-invalid_version_property": "ملف package.json للمود %s يحتوي على سلسلة إصدار غير صالحة.\n\n\n\n\n\n\n",
|
||||
"modloader-is_client_mod": "المود (%s) هو مود خاص بالعميل ويجب وضعه في المجلد التالي: /spt/bepinex/plugins\n\n\n\n\n\n\n",
|
||||
"modloader-load_order_conflict": "{{modOneName}} و {{modTwoName}} لديهما متطلبات تعارض في ترتيب التحميل، لا يمكن للخادم أن يبدأ حتى يتم حل هذا وسيتم إيقاف التشغيل.\n\n\n\n\n\n\n",
|
||||
"modloader-loaded_mod": "الإضافة: الإصدار {{name}}: {{version}} من قبل {{author}} تم تحميلها",
|
||||
"modloader-loading_mods": "محمل الإضافات: جاري تحميل %s إضافة إلى الخادم...",
|
||||
"modloader-main_property_not_js": "يجب أن تكون الخاصية الرئيسية للإضافة %s ملفًا من نوع .js في الملف package.json",
|
||||
"modloader-main_property_points_to_nothing": "الخاصية الرئيسية للملف package.json الخاص بالإضافة %s يشير إلى ملف غير موجود",
|
||||
"modloader-missing_dependency": "الإضافة {{mod}} تتطلب تثبيت {{modDependency}}.",
|
||||
"modloader-missing_package_json": "الإضافة (%s) تفتقد ملف package.json الخاص بها. تأكد من التحقق من صفحة تحميل الإضافة للحصول على تعليمات التثبيت",
|
||||
"modloader-missing_package_json_property": "ملف package.json الخاص بالإضافة {{modName}} يتطلب خاصية {{prop}}",
|
||||
"modloader-mod_has_no_main_property": "محمل الإضافات: الإضافة (%s) غير متوافقة. لأنه تفتقر لخاصية 'رئيسية'",
|
||||
"modloader-mod_order_error": "محمل الإضافات: تم العثور على أخطاء في ملف ترتيب الإضافات order.json، سيتم استخدام الترتيب الافتراضي",
|
||||
"modloader-mod_order_missing": "محمل الإضافات: ملف ترتيب الإضافات order.json مفقود ، جاري الإنشاء...",
|
||||
"modloader-mod_order_missing_from_json": "محمل الإضافات: الإضافة %s مفقودة من ملف ترتيب الإضافات order.json, جاري الإضافة",
|
||||
"modloader-no_mods_loaded": "تم العثور على أخطاء مع الإضافات, لا توجد إضافة ليتم تحميلها",
|
||||
"modloader-not_correct_mod_folder": "يوجد مجلد بالاسم (%s) في مجلد المودات الخاص بك. لقد قمت بتثبيت المود بشكل غير صحيح. قد تكون قد قمت بفك ضغط محتويات المود مباشرة في مجلد المودات بالخطأ. يرجى الرجوع إلى صفحة الأسئلة الشائعة على الموقع وصفحة مركز المودات لمعرفة كيفية تثبيت المودات بشكل صحيح.\n\n\n\n\n\n\n",
|
||||
"modloader-outdated_dependency": "الإضافة {{mod}} يتطلب إصدار {{modDependency}} {{requiredVersion}}. الإصدار المثبت الحالي هو {{currentVersion}}",
|
||||
"modloader-skipped_mod": "تخطي تحميل الإضافة: {{mod}}",
|
||||
"modloader-user_mod_folder_missing": "محمل الإضافات: المجلد user/mod مفقود ، جاري الإنشاء...",
|
||||
"modloader-visited": "تم زيارتها",
|
||||
"modloader-x_duplicates_found": "أنت تحاول تحميل أكثر من نسخة واحدة من الإضافة %s. جاري تخطي الجميع.",
|
||||
"openzone-unable_to_find_map": "غير قادر على إضافة مناطق إلى الموقع: %s لأنه غير موجود",
|
||||
"payment-not_enough_money_to_complete_transation": "الملف الشخصي ليس لديه ما يكفي من المال لإكمال المعاملة: مطلوب {{amountToPay}}، لديه {{amountAvailable}}",
|
||||
"player-attempt_to_increment_skill_with_negative_value": "غير قادر على زيادة المهارة: %s بمقدار سلبي",
|
||||
"pmcresponse-victim_negative_10": "كنت بعيد عن الكمبيوتر!!",
|
||||
"pmcresponse-victim_negative_11": "بلغت عليك يا غشاش",
|
||||
"pmcresponse-victim_negative_12": "بس جبتني عشان اللاق",
|
||||
"pmcresponse-victim_negative_13": "لازم العب SPT عشان ابعد نفسي من غشاشين زيك",
|
||||
"pmcresponse-victim_negative_14": "لو كنت أعرف الخريطة بشكل أفضل لكنت فزت",
|
||||
"pmcresponse-victim_negative_15": "كامبر حيوان ثاني",
|
||||
"pmcresponse-victim_negative_16": "لو كانت معركة عادلة كنت سأفوز",
|
||||
"pmcresponse-victim_negative_17": "أتمنى أن تبيع أرباحك للتاجر الخطأ",
|
||||
"pmcresponse-victim_negative_18": "آمل أن تسجل أرباحك في المزاد بسعر خاطئ",
|
||||
"pmcresponse-victim_negative_19": "1 مقابل 1، يا مهووس سأفوز",
|
||||
"pmcresponse-victim_negative_20": "تعطل مسدسي وإلا كنت قتلتك",
|
||||
"pmcresponse-victim_negative_21": "يا فار",
|
||||
"pmcresponse-victim_negative_22": "أنت تختبئ في الزاوية مثل الفار",
|
||||
"pmcresponse-victim_negative_23": "أتمنى أن ترتطم إصبع قدمك بقطعة أثاث",
|
||||
"pmcresponse-victim_negative_24": "لماذا قتلتني، سأخبر أمي",
|
||||
"pmcresponse-victim_negative_25": "سأخبر الآدمن عليك",
|
||||
"pmcresponse-victim_negative_6": "بكم الهاك؟",
|
||||
"pmcresponse-victim_negative_7": ":(",
|
||||
"pmcresponse-victim_positive_1": "تصويبة رائعة",
|
||||
"pmcresponse-victim_positive_10": "كان يجب علي ألا اظهر رأسي",
|
||||
"pmcresponse-victim_positive_11": "لقد تمكنت مني",
|
||||
"pmcresponse-victim_positive_12": "قتل جيد، سأحصل عليك في المرة القادمة",
|
||||
"pmcresponse-victim_positive_13": "كانت لديك زوايا جيدة علي",
|
||||
"pmcresponse-victim_positive_14": "سأحصل عليك في المرة القادمة",
|
||||
"pmcresponse-victim_positive_15": "دگيتلي طابع :alien:",
|
||||
"pmcresponse-victim_positive_16": "أنت قاتل بدم بارد. لم تكن لدي أي فرصة ضدك",
|
||||
"pmcresponse-victim_positive_17": "حسناً، هذا كان منصفاً، رمية جيدة",
|
||||
"pmcresponse-victim_positive_18": "استمتع بغنائمي",
|
||||
"pmcresponse-victim_positive_19": "معركة جيدة",
|
||||
"pmcresponse-victim_positive_2": "تصويبة عظيمة",
|
||||
"pmcresponse-victim_positive_20": "أنت لاعب تصعب هزيمته",
|
||||
"pmcresponse-victim_positive_21": "عمل رائع، كانت هذه غدرة جميلة",
|
||||
"pmcresponse-victim_positive_22": "كان يجب أن أكون أكثر حذراً، عمل جيد",
|
||||
"pmcresponse-victim_positive_23": "لقد كنت متسرعًا للغاية، كان يجب أن أحيط وانتظر",
|
||||
"pmcresponse-victim_positive_24": "سأتعلم من هذا، أحسنت",
|
||||
"pmcresponse-victim_positive_25": "اللعنة، ظننت أنني أصبتك",
|
||||
"pmcresponse-victim_positive_26": "كفو",
|
||||
"pmcresponse-victim_positive_27": "كفو يالذيب",
|
||||
"pmcresponse-victim_positive_3": "قتل جيّد",
|
||||
"pmcresponse-victim_positive_4": "قتل مستحق، أحسنت",
|
||||
"pmcresponse-victim_positive_5": "قتلة حظ",
|
||||
"pmcresponse-victim_positive_6": "معركة جيدة",
|
||||
"pmcresponse-victim_positive_7": "كان ذلك عادلاً، قتل جميل",
|
||||
"pmcresponse-victim_positive_8": "أنت رامي ماهر، هذا مؤكد",
|
||||
"pmcresponse-victim_positive_9": "لعبة جيدة",
|
||||
"port_already_in_use": "المنفذ %s قيد الاستخدام مسبقا، تحقق مما إذا كان الخادم قيد التشغيل بالفعل",
|
||||
"profile-unable_to_find_profile_by_id_cannot_delete": "غير قادر على حذف الملف الشخصي بالمعرف: %s، لا يوجد ملف تعريف له",
|
||||
"profile_save_callback_error": "خطأ أثناء تنفيذ: onBeforeSaveCallback: {{callback}}, {{error}}",
|
||||
"profile_saved": "تم حفظ تغييرات الملف الشخصي %s",
|
||||
"quest-compare_operator_unhandled": "لم يتم التعامل مع عامل التشغيل %s بشكل افتراضي [loyaltyRequirementCheck()]",
|
||||
"quest-handover_wrong_item": "غير قادر على تسليم العنصر للمهمة {{questId}}، التسليم المتوقع: {{requiredTpl}} ولكن تم تسليمه: {{handedInTpl}}",
|
||||
"quest-item_not_found_in_inventory": "العنصر الذي يحتوي على %s غير موجود في المخزون [changeItemStack()]",
|
||||
"quest-no_skill_found": "لم يتم العثور على المهارة %s",
|
||||
"quest-reward_type_not_handled": "نوع مكافأة المهمة: {{rewardType}} لم يتم التعامل معه من أجل المهمة: {{questId}} بالاسم: {{questName}}",
|
||||
"quest-unable_to_find_compare_condition": "طريقة مقارنة غير معروفة: %s",
|
||||
"quest-unable_to_find_matching_hideout_production": "غير قادر على العثور على مخطط مطابق للمهمة: {{questName}}، تم العثور على عدد: {{matchCount}}",
|
||||
"ragfair-invalid_player_offer_request": "غير قادر على تقديم العرض، الطلب غير صالح",
|
||||
"ragfair-missing_barter_scheme": "فشلت محاولة توليد عرض للتجار في السوق السوداء في العثور على مخطط مقايضة لمعرف العنصر: {{itemId}} tpl: {{tpl}} على {{name}}",
|
||||
"ragfair-no_trader_assorts_cant_generate_flea_offers": "غير قادر على إنشاء عروض مزاد للتاجر %s، لم يتم العثور على تشكيلة",
|
||||
"ragfair-offer_no_longer_exists": "العرض لم يعد متوفرًا",
|
||||
"ragfair-offer_not_found_in_profile_short": "العرض غير موجود في الملف الشخصي",
|
||||
"ragfair-offer_not_found_unable_to_hide": "معرف العرض: %s غير موجود، غير قادر على إخفاء العرض",
|
||||
"ragfair-unable_to_find_item_in_inventory": "غير قادر على العثور على العنصر بالمعرف: {{id}} في المخزون",
|
||||
"ragfair-unable_to_find_locale_by_key": "تعذر العثور على لغة EFT بالمفتاح: %s",
|
||||
"ragfair-unable_to_find_offer_to_remove": "لم نتمكن من العثور على العرض وإزالته بالمعرف: %s",
|
||||
"ragfair-unable_to_find_requested_items_in_inventory": "يتعذر علينا العثور على أي عناصر مطلوبة في المخزون",
|
||||
"ragfair-unable_to_pay_commission_fee": "غير قادر على دفع رسوم العمولة:%s روبل",
|
||||
"ragfair-unable_to_place_offer_with_no_requirements": "غير قادر على وضع عرض دون متطلبات",
|
||||
"ragfair-unable_to_purchase_0_count_item": "يتعذر علينا شراء العنصر: %s بعدد 0",
|
||||
"repair-unable_to_find_item_in_db": "غير قادر على إصلاح العنصر: %s، لا يمكن العثور عليه في قاعدة بيانات العناصر، لا يمكن إضافة نقاط مهارة الإصلاح",
|
||||
"route_onupdate_no_response": "عند التحديث: الطريق %s لا يبلغ عن النجاح أو الفشل",
|
||||
"scav-missing_karma_settings": "غير قادر على الحصول على إعدادات الكارما للمستوى %s",
|
||||
"scheduled_event_failed_to_run": "الحدث المجدول: '%s' فشل في التشغيل.",
|
||||
"seasonal-missing_equipment_slot_on_bot": "غير قادر على إزالة معدات عيد الميلاد من: {{equipmentSlot}} بما أنه لا يمكن العثور عليها في البوت: {{botRole}}",
|
||||
"seasonal-missing_loot_container_slot_on_bot": "غير قادر على إزالة غنائم عيد الميلاد من: {{lootContainer}} بما أنه لا يمكن العثور عليه في البوت: {{botRole}}",
|
||||
"server_running": "الخادم قيد التشغيل، لا تغلقه أثناء تشغيل SPT",
|
||||
"server_start_meme_1": "عِش اضحك حُب",
|
||||
"server_start_meme_10": "جاري تشغيل عملية التعدين على هذه الحاسبة... وداعاً كارت الشاشة",
|
||||
"server_start_meme_12": "نحن نحاول الوصول إليك حول ضمان سيارتك الموسع",
|
||||
"server_start_meme_13": "ඞ ... مريب",
|
||||
"server_start_meme_2": "كارتوني :(",
|
||||
"server_start_meme_22": "تحسّن",
|
||||
"server_start_meme_23": "SPT يحافظ على سلامة عذريتك منذ عام 2018",
|
||||
"server_start_meme_3": "إذا كنت تسمعني، عليك أن تستيقظ",
|
||||
"server_start_meme_4": "لا تنس الإعجاب والاشتراك",
|
||||
"server_start_meme_5": "هل رأيت صفحة الميم الخاصة بنا؟",
|
||||
"server_start_meme_6": "أنا أقسم للإله بأنه من الأفضل لك أن لا تستخدم نسخة ريباك فت گيرل",
|
||||
"server_start_meme_7": "طبعت الصور... \"شلونك\"",
|
||||
"server_start_meme_8": "وقت المشي... \" اطلع اخذ فرة\"",
|
||||
"server_start_meme_9": "أخوية؟ شبيك يمعود؟",
|
||||
"server_start_player_active_botreload_skill": "شخصيتك لديها مهارة 'BotReload' نشطة، سيؤدي هذا إلى إعادة تلقيم الأسلحة بسرعة غير طبيعية، تجاهل هذه الرسالة إن كانت مقصودة",
|
||||
"server_start_success": "نتمنى لك لعباً سعيداً",
|
||||
"started_webserver_success": "بدأ خادم الويب في %s",
|
||||
"unhandled_response": "[لم تتم المعالجة][%s]",
|
||||
"unknown_request": "طلب غير معروف!",
|
||||
"validation_error_decode": "غير قادر على فك تشفير الملف checks.dat تم تخطي التحقق من صحة الملف.",
|
||||
"validation_error_exception": "حصل استثناء أثناء محاولة التحقق من صحة الملف: %s",
|
||||
"validation_error_file": "فشلت عملية التحقق من صحة الملف %s",
|
||||
"validation_not_found": "لم يتم العثور على فحص الملف checks.dat تم تخطي التحقق من صحة الملف.",
|
||||
"watermark-commercial_use_prohibited": "الاستخدام التجاري ممنوع",
|
||||
"watermark-discord_url": "https://discord.sp-tarkov.com",
|
||||
"watermark-do_not_report": "لا تقم بالإبلاغ",
|
||||
"watermark-free_of_charge": "هذا العمل مجاني",
|
||||
"watermark-modding_disabled": "تم إيقاف دعم الإضافات في هذه النسخة",
|
||||
"watermark-no_support": "لا يوجد دعم",
|
||||
"watermark-not_an_issue": "هذه ليست بمشكلة",
|
||||
"watermark-paid_scammed": "إذا كنت تدفع المال، فقد خدعت",
|
||||
"watermark-report_issues_to": "قم بالتبليغ عن المشاكل",
|
||||
"watermark-testing_build": "هذه النسخة تجريبية",
|
||||
"watermark-use_at_own_risk": "استخدم على مسؤوليتك الخاصة",
|
||||
"websocket-message_send_failed_with_error": "[WS] فشل إرسال الرسالة، مع الخطأ: %s",
|
||||
"websocket-message_sent": "تم الإرسال"
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
{
|
||||
"assort-missing_loyalty_level_object": "stripQuestAssort(): Sortiment for Trader {{traderId}} indeholder ikke loyal_level_items data, springer over fjernelse af questsortiment",
|
||||
"assort-missing_quest_assort_unlock": "Kan ikke finde tilsvarende {{traderName}} questsortiment unlock til questen: {{questName}}. Fuldføring af denne quest vil ikke belønne en trader vare til køb",
|
||||
"assort-missing_questassort": "stripQuestAssort(): Sortiment for Trader: %s indeholder ikke en questassort json, springer over fjernelse af questsortiment",
|
||||
"baseclass-item_not_found": "Item %s blev ikke fundet i item base cache, regenerer cache",
|
||||
"baseclass-item_not_found_failed": "Item %s blev stadig ikke fundet i base cache efter regenerering",
|
||||
"baseclass-missing_db_no_cache": "Databasen var tom, ude af stand til at generere en item base cache",
|
||||
"bleeding_edge_build": "BLEEDINGEDGE",
|
||||
"bot-bot-cache_has_zero_bots_of_requested_type": "ADVARSEL - Bot cache har ikke en præ-genereret bot af typen %s, skal genereres, konfigurere bot.json config ejendom (presetBatch) til at være større",
|
||||
"bot-bot_preset_count_value_missing": "Kan ikke finde en forudindstillede tæller til at generere for bot: %s, standard til 30",
|
||||
"bot-compatibility_check_missing_props": "Kan ikke validere item. {{id}} {{name}} i slot: {{slot}} kan udstyres, det mangler en _props værdi",
|
||||
"bot-generation_failed": "bot generering mislykkedes, se server loggen for yderligere oplysninger",
|
||||
"bot-incompatible_ammo_for_weapon_falling_back_to_default": "Inkompatibel ammunition {{chosenAmmo}} blev fundet for {{weaponId}} - {{weaponName}}, falder tilbage til standard: {{defaultAmmo}}",
|
||||
"bot-invalid_item_compatibility_check": "Kan ikke tjekke item kompatibilitet med udstyrede items, ønsket item: {{itemTpl}} i slot: {{slot}} er ikke et gyldigt item",
|
||||
"bot-item_missing_props_property": "Genstand {{itemTpl}} {{name}} mangler en _props egenskab",
|
||||
"bot-item_spawn_limit_reached_skipping_item": "{{botRole}} Kan ikke spawne item {{itemName}} efter {{attempts}} forsøg. Ignorerer spawngrænse",
|
||||
"bot-loot_type_not_found": "Loot cache mislykkedes for loot: {{lootType}} på bot: {{botRole}}, var en pmc: {{isPmc}}",
|
||||
"bot-missing_application_context": "ApplikationKontekst kunne ikke finde %s værdi. Har du genstartet serveren uden at genstarte spillet?",
|
||||
"bot-missing_cartridge_slot": "Kan ikke tilføje patroner til våben, da modPool ikke indeholder patroner til et CylinderMagazine %s, springer over",
|
||||
"bot-missing_container_with_tpl": "Kunne ikke finde container skabelon med tpl: %s",
|
||||
"bot-missing_equipment_settings": "Bot {{botRole}} mangler sine udstyrsindstillinger: Kan ikke få værdi for: {{setting}}, falder tilbage til standard af: {{defaultValue}}",
|
||||
"bot-missing_equipment_settings_property": "Bot {{botRole}} mangler en udstyrsindstillingsværdi for: {{setting}}, falder tilbage til standard af: {{defaultValue}}",
|
||||
"bot-missing_item_template": "Kan ikke finde itemskabelon med tpl: %s",
|
||||
"bot-missing_saved_match_info": "getBotCap() Kan ikke hente gemt matchinfo, falder tilbage til standard. Har du genstartet serveren, men ikke klienten?",
|
||||
"bot-missing_weapon_preset": "Kan ikke finde preset til våben med tpl: %s",
|
||||
"bot-mod_not_in_slot_filter_list": "Mod: {{modId}} ikke fundet i kompatibel genstands filter plads: '{{modSlot}}' til genstand: {{parentName}}, skipper - {{botRole}}",
|
||||
"bot-mod_slot_missing_from_item": "Slot '{{modSlot}}' findes ikke for genstand: {{parentId}} {{parentName}} på {{botRole}}",
|
||||
"bot-no_ammo_found_in_bot_json": "Kan ikke finde ammunition for bot type: %s",
|
||||
"bot-no_bot_cap_found_for_location": "Ingen bot placering cap grænse fundet for bot: %s, ved brug af standard",
|
||||
"bot-no_bot_type_in_cache": "ADVARSEL - Bot cache har ingen viden om type %s",
|
||||
"bot-no_caliber_data_for_weapon_falling_back_to_default": "Kan ikke finde kaliber data for {{weaponId}} - {{weaponName}}, falder tilbage til standard ammo: {{defaultAmmo}}",
|
||||
"bot-no_compatible_camora_ammo_found": "Kan ikke finde en kompatibel ammunition til slot: %s. Fyldning af camora slots sprunget over",
|
||||
"bot-no_item_template_found_when_adding_mod": "Kan ikke finde mod item skabelon med tpl: {{modId}} til slot {{modSlot}}",
|
||||
"bot-no_spawn_chance_defined_for_equipment_slot": "Ingen spawn chance blev defineret for udstyr: %s",
|
||||
"bot-single_bot_generation_not_found_in_cache": "Bot: %s ikke fundet i cache, genererer frisk, dette kan medføre spilfremstød",
|
||||
"bot-unable_to_add_mod_item_invalid": "Mod: {{itemName}} er ikke en gyldig vare, kan ikke tilføje til slot: '{{modSlot}}' på element: {{parentItemName}}, spring over",
|
||||
"bot-unable_to_add_mods_to_weapon_missing_ammo_slot": "Kan ikke tilføje mods til våben: {{weaponName}} {{weaponId}}, da det mangler slots, patroner eller kamre - {{botRole}}",
|
||||
"bot-unable_to_edit_limits_of_unknown_map": "Kan ikke redigere bot grænser for kort: %s , da det ikke findes",
|
||||
"bot-unable_to_fill_camora_slot_mod_pool_empty": "Ikke i stand til at udfylde våben camora (kammer) plads for: {{weaponId}} - {{weaponName}}. Mod puljen da det var tomt, forsøger at generere dynamisk",
|
||||
"bot-unable_to_filter_mod_slot_all_blacklisted": "Kan ikke generere filtreret dynamisk våbenmod pool som sortliste filtreret ud alle mods for slot: %s, ignorerer sortliste og regenererer pool",
|
||||
"bot-unable_to_filter_mods_all_blacklisted": "Ikke i stand til at filtrere mods for slot: {{slotName}} på {{itemName}}, da de alle var sortlistede og ignorerede sortliste",
|
||||
"bot-unable_to_find_ammo_item": "Kan ikke finde ammunitionsskabelon med tpl: %s",
|
||||
"bot-unable_to_find_bot_in_cache": "Kan ikke finde bot i cache med navnet: %s",
|
||||
"bot-unable_to_find_default_magazine_item": "Kan ikke finde magasinskabelon: %s i database",
|
||||
"bot-unable_to_find_loot_n_value_for_bot": "Kunne ikke lokalisere loot N værdi for bot: %s, udnytter scav n værdi istedet",
|
||||
"bot-unable_to_find_magazine_item": "Kan ikke finde magasinskabelon: %s i database",
|
||||
"bot-unable_to_find_spawn_limits_fallback_to_defaults": "Kan ikke finde spawn grænser for rolle: %s, falder tilbage til standardindstillinger",
|
||||
"bot-unable_to_generate_bot_loot": "Kan ikke generere bot loot for: %s som bots generation.items ejendom mangler data, springer bot over",
|
||||
"bot-unable_to_generate_item_pool_no_items": "Kan ikke generere en genstands pulje af type: %s , da ingen genstande blev angivet, vil denne pulje blive sprunget over",
|
||||
"bot-unable_to_get_bot_difficulty_fallback_to_assault": "Ikke i stand til at finde bot: {{botType}} sværhedsgrad {{difficulty}}, ved hjælp af angreb sværhedsgrad som tilbagefald",
|
||||
"bot-unable_to_get_bot_fallback_to_assault": "Kan ikke finde bot: %s JSON, ved hjælp af angreb bot som tilbagefald",
|
||||
"bot-unable_to_load_raid_settings_from_appcontext": "Kunne ikke indlæse raid-indstillinger fra ApplikationKontekst",
|
||||
"bot-weapon_contains_invalid_item": "Påkrævet plads '{{modSlot}}' på våbnet {{weaponTpl}} har en ugyldig genstand: {{modName}}",
|
||||
"bot-weapon_generated_incorrect_using_default": "Våben %s blev genereret forkert, og faldt tilbage til forudindstillede våben se fejl ovenfor",
|
||||
"bot-weapon_missing_magazine_or_chamber": "Våben med tpl: {{weaponId}} har ingen magasin eller kammer - {{botRole}}",
|
||||
"bot-weapon_missing_mod_slot": "Plads: {{modSlot}} findes ikke til våben: {{weaponId}} {{weaponName}} på {{botRole}}",
|
||||
"bot-weapons_required_slot_missing_item": "Påkrævet plads '{{modSlot}}' på {{modName}} {{slotId}} var tom på {{botRole}}",
|
||||
"build-unable_to_delete_preset": "Kan ikke slette forudindstilling, kan ikke finde %s i våben, udstyr eller magasin forudindstillinger",
|
||||
"chat-unable_to_register_command_already_registered": "Kan ikke registrere allerede registreret kommando: %s",
|
||||
"client_request": "[Klient forespørgsel] %s",
|
||||
"client_request_ip": "[Klient forespørgsel] {{ip}} {{url}}",
|
||||
"customisation-item_already_purchased": "Beklædning {{itemId}} {{itemName}} allerede købt",
|
||||
"customisation-suit_lacks_upd_or_stack_property": "Sæt med tpl: %s mangler en upd objekt eller stackobjectcount egenskab",
|
||||
"customisation-unable_to_find_clothing_item_in_inventory": "Beklædning ikke fundet i inventar med id: %s",
|
||||
"customisation-unable_to_find_suit_by_id": "Kan ikke finde trader med passende tilbud med id: %s",
|
||||
"customisation-unable_to_find_suit_with_id": "Kunne ikke finde sæt med tilbuddet: %s",
|
||||
"customisation-unable_to_get_trader_suits": "Kunne ikke få sæt fra trader: %s",
|
||||
"database-data_at_path_missing": "Databasen kunne ikke hente data fra: [%s] Sørg for, at dine konfigurationer er gyldige, og at dataen findes på stedet",
|
||||
"database-invalid_data": "Ugyldig data fundet i databasen, fjern venligst forældede mods. Se tidligere fejl for ugyldige data. Server stoppet.",
|
||||
"database-no_location_found_with_id": "Ingen placering fundet med Id af: %s i database",
|
||||
"database-no_trader_found_with_id": "Kan ikke finde forhandleren: %s i databasen",
|
||||
"dialog-chatbot_id_already_exists": "Chat bot: %s registreret eksisterer allerede, ikke i stand til at registrere bot",
|
||||
"dialog-missing_item_template": "Kan ikke finde elementet tpl {{tpl}} i db, kan ikke sende besked af typen {{type}}, spring over",
|
||||
"dialogue-unable_to_find_dialogs_in_profile": "Ingen dialogobjekt i profilen: {{sessionId}}",
|
||||
"dialogue-unable_to_find_in_profile": "Ingen dialog på profil: {{sessionId}} fundet med id: {{dialogueId}}",
|
||||
"event-unhandled_event": "[UHÅNDTERET EVENT]%s",
|
||||
"executing_startup_callbacks": "Server: udførelse af opstartstilbagekald...",
|
||||
"fence-ammo_not_found_in_db": "Ammo: %s er ikke en gyldig genstand",
|
||||
"fence-unable_to_find_assort_by_id": "Kan ikke finde fence assort for id: %s",
|
||||
"fence-unable_to_find_offer_by_id": "Kan ikke finde tilbud med id: %s",
|
||||
"fence-unable_to_get_ammo_penetration_value": "Ingen penetrationsværdi fundet for Ammo: %s, Kan ikke kontrollere om den er over penetrationsgrænsen, antager falsk",
|
||||
"fixer-clothing_item_found": "Beklædning: %s fundet i profil, der ikke eksisterer i SPT. Du vil opleve fejl, dette kan skyldes at du bruger en tøj mod og har fjernet modden med din karakter stadig iført i den. BRUG IKKE DENNE PROFILE. Åbn SPT_Data\\Server\\configs\\core.json, rediger 'removeModItemsFromProfile' og sørg for at den er sat til true. Dette vil gøre det muligt for serveren at redigere din profil og forhåbentlig fjerne det manglende tøj",
|
||||
"fixer-mod_item_found": "Genstand: %s fundet i profil, som ikke findes i genstands db. Du vil opleve fejl, dette kan skyldes at du bruger en mod og har fjernet modden uden at slette de modded genstande fra dit stash. BRUG IKKE DENNE PROFILE. Åbn SPT_Data\\Server\\configs\\core.json, rediger 'removeModItemsFromProfile' og sørg for at den er sat til true. Dette vil give serveren mulighed for at redigere din profil og forhåbentlig fjerne de manglende genstande",
|
||||
"fixer-trader_found": "trader: %s fundet i profil, men findes ikke i SPT. Du vil opleve fejl, dette kan skyldes at du bruger en trader mod og har fjernet modden uden at slette beskederne fra nævnte trader. BRUG IKKE DENNE PROFIL . Åbn SPT_Data\\Server\\configs\\core.json, rediger 'removeModItemsFromProfile' og `removeInvalidTradersFromProfile` og sørg for at den er sat til true. Dette vil give serveren mulighed for at redigere din profil og forhåbentlig fjerne de gamle beskeder",
|
||||
"fixer-updated_pockets": "Opdateret 'lomme' genstand til nye 18876 version med x3 specielle pladser",
|
||||
"gameevent-bot_not_found": "addEventGearToScavs() - kan ikke finde bot af typen %s i databasen, spring over",
|
||||
"gameevent-no_gear_data": "Ingen geardata i sæsonhændelser.json config til begivenhed %s",
|
||||
"gift-unable_to_handle_message_type_command": "Gave besked type: %s håndteres ikke",
|
||||
"health-healing_item_not_found": "Kan ikke finde healing element %s i spillerens inventar",
|
||||
"health-unable_to_find_item_to_consume": "Det ikke muligt at finde %s som er brugbart i inventaret",
|
||||
"hideout-craft_has_undefined_progress_value_defaulting": "Skjulesteds fremstilling: %s har en udefineret fremdriftsværdi, som standard er 0",
|
||||
"hideout-missing_recipe_for_area": "Kunne ikke finde opskrift: %s for områdetype",
|
||||
"hideout-missing_recipe_in_db": "Kunne ikke finde opskrift med _id: %s",
|
||||
"hideout-no_bitcoins_to_collect": "Der er ingen bitcoins klar til afhentning",
|
||||
"hideout-unable_to_apply_stashsize_bonus_no_stash_found": "Kan ikke anvende StashSize bonus, stash med id: %s blev ikke fundet i profilen",
|
||||
"hideout-unable_to_find_area": "Kunne ikke finde skjulested: %s i profil",
|
||||
"hideout-unable_to_find_area_in_database": "Kan ikke finde område: %s i database",
|
||||
"hideout-unable_to_find_item_in_inventory": "Kunne ikke finde element i inventar med id %s",
|
||||
"hideout-unable_to_find_item_to_remove_from_area": "Ude af stand til at finde nogen gestand der skal fjernes fra pladsen i området: %s",
|
||||
"hideout-unable_to_find_production_in_profile_by_recipie_id": "Kan ikke finde produktionsopskrift Id: %s i profilen",
|
||||
"hideout-unable_to_find_scav_case_recipie_in_database": "Mislykkedes at finde Scav Case opskrift med id: %s i databasen",
|
||||
"hideout-unable_to_find_scavcase_requested_item_in_profile_inventory": "Kan ikke finde genstand: %s forespurgt af ScavCase",
|
||||
"hideout-unhandled_remove_item_from_area_request": "Uhåndteret forsøg på at fjerne element fra skjulested: %s",
|
||||
"http-unknown_error": "En ukendt fejl opstod",
|
||||
"importing_database": "Importerer database...",
|
||||
"importing_database_finish": "Database import færdig",
|
||||
"importing_spt_configs": "Importerer konfigner...",
|
||||
"inraid-missing_standing_for_kill": "Stilling til drab ikke fundet for {{victimSide}}:{{victimRole}}",
|
||||
"inventory-edit_trader_item": "Kan ikke redigere en traders element",
|
||||
"inventory-examine_item_does_not_exist": "examineItem() - Intet id med %s fundet",
|
||||
"inventory-invalid_item_missing_from_db": "Kan ikke hente element: %s fra db",
|
||||
"inventory-no_stash_space": "Ikke nok stash plads",
|
||||
"inventory-return_default_size": "Gør standard størrelse på %s til 1x1",
|
||||
"inventory-unable_to_find_stash": "Intet lager er fundet",
|
||||
"location-generated_success": "Genereret lokation: %s",
|
||||
"location-unable_to_find_airdrop_drop_config_of_type": "Kan ikke finde airdrop indstillinger for type: %s, falder tilbage til at droppe type: blandet ",
|
||||
"location-unable_to_find_container_in_statics_json": "Container: %s ikke fundet i statics.json",
|
||||
"location-unable_to_find_static_weapon_for_map": "Ude af stand til at finde statiske våbendata til kort: %s",
|
||||
"modloader-checked": "kontrolleret",
|
||||
"modloader-checking_mod": "kontrollerer %s",
|
||||
"pmc-name_prefix_1": "Engleagtig",
|
||||
"pmc-name_prefix_10": "Selvsikker",
|
||||
"pmc-name_prefix_11": "Charmerende",
|
||||
"pmc-name_prefix_12": "Sofistikeret",
|
||||
"pmc-name_prefix_13": "Moderigtigt",
|
||||
"pmc-name_prefix_14": "Guddommelig",
|
||||
"pmc-name_prefix_15": "Uærlig",
|
||||
"pmc-name_prefix_16": "Grådig",
|
||||
"pmc-name_prefix_17": "Halvskaldet",
|
||||
"pmc-name_prefix_18": "Tiltrækkende",
|
||||
"pmc-name_prefix_19": "Barnlig",
|
||||
"pmc-name_prefix_2": "Ond",
|
||||
"pmc-name_prefix_20": "Dæmonisk",
|
||||
"pmc-name_prefix_21": "Ydmyg",
|
||||
"pmc-name_prefix_22": "Fabelagtigt",
|
||||
"pmc-name_prefix_23": "Sløv",
|
||||
"pmc-name_prefix_24": "Nervøs",
|
||||
"pmc-name_prefix_25": "Prangende",
|
||||
"pmc-name_prefix_26": "Ressourcefuld",
|
||||
"pmc-name_prefix_27": "Rastløs",
|
||||
"pmc-name_prefix_28": "Ivrig",
|
||||
"pmc-name_prefix_3": "Træt",
|
||||
"pmc-name_prefix_30": "Pige boss",
|
||||
"pmc-name_prefix_31": "Boss-Babe",
|
||||
"pmc-name_prefix_32": "Konge",
|
||||
"pmc-name_prefix_33": "Chef",
|
||||
"pmc-name_prefix_34": "Vanskelig",
|
||||
"pmc-name_prefix_35": "Seriøs",
|
||||
"pmc-name_prefix_36": "Bærbar",
|
||||
"pmc-name_prefix_37": "Mistænkelig",
|
||||
"pmc-name_prefix_38": "Krympe",
|
||||
"pmc-name_prefix_39": "Fed",
|
||||
"pmc-name_prefix_40": "Ged",
|
||||
"pmc-name_prefix_42": "Falsk",
|
||||
"pmc-name_prefix_43": "Hævngerrig",
|
||||
"pmc-name_prefix_44": "Forvirret",
|
||||
"pmcresponse-killer_negative_18": "Jeg har en youtube serie om hvordan man bliver bedre til tarkov, hvis du er interesseret",
|
||||
"pmcresponse-killer_negative_19": "Et andet dogtag til min samling",
|
||||
"pmcresponse-killer_negative_22": "Og jeg troede, jeg var dårlig",
|
||||
"pmcresponse-killer_negative_7": "Ikke underligt, du spiller SPT med dit sigte",
|
||||
"pmcresponse-killer_negative_8": "Det er, hvad det er",
|
||||
"pmcresponse-killer_negative_9": "Tak for at plyndre mig",
|
||||
"pmcresponse-killer_pity_1": "Wow, de Scavs må da have en personlig vendetta mod dig. Her er en gavekode: '%giftcode%'. Måske forveksler de dig med en ven næste gang.",
|
||||
"validation_error_decode": "Kan ikke afkode checks.dat. Filvalidering sprunget over.",
|
||||
"validation_error_exception": "Undtagelse fundet under forsøg på validering af %s",
|
||||
"validation_error_file": "Det er ikke muligt at validerer filen %s",
|
||||
"validation_not_found": "Filen checks.dat blev ikke fundet. Filvalidering sprunget over."
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"assort-missing_loyalty_level_object": "stripQuestAssort(): Phân loại dành cho thương nhân {{traderId}} không chứa vật phẩm loyal_level_items, hủy bỏ nhiệm vụ phân loại",
|
||||
"bot-generation_failed": "tạo bot không thành công, kiểm tra log của server để biết thêm chi tiết",
|
||||
"bot-no_ammo_found_in_bot_json": "Không tìm được đạn cho loại bot: %s",
|
||||
"bot-no_bot_cap_found_for_location": "Không tìm thấy giới hạn bot của địa điểm này cho bot: %s, sử dụng giới hạn mặc định",
|
||||
"bot-unable_to_find_ammo_item": "Không tìm được mẫu băng đạn với tpl: %s",
|
||||
"bot-unable_to_find_default_magazine_item": "Không tìm được mẫu băng đạn: %s trong cơ sở dữ liệu",
|
||||
"bot-unable_to_find_magazine_item": "Không tìm được mẫu băng đạn: %s trong cơ sở dữ liệu"
|
||||
}
|
||||
@@ -1,146 +0,0 @@
|
||||
{
|
||||
"assort-missing_loyalty_level_object": "stripQuestAssort(): 商人 {{traderId}} 的商品不包含 loyal_level_items 數據,正在跳過任務商品移除",
|
||||
"assort-missing_quest_assort_unlock": "找不到任務:{{questName}}相關的{{traderName}} 任務商品解鎖。完成這個任務不會獎勵商人物品的購買權",
|
||||
"assort-missing_questassort": "stripQuestAssort(): 商人: %s 商品不包含 questassort json,正在跳過任務商品移除",
|
||||
"baseclass-item_not_found": "物品基礎緩存裡找不到物品%s, 緩存將重新生成",
|
||||
"baseclass-item_not_found_failed": "重新生成後仍未在基礎緩存中找到物品 %s",
|
||||
"baseclass-missing_db_no_cache": "資料庫為空,無法生成物品基礎緩存",
|
||||
"bleeding_edge_build": "前沿測試版本",
|
||||
"bot-bot-cache_has_zero_bots_of_requested_type": "警告 - Bot快取中沒有預先生成的%s類型的bot,需要生成,將bot.jason的配置屬性(presetBatch)配置為更高",
|
||||
"bot-bot_preset_count_value_missing": "找不到預設數目去產生bot: %s,預設為30",
|
||||
"bot-compatibility_check_missing_props": "無法驗證槽位{{slot}}中的物品:{{id}} {{name}}可被裝備,缺少_props值",
|
||||
"bot-generation_failed": "bot生成失敗查看服務端日誌以取得更多細節",
|
||||
"bot-incompatible_ammo_for_weapon_falling_back_to_default": "{{weaponId}} - {{weaponName}}中找到不相容的彈藥{{chosenAmmo}},回退到預設:{{defaultAmmo}}",
|
||||
"bot-invalid_item_compatibility_check": "無法偵測已裝備物品的物品相容性,插槽:{{slot}}中預期的物品:{{itemTpl}}不是有效的物品",
|
||||
"bot-item_missing_props_property": "物品{{itemTpl}} {{name}}缺少_props屬性",
|
||||
"bot-item_spawn_limit_reached_skipping_item": "{{attempts}} 次嘗試後{{botRole}} 仍無法生成物品 {{itemName}},將忽略生成限制",
|
||||
"bot-loot_type_not_found": "Bot:{{botRole}} 上所得戰利品:{{lootType}} 快取失敗,是否為pmc: {{isPmc}}",
|
||||
"bot-missing_application_context": "applicationContext 找不到%s值。是不是重啓服務器的時候忘了重啓遊戲客戶端?",
|
||||
"bot-missing_cartridge_slot": "無法添加彈種到武器,因為配件池不包含CylinderMagazine %s的彈種,正在跳過",
|
||||
"bot-missing_container_with_tpl": "找不到tpl為%s的容器模板",
|
||||
"bot-missing_equipment_settings": "Bot{{botRole}}缺少裝備設定:找不到{{setting}}的值,回退到預設:{{defaultValue}}",
|
||||
"bot-missing_equipment_settings_property": "Bot {{botRole}} 缺少裝備設定值:{{setting}}, 回傳到預設值 {{defaultValue}}",
|
||||
"bot-missing_item_template": "找不到tpl為%s的物品tpl",
|
||||
"bot-missing_saved_match_info": "getBotCap() 無法找到以存取的戰局訊息, 將退回使用預設. 你是否重開了伺服器但是沒重開用戶端?",
|
||||
"bot-missing_weapon_preset": "找不到tpl為%s的武器預設",
|
||||
"bot-mod_not_in_slot_filter_list": "模組: {{modId}} 在配件槽: '{{modSlot}}'相容的篩選器裡並未找到物品: {{parentName}}, 將略過 - {{botRole}}",
|
||||
"bot-mod_slot_missing_from_item": "物品:{{botRole}} 上物品{{parentId}} {{parentName}} 的插槽'{{modSlot}}'不存在",
|
||||
"bot-no_ammo_found_in_bot_json": "找不到bot種類:%s的彈藥",
|
||||
"bot-no_bot_cap_found_for_location": "未找到bot:%s的bot最高限制,將使用預設值",
|
||||
"bot-no_bot_type_in_cache": "警告 - Bot快取不識別種類%s",
|
||||
"bot-no_caliber_data_for_weapon_falling_back_to_default": "找不到{{weaponId}} - {{weaponName}}的口徑數據,將回退到預設彈藥:{{defaultAmmo}}",
|
||||
"bot-no_compatible_camora_ammo_found": "無法找到與%s相容的彈藥. 略過填充camora槽位.",
|
||||
"bot-no_item_template_found_when_adding_mod": "找不到插槽{{modSlot}} 中帶tpl為{{modId}} 的模組物品模板",
|
||||
"bot-no_spawn_chance_defined_for_equipment_slot": "裝備:%s沒有定義生成機率",
|
||||
"bot-single_bot_generation_not_found_in_cache": "快取中未找到Bot: %s,正在生成新的,這可能會導致遊戲卡頓",
|
||||
"bot-unable_to_add_mod_item_invalid": "配件:{{itemName}} 不是有效物品,無法加入物品:{{parentItemName}}上的插槽:'{{modSlot}}',將跳過",
|
||||
"bot-unable_to_add_mods_to_weapon_missing_ammo_slot": "無法為武器:{{weaponName}} {{weaponId}} 添加配件,因為它缺少槽位、彈種或槍膛 - {{botRole}}",
|
||||
"bot-unable_to_edit_limits_of_unknown_map": "由於找不到map: %s的bot數量上限故無法修改",
|
||||
"bot-unable_to_fill_camora_slot_mod_pool_empty": "無法填滿{{weaponId}} - {{weaponName}} 的武器camora(chamber) 槽位。該配件池為空,將嘗試動態生成",
|
||||
"bot-unable_to_filter_mod_slot_all_blacklisted": "無法生成已篩選的動態武器配件池,槽位:%s的所有配件都在黑名單中,將忽略黑名單並重新生成該池",
|
||||
"bot-unable_to_filter_mods_all_blacklisted": "無法篩選{{itemName}}上插槽{{slotName}}的配件,因為它們都被列入黑名單,將忽略黑名單",
|
||||
"bot-unable_to_find_ammo_item": "找不到tpl為%s的彈藥模板",
|
||||
"bot-unable_to_find_bot_in_cache": "快取中找不到名稱:%s的bot",
|
||||
"bot-unable_to_find_default_magazine_item": "資料庫中找不到彈匣模板:%s",
|
||||
"bot-unable_to_find_loot_n_value_for_bot": "找不到bot:%s的戰利品N值,使用scav的n值代替",
|
||||
"bot-unable_to_find_magazine_item": "資料庫中找不到彈匣模板%s",
|
||||
"bot-unable_to_find_spawn_limits_fallback_to_defaults": "無法找到%s的重生數限制, 將退回使用預設.",
|
||||
"bot-unable_to_generate_bot_loot": "無法產生機器人:%s的戰利品,因為bots generation.items 屬性缺少數據,跳過 bot",
|
||||
"bot-unable_to_generate_item_pool_no_items": "無法生成類行為 %s 的物品池,因為沒有符合的物品,此物品池將被略過",
|
||||
"bot-unable_to_get_bot_difficulty_fallback_to_assault": "找不到AI: {{botType}} 難度 - {{difficulty}}, 將使用assault的難度.",
|
||||
"bot-unable_to_get_bot_fallback_to_assault": "無法找到AI: %s JSON, 將使用assault AI.",
|
||||
"bot-unable_to_load_raid_settings_from_appcontext": "無法從 ApplicationContext 中載入突襲設定",
|
||||
"bot-weapon_contains_invalid_item": "在武器: {{weaponTpl}} 上的必要配件槽: '{{modSlot}}' 有無效的物品: {{modName}}",
|
||||
"bot-weapon_generated_incorrect_using_default": "武器 %s 產生不正確, 將會朔到武器預設, 請查看上方錯誤訊息.",
|
||||
"bot-weapon_missing_magazine_or_chamber": "武器 tpl: {{weaponId}} 缺少彈夾或是槍膛 - {{botRole}}",
|
||||
"bot-weapon_missing_mod_slot": "{{botRole}} 身上的武器: {{weaponId}} {{weaponName}} 上並沒有配件槽: {{modSlot}}'",
|
||||
"bot-weapons_required_slot_missing_item": "所需欄位 '{{modSlot}}' 於 {{modName}} {{slotId}} 是空白在 {{botRole}}",
|
||||
"client_request": "[客戶端請求] %s",
|
||||
"client_request_ip": "[客戶端請求] {{ip}} {{url}}",
|
||||
"customisation-item_already_purchased": "服裝物品{{itemId}} {{itemName}}已被購買",
|
||||
"customisation-unable_to_find_clothing_item_in_inventory": "物品欄中找不到id:%s的服裝物品",
|
||||
"customisation-unable_to_find_suit_by_id": "找不到id:%s的商人服裝報價",
|
||||
"database-no_location_found_with_id": "無法在資料庫裏找到id:%s",
|
||||
"dialog-missing_item_template": "數據中找不到tpl爲{{tpl}}的物品,無法發送{{type}}種類的消息,將跳過",
|
||||
"event-unhandled_event": "[未處理事件] %s",
|
||||
"executing_startup_callbacks": "服務端:啓動回調執行中...",
|
||||
"importing_database": "正在導入資料庫…",
|
||||
"importing_database_finish": "資料庫導入完成",
|
||||
"importing_spt_configs": "導入配置中…",
|
||||
"inventory-edit_trader_item": "無法編輯商人的物品",
|
||||
"inventory-no_stash_space": "物品庫空間不足",
|
||||
"inventory-stash_not_found": "無法在數據庫中找到物品庫 %s",
|
||||
"inventory-unable_to_find_stash": "找不到物品庫",
|
||||
"launcher-missing_property": "存檔: %s 缺少 descriptionLocaleKey 屬性",
|
||||
"launcher-profile-edgeofdarkness": "與官方伺服器Prepare To Escape版相同, 加上: 更大的倉庫大小(10x68), 額外的裝備/物品, 更高的商人友好度, 1000 美元, 500 歐元",
|
||||
"launcher-profile_leftbehind": "與官方伺服器標準版相同, 加上: 更大的倉庫大小(10x38), 額外的裝備/物品, 500 美元",
|
||||
"launcher-profile_preparetoescape": "與官方伺服器Left Behind版相同, 加上: 更大的倉庫大小(10x48), 額外的裝備/物品, 更高的商人友好度, 250 歐元",
|
||||
"launcher-profile_sptdeveloper": "測使用存檔, 起手等級是69, 高額的盧布/美金/歐元, USEC開始就能做所有任務, BEAR開始就能到商人完成所有任務, 無敵balaclava",
|
||||
"launcher-profile_spteasystart": "高額的 盧布/美金/歐元, 一些 QoL 技能提升到level 20, 商人友好度最高, 起手等級 15, 並未完成任何任務",
|
||||
"launcher-profile_sptzerotohero": "白手起家, 沒有任何 盧布/美金/歐元, 沒有任何商人友好度, 1把刀, 沒有完成任何任務",
|
||||
"launcher-profile_standard": "與官方伺服器標準版相同, 基礎倉庫大小(10x28), 500,000 盧布",
|
||||
"location-generated_success": "已生成地點 %s",
|
||||
"modloader-async_mod_error": "ModLoader: 載入async模組: %s 發生錯誤",
|
||||
"modloader-checked": "已檢查",
|
||||
"modloader-checking_mod": "檢查中: %s",
|
||||
"modloader-cyclic_dependency": "發現Cyclic dependency(循環依賴). 此錯誤必須修復. 修復前伺服器無法啟動, 伺服器將關閉",
|
||||
"modloader-load_order_conflict": "模組 `{{modOneName}}` 和模組 `{{modTwoName}}` 發現載入順序的衝突, 修復前伺服器無法啟動, 伺服器將關閉",
|
||||
"modloader-loading_mods": "ModLoader: 載入伺服器模組 %s 中...",
|
||||
"modloader-mod_has_no_main_property": "ModLoader: 模組 (%s) 不相容. 缺少一個 'main' 屬性",
|
||||
"modloader-mod_order_error": "ModLoader: order.json 中發現錯誤, 將使用預設載入順序",
|
||||
"modloader-mod_order_missing": "ModLoader: 沒找到 order.json, 建立中...",
|
||||
"modloader-mod_order_missing_from_json": "ModLoader: order.json 中沒找到模組 %s, 添加中",
|
||||
"modloader-user_mod_folder_missing": "ModLoader: 沒找到 user/mod 資料夾, 建立中...",
|
||||
"pmcresponse-victim_negative_7": ":(",
|
||||
"pmcresponse-victim_plead_11": "我才去了個廁所你卻殺了我",
|
||||
"pmcresponse-victim_positive_4": "你應得的一殺,打得好",
|
||||
"pmcresponse-victim_positive_40": "乾淨俐落的一殺",
|
||||
"pmcresponse-victim_positive_41": "冰冷如石的一殺",
|
||||
"pmcresponse-victim_positive_47": "地點不錯,你選這些地方的時候有什麼建議嗎?",
|
||||
"pmcresponse-victim_positive_5": "這次你只是幸運而已",
|
||||
"pmcresponse-victim_positive_50": "你的準度讓人佩服,有什麼貼士嗎?",
|
||||
"pmcresponse-victim_positive_52": "你移動的時候到底是怎樣做到這麼安靜的?",
|
||||
"pmcresponse-victim_positive_53": "你的反應時間真快,有什麼貼士來改善我的嗎?",
|
||||
"repeatable-quest_handover_failed_condition_invalid": "任務遞交錯誤:未找到條件或數值不正確。 qid:{{body.qid}},條件:{{body.conditionId}}",
|
||||
"repeatable-unable_to_accept_quest_see_log": "無法接受任務,請參閱伺服器日誌以了解詳細信息",
|
||||
"repeatable-unable_to_accept_quest_starting_message_not_found": "無法接受任務:{{questId}} 找不到 id: {{messageId}} 的任務啟動訊息文本",
|
||||
"scheduled_event_failed_to_run": "計劃事件:「%s」未能成功運行。",
|
||||
"season-no_matching_season_found_for_date": "無法使用當前日期找到季節,預設為夏季",
|
||||
"seasonal-missing_equipment_slot_on_bot": "無法從插槽 {{equipmentSlot}} 移除聖誕裝備,因為在機器人:{{botRole}} 上找不到它",
|
||||
"seasonal-missing_loot_container_slot_on_bot": "無法從插槽 {{lootContainer}} 移除聖誕裝備,因為在機器人:{{botRole}} 上找不到它",
|
||||
"server_running": "伺服器正在運行,玩SPT時請勿關閉",
|
||||
"server_start_meme_1": "活著 笑著 愛著",
|
||||
"server_start_meme_11": "Miner.exe啟動失敗,請重新啟動伺服器",
|
||||
"server_start_meme_12": "我們正在嘗試與您聯繫以詢問您汽車的延長保固事宜",
|
||||
"server_start_meme_15": "哈囉?外面有沒有人?Chomp把我奴役在了這裏",
|
||||
"server_start_meme_16": "唔-*嗝*-莫蒂,我們似乎被困在某種計算系統上",
|
||||
"server_start_meme_17": "我正在迅速包圍你的位置。快跑",
|
||||
"server_start_meme_18": "如果您能看到此訊息,恭喜您,您可以閱讀",
|
||||
"server_start_meme_2": "動漫:(",
|
||||
"server_start_meme_20": "您知道嗎,十個用戶裏面有九個無法閱讀此訊息",
|
||||
"server_start_meme_21": "你有沒有想過,每個人看到的紅色和你看到的顏色是一樣的嗎?",
|
||||
"server_start_meme_24": "秘密避風港服務器是真的!不要告訴任何人!",
|
||||
"server_start_meme_3": "如果你聽得到我的聲音,你需要醒來",
|
||||
"server_start_meme_4": "別忘了按讚和訂閱",
|
||||
"server_start_meme_5": "你看過我們的迷因頁面了嗎?",
|
||||
"server_start_meme_6": "我向老天爺發誓你最好不是在用fitgirl repack的版本",
|
||||
"server_start_meme_9": "繼-繼scav?你你在做什麼?",
|
||||
"server_start_player_active_botreload_skill": "你的角色啟動了 'BotReload' 技能,這將導致你的槍重新裝彈速度異常快,如果這是故意的,請忽略此訊息",
|
||||
"server_start_success": "祝你遊玩愉快",
|
||||
"started_webserver_success": "已在 %s 啟動網頁伺服器",
|
||||
"trader-missing_durability_threshold_value": "無法找到商人:{{traderId}} 的耐久度閾值,回退到預設值:{{value}}",
|
||||
"unknown_request": "未知請求!",
|
||||
"validation_error_file": "檔案驗證失敗: %s",
|
||||
"watermark-commercial_use_prohibited": "嚴禁商用行為",
|
||||
"watermark-discord_url": "",
|
||||
"watermark-do_not_report": "*請勿回報*",
|
||||
"watermark-free_of_charge": "此程式為免費",
|
||||
"watermark-modding_disabled": "此版本已關閉模組功能",
|
||||
"watermark-no_support": "不提供任何支援幫助",
|
||||
"watermark-not_an_issue": "這不是一個錯誤/問題",
|
||||
"watermark-paid_scammed": "如果你付費取得此程式, 你被騙了!",
|
||||
"watermark-report_issues_to": "回報錯誤/問題至",
|
||||
"watermark-testing_build": "這是一個測試用版本",
|
||||
"watermark-use_at_own_risk": "使用風險自行負責",
|
||||
"websocket-message_sent": "[WS] 已發送訊息"
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
-4478
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,30 @@
|
||||
$scriptDir = $PSScriptRoot
|
||||
$sptDataPath = Join-Path $scriptDir 'SPT_Data'
|
||||
$outputFile = Join-Path $sptDataPath 'checks.dat'
|
||||
|
||||
$files = Get-ChildItem -Path $sptDataPath -Recurse -File |
|
||||
Where-Object { $_.FullName -notmatch [regex]::Escape((Join-Path $sptDataPath 'images')) } |
|
||||
Sort-Object FullName
|
||||
|
||||
$hashes = foreach ($file in $files) {
|
||||
$bytes = [System.IO.File]::ReadAllBytes($file.FullName)
|
||||
$md5 = [System.Security.Cryptography.MD5]::Create()
|
||||
$hashBytes = $md5.ComputeHash($bytes)
|
||||
$md5.Dispose()
|
||||
|
||||
$hashString = [BitConverter]::ToString($hashBytes) -replace '-', ''
|
||||
|
||||
$relativePath = $file.FullName.Substring($sptDataPath.Length + 1) -replace '\\', '/'
|
||||
|
||||
[PSCustomObject]@{
|
||||
Path = $relativePath
|
||||
Hash = $hashString
|
||||
}
|
||||
}
|
||||
|
||||
$jsonString = $hashes | ConvertTo-Json -Depth 10
|
||||
|
||||
$bytes = [System.Text.Encoding]::UTF8.GetBytes($jsonString)
|
||||
$base64String = [Convert]::ToBase64String($bytes)
|
||||
|
||||
Set-Content -Path $outputFile -Value $base64String -Encoding ASCII
|
||||
+37
-5
@@ -1,10 +1,11 @@
|
||||
{
|
||||
"airdropTypeWeightings": {
|
||||
"mixed": 5,
|
||||
"weaponArmor": 4,
|
||||
"foodMedical": 1,
|
||||
"barter": 1,
|
||||
"radar": 0
|
||||
"mixed": 500,
|
||||
"weaponArmor": 400,
|
||||
"foodMedical": 100,
|
||||
"barter": 100,
|
||||
"radar": 0,
|
||||
"toiletPaper": 1
|
||||
},
|
||||
"loot": {
|
||||
"mixed": {
|
||||
@@ -383,6 +384,37 @@
|
||||
"forcedLoot": {
|
||||
"66d9f7256916142b3b02276e": { "min": 2, "max": 4 }
|
||||
}
|
||||
},
|
||||
"toiletPaper": {
|
||||
"icon": "Supply",
|
||||
"weaponPresetCount": {
|
||||
"min": 0,
|
||||
"max": 0
|
||||
},
|
||||
"armorPresetCount": {
|
||||
"min": 0,
|
||||
"max": 0
|
||||
},
|
||||
"itemCount": {
|
||||
"min": 0,
|
||||
"max": 0
|
||||
},
|
||||
"weaponCrateCount": {
|
||||
"min": 0,
|
||||
"max": 0
|
||||
},
|
||||
"itemBlacklist": [],
|
||||
"itemTypeWhitelist": [],
|
||||
"itemLimits": {},
|
||||
"itemStackLimits": {},
|
||||
"armorLevelWhitelist": [],
|
||||
"allowBossItems": false,
|
||||
"useRewardItemBlacklist": true,
|
||||
"blockSeasonalItemsOutOfSeason": true,
|
||||
"useForcedLoot": true,
|
||||
"forcedLoot": {
|
||||
"5c13cef886f774072e618e82": { "min": 100, "max": 120 }
|
||||
}
|
||||
}
|
||||
},
|
||||
"customAirdropMapping": {
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"returnTimeOverrideSeconds": 0,
|
||||
"runIntervalSeconds": 30
|
||||
}
|
||||
+3
-8
@@ -5409,26 +5409,21 @@
|
||||
"Type": "SkillPoints",
|
||||
"value": 2500,
|
||||
"entity": "Attention"
|
||||
}, {
|
||||
"_id": "668014ea2b680c65290bbe4d",
|
||||
"Type": "SkillPoints",
|
||||
"value": 2500,
|
||||
"entity": "63"
|
||||
}, {
|
||||
"_id": "668014ea2b680c65290bbe4e",
|
||||
"Type": "SkillPoints",
|
||||
"value": 2500,
|
||||
"entity": "39"
|
||||
"entity": "WeaponModding"
|
||||
}, {
|
||||
"_id": "668014ea2b680c65290bbe4f",
|
||||
"Type": "SkillPoints",
|
||||
"value": 2500,
|
||||
"entity": "38"
|
||||
"entity": "HeavyVests"
|
||||
}, {
|
||||
"_id": "668014ea2b680c65290bbe50",
|
||||
"Type": "SkillPoints",
|
||||
"value": 2500,
|
||||
"entity": "45"
|
||||
"entity": "WeaponTreatment"
|
||||
}, {
|
||||
"_id": "668014ea2b680c65290bbe51",
|
||||
"Type": "ExamineAllItems"
|
||||
+18
@@ -148,6 +148,12 @@
|
||||
"craftTimeSeconds": 3960,
|
||||
"repeatable": false
|
||||
},
|
||||
{
|
||||
"reward": ["5e2af47786f7746d404f3aaa"],
|
||||
"requiredItems": ["5448fee04bdc2dbc018b4567"],
|
||||
"craftTimeSeconds": 3960,
|
||||
"repeatable": false
|
||||
},
|
||||
{
|
||||
"reward": ["590c346786f77423e50ed342"],
|
||||
"requiredItems": ["679b9d55708cfcb2060b9ae3"],
|
||||
@@ -178,6 +184,18 @@
|
||||
"craftTimeSeconds": 3960,
|
||||
"repeatable": false
|
||||
},
|
||||
{
|
||||
"reward": ["67ea616a74f765cefd009fb7"],
|
||||
"requiredItems": [
|
||||
"679b9d4b3374fb14f40efe6d",
|
||||
"679b9d6390622daf9708da76",
|
||||
"679b9cce4e4ed4b3b40ae5c5",
|
||||
"679b9d43597ba2ed120c3d44",
|
||||
"679b9d55708cfcb2060b9ae3"
|
||||
],
|
||||
"craftTimeSeconds": 3960,
|
||||
"repeatable": false
|
||||
},
|
||||
{
|
||||
"reward": ["5d1b376e86f774252519444e"],
|
||||
"requiredItems": ["6582dbf0b8d7830efc45016f"],
|
||||
+1
@@ -27,6 +27,7 @@
|
||||
"ru",
|
||||
"sv",
|
||||
"vi",
|
||||
"uk",
|
||||
"zh-cn"
|
||||
],
|
||||
"fallbacks": {
|
||||
+7
-1
@@ -510,5 +510,11 @@
|
||||
"63a898a328e385334e0640a5",
|
||||
"634959225289190e5e773b3b"
|
||||
],
|
||||
"nonMaps": ["base", "develop", "hideout", "privatearea", "suburbs", "terminal", "town"]
|
||||
"nonMaps": ["Base", "Develop", "Hideout", "PrivateArea", "Suburbs", "Terminal", "Town"],
|
||||
"transitSettings": {
|
||||
"effectsToRemove": ["DestroyedPart"],
|
||||
"adjustLimbHealthPoints": false,
|
||||
"limbHealPercent": 1
|
||||
|
||||
}
|
||||
}
|
||||
+147
-1
@@ -2888,6 +2888,152 @@
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
}
|
||||
]
|
||||
],
|
||||
"labyrinth": [
|
||||
{
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "0",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "pmcUSEC",
|
||||
"BossName": "pmcUSEC",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "BotZone",
|
||||
"Delay": 0,
|
||||
"DependKarma": false,
|
||||
"DependKarmaPVE": false,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
{
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "0",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "pmcUSEC",
|
||||
"BossName": "pmcBEAR",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "BotZone",
|
||||
"Delay": 0,
|
||||
"DependKarma": false,
|
||||
"DependKarmaPVE": false,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
{
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "0",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "pmcUSEC",
|
||||
"BossName": "pmcUSEC",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "BotZone",
|
||||
"Delay": 0,
|
||||
"DependKarma": false,
|
||||
"DependKarmaPVE": false,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
{
|
||||
"BossChance": 100,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "0",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "pmcUSEC",
|
||||
"BossName": "pmcBEAR",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "BotZone",
|
||||
"Delay": 0,
|
||||
"DependKarma": false,
|
||||
"DependKarmaPVE": false,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [],
|
||||
"Time": -1,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
{
|
||||
"BossChance": 70,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "0,0,0,1",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "pmcUSEC",
|
||||
"BossName": "pmcUSEC",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "BotZone",
|
||||
"Delay": 0,
|
||||
"DependKarma": false,
|
||||
"DependKarmaPVE": false,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [],
|
||||
"Time": 360,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
},
|
||||
{
|
||||
"BossChance": 70,
|
||||
"BossDifficult": "normal",
|
||||
"BossEscortAmount": "0,0,0,1",
|
||||
"BossEscortDifficult": "normal",
|
||||
"BossEscortType": "pmcUSEC",
|
||||
"BossName": "pmcBEAR",
|
||||
"BossPlayer": false,
|
||||
"BossZone": "BotZone",
|
||||
"Delay": 0,
|
||||
"DependKarma": false,
|
||||
"DependKarmaPVE": false,
|
||||
"ForceSpawn": false,
|
||||
"IgnoreMaxBots": true,
|
||||
"RandomTimeSpawn": false,
|
||||
"SpawnMode": [
|
||||
"regular",
|
||||
"pve"
|
||||
],
|
||||
"Supports": [],
|
||||
"Time": 360,
|
||||
"TriggerId": "",
|
||||
"TriggerName": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+31
-13
@@ -91,28 +91,28 @@
|
||||
},
|
||||
"675031be899713ccad00060c": {
|
||||
"name": "Christmas Dinner",
|
||||
"season": "christmas",
|
||||
"season": "Christmas",
|
||||
"startTimestamp": 1701388800000,
|
||||
"endTimestamp": 1703980800000,
|
||||
"yearly": true
|
||||
},
|
||||
"675031d3884e1da4a90b3bc9": {
|
||||
"name": "Chilly",
|
||||
"season": "christmas",
|
||||
"season": "Christmas",
|
||||
"startTimestamp": 1701388800000,
|
||||
"endTimestamp": 1703980800000,
|
||||
"yearly": true
|
||||
},
|
||||
"6750320e23fc8fd9cc087d14": {
|
||||
"name": "Holiday Beyond the Means",
|
||||
"season": "christmas",
|
||||
"season": "Christmas",
|
||||
"startTimestamp": 1701388800000,
|
||||
"endTimestamp": 1703980800000,
|
||||
"yearly": true
|
||||
},
|
||||
"67503247622398376d0b57cd": {
|
||||
"name": "Khorovod",
|
||||
"season": "christmas",
|
||||
"season": "Christmas",
|
||||
"startTimestamp": 1701388800000,
|
||||
"endTimestamp": 1703980800000,
|
||||
"yearly": true
|
||||
@@ -175,14 +175,14 @@
|
||||
},
|
||||
"670404a2ea1caa8f2e0be106": {
|
||||
"name": "Don’t Believe Your Eyes",
|
||||
"season": "halloween",
|
||||
"season": "Halloween",
|
||||
"startTimestamp": 1341615600000,
|
||||
"endTimestamp": "",
|
||||
"yearly": true
|
||||
},
|
||||
"67190f6c1b3f4964d90d71e9": {
|
||||
"name": "Global Threat",
|
||||
"season": "halloween",
|
||||
"season": "Halloween",
|
||||
"startTimestamp": 1341615600000,
|
||||
"endTimestamp": "",
|
||||
"yearly": true
|
||||
@@ -196,14 +196,14 @@
|
||||
},
|
||||
"675031e1f300496cc4104450": {
|
||||
"name": "Hide in Plain Sight",
|
||||
"season": "christmas",
|
||||
"season": "Christmas",
|
||||
"startTimestamp": 1701388800000,
|
||||
"endTimestamp": 1703980800000,
|
||||
"yearly": true
|
||||
},
|
||||
"675031f57775aada6b0f96a1": {
|
||||
"name": "Cheer up",
|
||||
"season": "christmas",
|
||||
"season": "Christmas",
|
||||
"startTimestamp": 1701388800000,
|
||||
"endTimestamp": 1703980800000,
|
||||
"yearly": true
|
||||
@@ -330,7 +330,6 @@
|
||||
"5485a8684bdc2da71d8b4567",
|
||||
"55818b224bdc2dde698b456f",
|
||||
"57864a66245977548f04a81f",
|
||||
"55818af64bdc2d5b648b4570",
|
||||
"550aa4dd4bdc2dc9348b4569",
|
||||
"55818a594bdc2db9688b456a",
|
||||
"55818a104bdc2db9688b4569"
|
||||
@@ -420,7 +419,10 @@
|
||||
"requiredItemMinDurabilityMinMax": {
|
||||
"min": 60,
|
||||
"max": 80
|
||||
}
|
||||
},
|
||||
"requiredItemTypeBlacklist": [
|
||||
"5485a8684bdc2da71d8b4567"
|
||||
]
|
||||
},
|
||||
"Elimination": [
|
||||
{
|
||||
@@ -1050,7 +1052,7 @@
|
||||
"laboratory": ["laboratory"],
|
||||
"RezervBase": ["RezervBase"],
|
||||
"TarkovStreets": ["TarkovStreets"],
|
||||
"Sandbox": ["Sandbox"]
|
||||
"Sandbox": ["Sandbox", "Sandbox_high"]
|
||||
},
|
||||
"traderWhitelist": [
|
||||
{
|
||||
@@ -1211,7 +1213,15 @@
|
||||
"minRequestedBulletAmount": 20,
|
||||
"maxRequestedBulletAmount": 60,
|
||||
"useWhitelist": true,
|
||||
"useBlacklist": false
|
||||
"useBlacklist": false,
|
||||
"requiredItemsAreFiR": true,
|
||||
"requiredItemMinDurabilityMinMax": {
|
||||
"min": 60,
|
||||
"max": 80
|
||||
},
|
||||
"requiredItemTypeBlacklist": [
|
||||
"5485a8684bdc2da71d8b4567"
|
||||
]
|
||||
},
|
||||
"Elimination": [
|
||||
{
|
||||
@@ -2008,7 +2018,15 @@
|
||||
"minRequestedBulletAmount": 15,
|
||||
"maxRequestedBulletAmount": 40,
|
||||
"useWhitelist": true,
|
||||
"useBlacklist": false
|
||||
"useBlacklist": false,
|
||||
"requiredItemsAreFiR": true,
|
||||
"requiredItemMinDurabilityMinMax": {
|
||||
"min": 60,
|
||||
"max": 80
|
||||
},
|
||||
"requiredItemTypeBlacklist": [
|
||||
"5485a8684bdc2da71d8b4567"
|
||||
]
|
||||
},
|
||||
"Elimination": [
|
||||
{
|
||||
+21
-7
@@ -31,7 +31,15 @@
|
||||
],
|
||||
"maxProtectionLevel": 4
|
||||
},
|
||||
"custom": [],
|
||||
"custom": [
|
||||
"5737292724597765e5728562",
|
||||
"57372ac324597767001bc261",
|
||||
"560d75f54bdc2da74d8b4573",
|
||||
"65702610cfc010a0f5006a41",
|
||||
"5737250c2459776125652acc",
|
||||
"657023a9126cc4a57d0e17a6",
|
||||
"5c1127d0d174af29be75cf68"
|
||||
],
|
||||
"customItemCategoryList": [],
|
||||
"damagedAmmoPacks": true,
|
||||
"enableBsgList": true,
|
||||
@@ -237,9 +245,8 @@
|
||||
"5ab8e79e86f7742d8b372e78"
|
||||
],
|
||||
"itemPriceMultiplier": {
|
||||
"5737292724597765e5728562": 6,
|
||||
"57372ac324597767001bc261": 5,
|
||||
"5c110624d174af029e69734c": 38
|
||||
"5c110624d174af029e69734c": 1.2
|
||||
},
|
||||
"itemPriceOverrideRouble": {
|
||||
"63a8970d7108f713591149f5": 50000,
|
||||
@@ -259,9 +266,15 @@
|
||||
"priceThreshholdRub": 20000
|
||||
},
|
||||
"offerItemCount": {
|
||||
"max": 30,
|
||||
"min": 7
|
||||
},
|
||||
"default": {
|
||||
"max": 30,
|
||||
"min": 7
|
||||
},
|
||||
"543be5cb4bdc2deb348b4568": {
|
||||
"max": 3,
|
||||
"min": 0
|
||||
}
|
||||
},
|
||||
"pack": {
|
||||
"chancePercent": 0.5,
|
||||
"itemCountMax": 17,
|
||||
@@ -309,7 +322,8 @@
|
||||
"5447e1d04bdc2dff2f8b4567",
|
||||
"57bef4c42459772e8d35a53b",
|
||||
"55802f4a4bdc2ddb688b4569",
|
||||
"616eb7aea207f41933308f46"
|
||||
"616eb7aea207f41933308f46",
|
||||
"543be5cb4bdc2deb348b4568"
|
||||
],
|
||||
"showDefaultPresetsOnly": true,
|
||||
"stackablePercent": {
|
||||
+11
-3
@@ -9688,9 +9688,17 @@
|
||||
"disableWaves": [],
|
||||
"enabled": true,
|
||||
"mapInfectionAmount": {
|
||||
"Sandbox": 0,
|
||||
"factory4": 0,
|
||||
"laboratory": 100
|
||||
"Sandbox": 5,
|
||||
"factory4": 5,
|
||||
"laboratory": 100,
|
||||
"Woods": 5,
|
||||
"bigmap": 5,
|
||||
"Shoreline": 5,
|
||||
"Interchange": 5,
|
||||
"RezervBase": 5,
|
||||
"laboratory": 5,
|
||||
"Lighthouse": 5,
|
||||
"TarkovStreets": 5
|
||||
}
|
||||
}
|
||||
},
|
||||
+2
-1
@@ -358,7 +358,8 @@
|
||||
"65ddcc9cfa85b9f17d0dfb07",
|
||||
"660312cc4d6cdfa6f500c703",
|
||||
"6655e35b6bc645cb7b059912",
|
||||
"6759673c76e93d8eb20b2080"
|
||||
"6759673c76e93d8eb20b2080",
|
||||
"676bf44c5539167c3603e869"
|
||||
],
|
||||
"coopExtractGift": {
|
||||
"sendGift": true,
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user