Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
385c0a3
update to AdvanceOptions
jupster May 15, 2024
99b4ef8
Update ServerCfg.cs
jupster May 15, 2024
c6515fc
Update ServerCfg.cs
jupster May 15, 2024
da66195
Update ServerCfg.cs
jupster May 15, 2024
a56feba
Update ServerCfg.cs
jupster May 16, 2024
7f99b46
Advanced Option update
jupster May 16, 2024
9ef0c57
Advanced Options nearly "might" work
jupster May 17, 2024
2699755
Version Bump
jupster Sep 26, 2024
eb55b44
Updates for AdvancedOptions
jupster Sep 26, 2024
5249e89
Merge remote-tracking branch 'upstream/master' into hotfix/logobjects…
jupster Oct 11, 2024
bff6ca8
Merge remote-tracking branch 'upstream/master' into hotfix/logobjects…
jupster Oct 13, 2024
0261dde
Clean code
jupster Oct 13, 2024
ed25c19
Refactor model classes and fix property assignments
jupster Jul 5, 2025
fb605cc
Fix indentation in ServerProfile.cs constructor
jupster Jul 5, 2025
50ecf0b
Fix typos and improve comments in ServerCfg.cs
jupster Jul 5, 2025
b8022f4
Fix assignment of AdvancedOptionsContent in ServerProfile
jupster Jul 6, 2025
f8da3ba
Reformat FASTER.csproj and clean up property groups
jupster Jul 20, 2025
06710f9
Drop to .NET 8 and bump version to 1.9.7.2
jupster Jul 20, 2025
d45b2c2
Enable Windows targeting in project file
jupster Jul 20, 2025
b84d9be
Enable Windows targeting in project files x2
jupster Jul 20, 2025
decc343
Fix BytexDigital.Steam project path in solution file
jupster Jul 20, 2025
42ea5ca
Revert "Fix BytexDigital.Steam project path in solution file"
jupster Jul 20, 2025
94cf349
Update checkout action to use recursive submodules
jupster Jul 20, 2025
96e492b
Add file listing step to CodeQL workflow
jupster Jul 20, 2025
05f9585
Update CodeQL workflow to improve submodule handling
jupster Jul 20, 2025
c3e8601
Downgrade .NET SDK version to 8.0.0 in global.json
jupster Jul 20, 2025
788a8a7
Merge pull request #186 from Foxlider/hotfix/logobjectsnotfound
jupster Jul 20, 2025
9847124
Revert "Merge pull request #186 from Foxlider/hotfix/logobjectsnotfound"
jupster Jul 25, 2025
5759822
Reapply "Merge pull request #186 from Foxlider/hotfix/logobjectsnotfo…
jupster Jul 25, 2025
3174513
Fix property backing field casing in ServerCfg
jupster Jul 25, 2025
5edf07f
Fix property setter recursion in ServerCfg
jupster Jul 25, 2025
bbbd24b
Remove duplicate assignment in ServerProfile
jupster Jul 25, 2025
4b34bd3
Bump version to 1.9.7.3
jupster Jul 25, 2025
8982499
Add path for advanced server config in SaveProfile
jupster Jul 25, 2025
8c90880
Refactor AdvancedOptions to use correct type
jupster Jul 25, 2025
243e26f
Refactor AdvancedOptions to separate class
jupster Jul 25, 2025
e025bfd
Update ServerProfile.cs
jupster Jul 25, 2025
54deb4d
Advanced File exists
jupster Jul 25, 2025
9ff7583
Spelling Good 👍
jupster Jul 26, 2025
d965529
Improve RaisePropertyChanged calls using nameof
jupster Jul 26, 2025
1cc455b
Refactor ProfileViewModel
jupster Jul 26, 2025
7d37e3f
Update AdvancedOptions.cs
jupster Jul 26, 2025
6cc25d7
Output pls
jupster Jul 26, 2025
02c7cb2
Align UI checkboxes with AdvancedOptions
jupster Jul 27, 2025
02e5fa3
Update ProfileViewModel.cs
jupster Jul 27, 2025
d485ebf
I'm stupid
jupster Jul 27, 2025
397cc48
Fix nested code
jupster Jul 27, 2025
45a289d
Merge branch 'feature/Update-1.9' into Hotfix/net8
jupster Jul 27, 2025
98a2259
Update ServerCfg.cs
jupster Jul 28, 2025
1054a66
Merge branch 'Hotfix/net8' of https://github.com/Foxlider/FASTER into…
jupster Jul 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion FASTER/FASTER.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>FASTERKey.snk</AssemblyOriginatorKeyFile>
<Authors>Keelah Fox, Jupster, Canno.n</Authors>
<Version>1.9.7.2</Version>
<Version>1.9.7.3</Version>
<Company>FoxliCorp.</Company>
<Description>Fox's Arma Server Tool Extended Rewrite</Description>
<Copyright>Copyright © 2019</Copyright>
Expand Down
100 changes: 100 additions & 0 deletions FASTER/Models/AdvancedOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
using System;
using System.ComponentModel;

