diff --git a/.gitignore b/.gitignore
index d5b26e268..025077529 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,25 +7,6 @@
/Distribution/Server.*
/Distribution/Assemblies
/Distribution/bsdtar
-/Distribution/Configuration/antimacro.json
-/Distribution/Configuration/assistants.json
-/Distribution/Configuration/auto-denylist.json
-/Distribution/Configuration/bans.json
-/Distribution/Configuration/blocklist.json
-/Distribution/Configuration/crowdsec.json
-/Distribution/Configuration/expansion.json
-/Distribution/Configuration/firewall.json
-/Distribution/Configuration/ip-allowlist*.txt
-/Distribution/Configuration/ip-allowlist*.txt.tmp
-/Distribution/Configuration/ip-blocklist.txt
-/Distribution/Configuration/ip-blocklist.txt.tmp
-/Distribution/Configuration/login-allowlist.json
-/Distribution/Configuration/login-allowlist.txt
-/Distribution/Configuration/login-allowlist.txt.tmp
-/Distribution/Configuration/modernuo.json
-/Distribution/Configuration/email-settings.json
-/Distribution/Configuration/throttles.json
-/Distribution/Configuration/tot.json
/Distribution/Data/Pathfinding
/Distribution/Logs
/Distribution/Archives
@@ -42,7 +23,7 @@
/Distribution/nohup.out
/Distribution/ref
/Distribution/web
-
+/Distribution/Data/Files
/Projects/*/obj
/Projects/*/bin
/Projects/*/Generated
diff --git a/Distribution/Configuration/antimacro.json b/Distribution/Configuration/antimacro.json
new file mode 100644
index 000000000..082137204
--- /dev/null
+++ b/Distribution/Configuration/antimacro.json
@@ -0,0 +1,66 @@
+{
+ "Allowance": 3,
+ "LocationSize": 5,
+ "Enabled": false,
+ "Expire": "00:05:00",
+ "SkillsThatUseAntiMacro": {
+ "Alchemy": false,
+ "Anatomy": true,
+ "AnimalLore": true,
+ "ItemID": true,
+ "ArmsLore": true,
+ "Parry": false,
+ "Begging": true,
+ "Blacksmith": false,
+ "Fletching": false,
+ "Peacemaking": true,
+ "Camping": true,
+ "Carpentry": false,
+ "Cartography": false,
+ "Cooking": false,
+ "DetectHidden": true,
+ "Discordance": true,
+ "EvalInt": true,
+ "Healing": true,
+ "Fishing": true,
+ "Forensics": true,
+ "Herding": true,
+ "Hiding": true,
+ "Provocation": true,
+ "Inscribe": false,
+ "Lockpicking": true,
+ "Magery": true,
+ "MagicResist": true,
+ "Tactics": false,
+ "Snooping": true,
+ "Musicianship": true,
+ "Poisoning": true,
+ "Archery": false,
+ "SpiritSpeak": true,
+ "Stealing": true,
+ "Tailoring": false,
+ "AnimalTaming": true,
+ "TasteID": true,
+ "Tinkering": false,
+ "Tracking": true,
+ "Veterinary": true,
+ "Swords": false,
+ "Macing": false,
+ "Fencing": false,
+ "Wrestling": false,
+ "Lumberjacking": true,
+ "Mining": true,
+ "Meditation": true,
+ "Stealth": true,
+ "RemoveTrap": true,
+ "Necromancy": true,
+ "Focus": false,
+ "Chivalry": true,
+ "Bushido": true,
+ "Ninjitsu": true,
+ "Spellweaving": true,
+ "Mysticism": true,
+ "Imbuing": true,
+ "Throwing": false
+ }
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/assistants.json b/Distribution/Configuration/assistants.json
new file mode 100644
index 000000000..689864309
--- /dev/null
+++ b/Distribution/Configuration/assistants.json
@@ -0,0 +1,33 @@
+{
+ "warnOnFailure": true,
+ "kickOnFailure": true,
+ "disallowedFeatures": {
+ "FilterWeather": false,
+ "FilterLight": false,
+ "SmartTarget": false,
+ "RangedTarget": false,
+ "AutoOpenDoors": false,
+ "DequipOnCast": false,
+ "AutoPotionEquip": false,
+ "PoisonedChecks": false,
+ "LoopedMacros": false,
+ "UseOnceAgent": false,
+ "RestockAgent": false,
+ "SellAgent": false,
+ "BuyAgent": false,
+ "PotionHotkeys": false,
+ "RandomTargets": false,
+ "ClosestTargets": false,
+ "OverheadHealth": false,
+ "AutolootAgent": false,
+ "BoneCutterAgent": false,
+ "JScriptMacros": false,
+ "AutoRemount": false,
+ "AutoBandage": false,
+ "EnemyTargetShare": false,
+ "FilterSeason": false,
+ "SpellTargetShare": false
+ },
+ "disconnectDelay": "00:00:15",
+ "warningMessage": "The server was unable to negotiate features with your assistant. You must download and run an updated version of UOSteam or Razor.
Make sure you've checked the option Negotiate features with server, once you have this box checked you may log in and play normally.
You will be disconnected shortly."
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/auto-denylist.json b/Distribution/Configuration/auto-denylist.json
new file mode 100644
index 000000000..9ba21f04a
--- /dev/null
+++ b/Distribution/Configuration/auto-denylist.json
@@ -0,0 +1,5 @@
+{
+ "enabled": true,
+ "duration": "00:15:00",
+ "maxEntries": 324449
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/bans.json b/Distribution/Configuration/bans.json
new file mode 100644
index 000000000..ec0c1c330
--- /dev/null
+++ b/Distribution/Configuration/bans.json
@@ -0,0 +1,6 @@
+{
+ "reportRateLimitTrips": true,
+ "autoBanDuration": "04:00:00",
+ "reportBadConnects": true,
+ "badConnectDuration": "04:00:00"
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/blocklist.json b/Distribution/Configuration/blocklist.json
new file mode 100644
index 000000000..fdb20c0a5
--- /dev/null
+++ b/Distribution/Configuration/blocklist.json
@@ -0,0 +1,8 @@
+{
+ "enabled": false,
+ "file": "Configuration/ip-blocklist.txt",
+ "reloadInterval": "00:01:00",
+ "reportHits": true,
+ "banDuration": "06:00:00",
+ "promoteSuppression": "00:01:00"
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/crowdsec.json b/Distribution/Configuration/crowdsec.json
new file mode 100644
index 000000000..e0a77fe6d
--- /dev/null
+++ b/Distribution/Configuration/crowdsec.json
@@ -0,0 +1,9 @@
+{
+ "lapiUrl": "http://127.0.0.1:8080",
+ "machineId": "",
+ "password": "",
+ "origin": "modernuo",
+ "manualBanDuration": "7.00:00:00",
+ "flushInterval": "00:00:01",
+ "maxQueue": 10000
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/email-settings.json b/Distribution/Configuration/email-settings.json
new file mode 100644
index 000000000..ee04379aa
--- /dev/null
+++ b/Distribution/Configuration/email-settings.json
@@ -0,0 +1,15 @@
+{
+ "enabled": false,
+ "fromAddress": "support@modernuo.com",
+ "fromName": "ModernUO Team",
+ "crashAddress": "crashes@modernuo.com",
+ "crashName": "Crash Log",
+ "speechLogPageAddress": "support@modernuo.com",
+ "speechLogPageName": "GM Support Conversation",
+ "emailServer": "smtp.gmail.com",
+ "emailPort": 465,
+ "emailUsername": "support@modernuo.com",
+ "emailPassword": "Some Password 123",
+ "emailSendRetryCount": 5,
+ "emailSendRetryDelay": 3
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/expansion.json b/Distribution/Configuration/expansion.json
new file mode 100644
index 000000000..4ddbdb733
--- /dev/null
+++ b/Distribution/Configuration/expansion.json
@@ -0,0 +1,79 @@
+{
+ "Id": 5,
+ "Name": "Age of Shadows",
+ "ClientFlags": "Malas",
+ "SupportedFeatures": {
+ "ExpansionT2A": true,
+ "T2A": true,
+ "UOR": true,
+ "UOTD": false,
+ "LBR": true,
+ "AOS": true,
+ "SixthCharacterSlot": false,
+ "SE": false,
+ "ML": false,
+ "EighthAge": false,
+ "NinthAge": false,
+ "TenthAge": false,
+ "IncreasedStorage": false,
+ "SeventhCharacterSlot": false,
+ "RoleplayFaces": false,
+ "TrialAccount": false,
+ "LiveAccount": true,
+ "SA": false,
+ "HS": false,
+ "Gothic": false,
+ "Rustic": false,
+ "Jungle": false,
+ "Shadowguard": false,
+ "TOL": false,
+ "EJ": false
+ },
+ "CharacterListFlags": {
+ "Unk1": false,
+ "OverwriteConfigButton": false,
+ "OneCharacterSlot": false,
+ "ExpansionNone": true,
+ "ExpansionUOTD": true,
+ "ExpansionLBR": true,
+ "ExpansionT2A": true,
+ "ExpansionUOR": true,
+ "ContextMenus": true,
+ "SlotLimit": false,
+ "AOS": true,
+ "SixthCharacterSlot": false,
+ "SE": false,
+ "ML": false,
+ "KR": false,
+ "UO3DClientType": false,
+ "Unk3": false,
+ "SeventhCharacterSlot": false,
+ "Unk4": false,
+ "NewMovementSystem": false,
+ "NewFeluccaAreas": false
+ },
+ "HousingFlags": {
+ "AOS": true,
+ "HousingAOS": true,
+ "SE": false,
+ "ML": false,
+ "Crystal": false,
+ "SA": false,
+ "HS": false,
+ "Gothic": false,
+ "Rustic": false,
+ "Jungle": false,
+ "Shadowguard": false,
+ "TOL": false,
+ "EJ": false
+ },
+ "MobileStatusVersion": 6,
+ "MapSelectionFlags": {
+ "Felucca": true,
+ "Trammel": true,
+ "Ilshenar": true,
+ "Malas": true,
+ "Tokuno": false,
+ "TerMur": false
+ }
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/firewall.json b/Distribution/Configuration/firewall.json
new file mode 100644
index 000000000..c43cb320f
--- /dev/null
+++ b/Distribution/Configuration/firewall.json
@@ -0,0 +1,3 @@
+{
+ "entries": []
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/ip-allowlist.json b/Distribution/Configuration/ip-allowlist.json
new file mode 100644
index 000000000..b588dbca1
--- /dev/null
+++ b/Distribution/Configuration/ip-allowlist.json
@@ -0,0 +1,7 @@
+{
+ "enabled": false,
+ "files": [
+ "Configuration/ip-allowlist*.txt"
+ ],
+ "reloadInterval": "00:01:00"
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/login-allowlist.json b/Distribution/Configuration/login-allowlist.json
new file mode 100644
index 000000000..be8521524
--- /dev/null
+++ b/Distribution/Configuration/login-allowlist.json
@@ -0,0 +1,8 @@
+{
+ "enabled": true,
+ "file": "Configuration/login-allowlist.txt",
+ "ttl": "90.00:00:00",
+ "flushInterval": "01:00:00",
+ "escalateAfterStrikes": 10,
+ "strikeWindow": "01:00:00"
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/modernuo.json b/Distribution/Configuration/modernuo.json
new file mode 100644
index 000000000..ef7588a1c
--- /dev/null
+++ b/Distribution/Configuration/modernuo.json
@@ -0,0 +1,100 @@
+{
+ "assemblyDirectories": [
+ "./Assemblies"
+ ],
+ "dataDirectories": [
+ "Data/Files"
+ ],
+ "listeners": [
+ "0.0.0.0:2593"
+ ],
+ "settings": {
+ "accountHandler.enableAutoAccountCreation": "True",
+ "accountHandler.enablePlayerPasswordCommand": "False",
+ "accountHandler.maxAccountsPerIP": "1",
+ "accountSecurity.encryptionAlgorithm": "Argon2",
+ "assistants.enableNegotiation": "False",
+ "autoArchive.archiveLocally": "True",
+ "autoArchive.archivePath": "Archives",
+ "autoArchive.backupMaxAge": "30",
+ "autoArchive.backupPath": "Backups",
+ "autoArchive.compressionLevel": "3",
+ "autoArchive.dailyRetention": "30",
+ "autoArchive.enableArchivePruning": "True",
+ "autoArchive.hourlyRetention": "24",
+ "autoArchive.monthlyRetention": "12",
+ "autoArchive.retryCount": "3",
+ "autoArchive.retryDelayMs": "500",
+ "autoArchive.verifyArchives": "True",
+ "autosave.enabled": "True",
+ "autosave.saveDelay": "00:05:00",
+ "autosave.warningDelay": "00:00:00",
+ "buffIcons.enable": "False",
+ "bulletinboards.creationTimeDelay": "00:02:00",
+ "bulletinboards.expireDuration": "06:00:00",
+ "bulletinboards.replyDelay": "00:00:30",
+ "chat.enabled": "False",
+ "clientVerification.ageLeniency": "10.00:00:00",
+ "clientVerification.enable": "True",
+ "clientVerification.gameTimeLeniency": "1.01:00:00",
+ "clientVerification.invalidClientResponse": "Kick",
+ "clientVerification.kickDelay": "00:00:20",
+ "commandsystem.prefix": "[",
+ "crashGuard.enabled": "True",
+ "crashGuard.generateReport": "True",
+ "crashGuard.restartServer": "True",
+ "crashGuard.saveBackup": "True",
+ "ethics.enable": "False",
+ "houseDecay.enable": "True",
+ "movement.delay.runFoot": "200",
+ "movement.delay.runMount": "100",
+ "movement.delay.turn": "0",
+ "movement.delay.walkFoot": "400",
+ "movement.delay.walkMount": "200",
+ "movementThrottle.debugLogging": "False",
+ "movementThrottle.definiteRateThreshold": "1.100000023841858",
+ "movementThrottle.hardQueueLimit": "10",
+ "movementThrottle.maxCredit": "200",
+ "movementThrottle.minSamplesForRate": "8",
+ "movementThrottle.movementHistorySize": "20",
+ "movementThrottle.suspiciousRateThreshold": "1.0499999523162842",
+ "murderSystem.bountiesEnabled": "False",
+ "murderSystem.bountyExpiry": "14.00:00:00",
+ "murderSystem.longTermMurderDuration": "1.16:00:00",
+ "murderSystem.recentlyReportedDelay": "00:10:00",
+ "murderSystem.shortTermMurderDuration": "08:00:00",
+ "network.maxOutstandingSends": "32",
+ "network.sendBufferSize": "262144",
+ "pages.discordWebhookUrl": null,
+ "pathfinding.enable": "True",
+ "pathfinding.maxResidentChunks": "8192",
+ "pathfinding.maxSearchNodes": "1000",
+ "pathfinding.prebakeMaps": "False",
+ "pathfinding.recorder.enable": "False",
+ "pathfinding.recorder.path": "/mnt/fileStorage/Projects/ModernUO/Server/Distribution/Data/Pathfinding/recordings/pathfinds.jsonl",
+ "pingServer.enabled": "True",
+ "questSystem.enableMLQuests": "False",
+ "serverListing.address": null,
+ "serverListing.autoDetect": "True",
+ "serverListing.serverName": "ModernUO",
+ "stamina.additionalLossWhenBelow": "0.1",
+ "stamina.baseOverweightLoss": "5",
+ "stamina.cannotRunWhenFatigued": "False",
+ "stamina.cannotWalkWhenFatigued": "False",
+ "stamina.enableMountStamina": "True",
+ "stamina.stonesOverweightAllowance": "4",
+ "stamina.stonesPerOverweightLoss": "25",
+ "stats.gainChanceMultiplier": "1",
+ "stats.statMax": "125",
+ "testCenter.enable": "False",
+ "timer.initialPoolCapacity": "1024",
+ "timer.maxPoolCapacity": "16384",
+ "uogateway.enabled": "True",
+ "vetRewards.enable": "True",
+ "vetRewards.rewardInterval": "30.00:00:00",
+ "vetRewards.skillCapRewards": "True",
+ "world.enableAutoRestart": "False",
+ "world.savePath": "Saves",
+ "world.useMultithreadedSaves": "True"
+ }
+}
\ No newline at end of file
diff --git a/Distribution/Configuration/throttles.json b/Distribution/Configuration/throttles.json
new file mode 100644
index 000000000..ee8fa7be3
--- /dev/null
+++ b/Distribution/Configuration/throttles.json
@@ -0,0 +1,6 @@
+{
+ "0x03": 25,
+ "0x12": 25,
+ "0x75": 500,
+ "0xAD": 25
+}
\ No newline at end of file
diff --git a/Projects/Application/Application.csproj b/Projects/Application/Application.csproj
index 7047e2548..1a162645c 100644
--- a/Projects/Application/Application.csproj
+++ b/Projects/Application/Application.csproj
@@ -1,4 +1,4 @@
-
+
Exe
MUO.ico
@@ -6,21 +6,21 @@
ModernUO
ModernUO Server
- ..\..\..\Distribution
+ ..\..\Distribution
0.0.0
Debug;Release;Analyze
Server
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/Projects/Logger/Logger.csproj b/Projects/Logger/Logger.csproj
index 1284358c1..6011e8299 100644
--- a/Projects/Logger/Logger.csproj
+++ b/Projects/Logger/Logger.csproj
@@ -1,10 +1,10 @@
-
+
Server
Logger
ModernUO Logger
- ..\..\..\Distribution\Assemblies
- ..\..\..\Distribution\Assemblies
+ ..\..\Distribution\Assemblies
+ ..\..\Distribution\Assemblies
Debug;Release;Analyze
@@ -12,8 +12,8 @@
-
-
-
+
+
+
diff --git a/Projects/Server/Server.csproj b/Projects/Server/Server.csproj
index f54f8ee05..fd69557b7 100644
--- a/Projects/Server/Server.csproj
+++ b/Projects/Server/Server.csproj
@@ -2,8 +2,8 @@
ModernUO Core
- ..\..\..\Distribution
- ..\..\..\Distribution
+ ..\..\Distribution
+ ..\..\Distribution
0.0.0
Debug;Release;Analyze
Server
@@ -11,26 +11,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Projects/UOContent/UOContent.csproj b/Projects/UOContent/UOContent.csproj
index 1305c2d87..60f28ac6f 100644
--- a/Projects/UOContent/UOContent.csproj
+++ b/Projects/UOContent/UOContent.csproj
@@ -4,36 +4,36 @@
Server
UOContent
ModernUO Content
- ..\..\..\Distribution\Assemblies
- ..\..\..\Distribution\Assemblies
+ ..\..\Distribution\Assemblies
+ ..\..\Distribution\Assemblies
Debug;Release;Analyze
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Run.sh b/Run.sh
index a6351960c..b35f9425a 100755
--- a/Run.sh
+++ b/Run.sh
@@ -1,2 +1,2 @@
echo "Starting Server...."
-dotnet ../Distribution/ModernUO.dll
+dotnet ./Distribution/ModernUO.dll
diff --git a/publish.sh b/publish.sh
index 30d80c4f2..141f02b58 100755
--- a/publish.sh
+++ b/publish.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
set -e
REPO_ROOT="$(cd "$(dirname "$0")" && pwd)"