namespace FASTER.Models
{
[Serializable]
public class AdvancedOptions : INotifyPropertyChanged
{
private bool logObjectNotFound = true; // logging enabled
private bool skipDescriptionParsing = false; // Parse description.ext
private bool ignoreMissionLoadErrors = false; // Do not ignore errors
private int queueSizeLogG = 0; // If a specific players message queue is larger than <Value> and '#monitor' is running, dump the messages to a logfile for analysis
private string advancedOptionsContent;

public bool LogObjectNotFound
{
get => logObjectNotFound;
set
{
logObjectNotFound = value;
RaisePropertyChanged(nameof(LogObjectNotFound));
}
}

public bool SkipDescriptionParsing
{
get => skipDescriptionParsing;
set
{
skipDescriptionParsing = value;
RaisePropertyChanged(nameof(SkipDescriptionParsing));
}
}

public bool IgnoreMissionLoadErrors
{
get => ignoreMissionLoadErrors;
set
{
ignoreMissionLoadErrors = value;
RaisePropertyChanged(nameof(IgnoreMissionLoadErrors));
}
}

public int QueueSizeLogG
{
get => queueSizeLogG;
set
{
queueSizeLogG = value;
RaisePropertyChanged(nameof(QueueSizeLogG));
}
}

public string AdvancedOptionsContent
{
get => advancedOptionsContent;
set
{
advancedOptionsContent = value;
RaisePropertyChanged(nameof(AdvancedOptionsContent));
}
}

public AdvancedOptions()
{
if(string.IsNullOrWhiteSpace(AdvancedOptionsContent))
{
AdvancedOptionsContent = ProcessFile();
}
}

public string ProcessFile()
{
string output = "//\r\n"
+ "// AdvancedOptions\r\n"
+ "//\r\n"
+ "// comments are written with \"//\" in front of them.\r\n"
+ "\r\n"
+ "\r\n"
+ $"queueSizeLogG = {QueueSizeLogG};\t\t\t// If a specific players message queue is larger than Value number and #monitor is running, dump his messages to a logfile for analysis\r\n"
+ $"LogObjectNotFound = {LogObjectNotFound};\t\t// When false to skip logging 'Server: Object not found messages'.\r\n"
+ $"SkipDescriptionParsing = {SkipDescriptionParsing};\t\t// When true to skip parsing of description.ext/mission.sqm. Will show pbo filename instead of configured missionName. OverviewText and such won't work, but loading the mission list is a lot faster when there are many missions\r\n"
+ $"ignoreMissionLoadErrors = {IgnoreMissionLoadErrors};\t\t// When set to true, the mission will load no matter the amount of loading errors. If set to false, the server will abort mission's loading and return to mission selection.\r\n"
+ "\r\n"
+ "\r\n";
return output;
}
public event PropertyChangedEventHandler? PropertyChanged;

private void RaisePropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
if (property != nameof(AdvancedOptionsContent))
{
AdvancedOptionsContent = ProcessFile();
}
}
}
}
2 changes: 1 addition & 1 deletion FASTER/Models/Arma3Profile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public class Arma3Profile : INotifyPropertyChanged
private ushort mapContentMines = 1;
private ushort autoReport = 0;
private ushort multipleSaves = 0;
private int tacticalPing = 1;
private int tacticalPing = 1;

private ushort aiLevelPreset = 3;
private double skillAi = 0.5;
Expand Down
16 changes: 8 additions & 8 deletions FASTER/Models/BasicCfg.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ public static class BasicCfgArrays
[Serializable]
public class BasicCfg : INotifyPropertyChanged
{
private uint viewDistance = 2000;
private double terrainGrid = 25;
private uint viewDistance = 2000;
private double terrainGrid = 25;

private ushort maxMsgSend = 128;
private ushort maxSizeGuaranteed = 256;
Expand Down Expand Up @@ -158,10 +158,10 @@ public string PerfPreset
MaxMsgSend = 256;
MaxSizeGuaranteed = 512;
MaxSizeNonGuaranteed = 256;
MinErrorToSend = 0.001;
MinErrorToSendNear = 0.01;
MaxPacketSize = 1400;
MaxCustomFileSize = 160;
MinErrorToSend = 0.001;
MinErrorToSendNear = 0.01;
MaxPacketSize = 1400;
MaxCustomFileSize = 160;


switch ((short)Array.IndexOf(BasicCfgArrays.PerfPresets, value))
Expand All @@ -177,8 +177,8 @@ public string PerfPreset
MinBandwidth = 250000000;
break;
case 4:
MaxMsgSend = 512;
MinBandwidth = 1000000000;
MaxMsgSend = 512;
MinBandwidth = 1000000000;
break;
}
RaisePropertyChanged("PerfPreset");
Expand Down
90 changes: 21 additions & 69 deletions FASTER/Models/ServerCfg.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ public class ServerCfg : INotifyPropertyChanged
private string passwordAdmin;
private string password;
private string hostname;
private int maxPlayers = 32;
private List<string> motd = new();
private int maxPlayers = 32;
private List<string> motd = new();
private int motdInterval;
private List<string> admins = new();
private List<string> headlessClients = new();
private List<string> localClient = new();
private List<string> admins = new();
private List<string> headlessClients = new();
private List<string> localClient = new();
private bool headlessClientEnabled;
private bool votingEnabled;
private bool netlogEnabled;
Expand All @@ -47,18 +47,13 @@ public class ServerCfg : INotifyPropertyChanged
private bool autoSelectMission = true;
private bool randomMissionOrder = true;
private int briefingTimeOut = 60; // <-
private int roleTimeOut = 90; // <- These are BI base figues
private int votingTimeOut = 60; // <-
private int roleTimeOut = 90; // <- These are BI base figues
private int votingTimeOut = 60; // <-
private int debriefingTimeOut = 45; // <-
private bool LogObjectNotFound = true; // logging enabled
private bool SkipDescriptionParsing = false; // parse description.ext
private bool ignoreMissionLoadErrors = false; // do not ingore errors
private int armaUnitsTimeout = 30; // Defines how long the player will be stuck connecting and wait for armaUnits data. Player will be notified if timeout elapsed and no units data was received
private int queueSizeLogG = 1000000; // if a specific players message queue is larger than 1MB and '#monitor' is running, dump his messages to a logfile for analysis
private string forcedDifficulty = "Custom"; // By default forcedDifficulty is only applying Custom


//Arma server only
//Arma Server Only
private short verifySignatures = 0; // 0 = Disabled (FASTER Default); 1 = Deprecated Activated ; 2 = Activated (Arma Default)
private bool drawingInMap = true;
private short disableVoN; // 0 = VoN activated ; 1 = VoN Disabled
Expand All @@ -78,17 +73,19 @@ public class ServerCfg : INotifyPropertyChanged
private string doubleIdDetected;
private string onUserConnected;
private string onUserDisconnected;
private string onHackedData = "kick (_this select 0)";
private string onHackedData = "kick (_this select 0)";
private string onDifferentData;
private string onUnsignedData = "kick (_this select 0)";
private string onUnsignedData = "kick (_this select 0)";
private string onUserKicked;

//Mision Settings
private bool missionSelectorChecked;
private string missionContentOverride;
private List<ProfileMission> _missions = new();
private List<ProfileMission> _missions = new();
private bool autoInit;
private string difficulty = "Custom";

//Performance
private bool maxMemOverride;
private uint maxMem = 1024;
private bool cpuCountOverride;
Expand All @@ -97,8 +94,6 @@ public class ServerCfg : INotifyPropertyChanged

private string serverCfgContent;



#region Server Options
public string PasswordAdmin
{
Expand Down Expand Up @@ -290,7 +285,7 @@ public string AllowedFilePatching
set
{
allowedFilePatching = (short)Array.IndexOf(ServerCfgArrays.AllowFilePatchingStrings, value);
RaisePropertyChanged("Password");
RaisePropertyChanged("AllowedFilePatching");
}
}

Expand Down Expand Up @@ -394,36 +389,6 @@ public int DebriefingTimeOut
}
}

public bool logObjectNotFound
{
get => LogObjectNotFound;
set
{
LogObjectNotFound = value;
RaisePropertyChanged("logObjectNotFound");
}
}

public bool skipDescriptionParsing
{
get => SkipDescriptionParsing;
set
{
SkipDescriptionParsing = value;
RaisePropertyChanged("skipDescriptionParsing");
}
}

public bool IgnoreMissionLoadErrors
{
get => ignoreMissionLoadErrors;
set
{
ignoreMissionLoadErrors = value;
RaisePropertyChanged("IgnoreMissionLoadErrors");
}
}

public int ArmaUnitsTimeout
{
get => armaUnitsTimeout;
Expand All @@ -434,16 +399,6 @@ public int ArmaUnitsTimeout
}
}

public int QueueSizeLogG
{
get => queueSizeLogG;
set
{
queueSizeLogG = value;
RaisePropertyChanged("QueueSizeLogG");
}
}

public string ForcedDifficulty
{
get => forcedDifficulty;
Expand Down Expand Up @@ -888,14 +843,10 @@ public string ProcessFile()
+ $"disableVoN = {disableVoN};\t\t\t\t// If set to 1, Voice over Net will not be available\r\n"
+ $"vonCodec = {vonCodec};\t\t\t\t// If set to 1 then it uses IETF standard OPUS codec, if to 0 then it uses SPEEX codec (since Arma 3 update 1.58+) \r\n"
+ $"skipLobby = {(skipLobby ? "1" : "0")};\t\t\t\t// Overridden by mission parameters\r\n"
+ $"vonCodecQuality = {vonCodecQuality};\t\t\t// since 1.62.95417 supports range 1-20 //since 1.63.x will supports range 1-30 //8kHz is 0-10, 16kHz is 11-20, 32kHz(48kHz) is 21-30 \r\n"
+ $"vonCodecQuality = {vonCodecQuality};\t\t\t// Since 1.62.95417 supports range 1-20 //since 1.63.x will supports range 1-30 //8kHz is 0-10, 16kHz is 11-20, 32kHz(48kHz) is 21-30 \r\n"
+ $"persistent = {persistent};\t\t\t\t// If 1, missions still run on even after the last player disconnected.\r\n"
+ $"timeStampFormat = \"{timeStampFormat}\";\t\t// Set the timestamp format used on each report line in server-side RPT file. Possible values are \"none\" (default),\"short\",\"full\".\r\n"
+ $"BattlEye = {battlEye};\t\t\t\t// Server to use BattlEye system\r\n"
+ $"queueSizeLogG = {queueSizeLogG};\t\t\t// If a specific players message queue is larger than 1MB and #monitor is running, dump his messages to a logfile for analysis \r\n"
+ $"LogObjectNotFound = {logObjectNotFound};\t\t// When false to skip logging 'Server: Object not found messages'.\r\n"
+ $"SkipDescriptionParsing = {skipDescriptionParsing};\t\t// When true to skip parsing of description.ext/mission.sqm. Will show pbo filename instead of configured missionName. OverviewText and such won't work, but loading the mission list is a lot faster when there are many missions \r\n"
+ $"ignoreMissionLoadErrors = {ignoreMissionLoadErrors};\t\t// When set to true, the mission will load no matter the amount of loading errors. If set to false, the server will abort mission's loading and return to mission selection.\r\n"
+ $"forcedDifficulty = {forcedDifficulty};\t\t\t// Forced difficulty (Recruit, Regular, Veteran, Custom)\r\n"
+ "\r\n"
+ "// TIMEOUTS\r\n"
Expand All @@ -917,9 +868,9 @@ public string ProcessFile()
+ $"doubleIdDetected = \"{doubleIdDetected}\";\t\t\t//\r\n"
+ "\r\n"
+ "// SIGNATURE VERIFICATION\r\n"
+ $"onUnsignedData = \"{onUnsignedData}\";\t// unsigned data detected\r\n"
+ $"onHackedData = \"{onHackedData}\";\t// tampering of the signature detected\r\n"
+ $"onDifferentData = \"{onDifferentData}\";\t\t\t// data with a valid signature, but different version than the one present on server detected\r\n"
+ $"onUnsignedData = \"{onUnsignedData}\";\t// Unsigned data detected\r\n"
+ $"onHackedData = \"{onHackedData}\";\t// Tampering of the signature detected\r\n"
+ $"onDifferentData = \"{onDifferentData}\";\t\t\t// Data with a valid signature, but different version than the one present on server detected\r\n"
+ "\r\n"
+ "\r\n"
+ "// MISSIONS CYCLE (see below)\r\n"
Expand All @@ -934,6 +885,7 @@ public string ProcessFile()
+ "// HEADLESS CLIENT\r\n"
+ $"{(headlessClientEnabled && !headlessClients.Exists(string.IsNullOrWhiteSpace) ? $"headlessClients[] = { "{\n\t\"" + string.Join("\",\n\t \"", headlessClients) + "\"\n}" };\r\n" : "")}"
+ $"{(headlessClientEnabled && !localClient.Exists(string.IsNullOrWhiteSpace)? $"localClient[] = { "{\n\t\"" + string.Join("\",\n\t \"", localClient) + "\"\n}" };" : "")}";
+ "\r\n"
return output;
}

Expand All @@ -950,7 +902,7 @@ private void RaisePropertyChanged(string property)
[Serializable]
public class ProfileMission : INotifyPropertyChanged
{
private bool missionChecked;
private bool missionChecked;
private string name;
private string path;

Expand Down Expand Up @@ -991,4 +943,4 @@ private void RaisePropertyChanged(string property)
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
}
}
Loading
Loading