Merge pull request #517 from EpochModTeam/experimental

0.3.8.0429
This commit is contained in:
vbawol 2016-04-24 12:53:35 -05:00
commit ae62c66697
69 changed files with 216 additions and 143 deletions

View File

@ -43,16 +43,23 @@
[Info] Some AI Scripts Mods may not work with disableRemoteSensors enabled. You can disable with "disableRemoteSensors = false;" in CfgEpochClient. [Info] Some AI Scripts Mods may not work with disableRemoteSensors enabled. You can disable with "disableRemoteSensors = false;" in CfgEpochClient.
[Info] Removed old .bikey and added new one for 0380. [Info] Removed old .bikey and added new one for 0380.
Build: 427 Build: 429
[Added] Install batch for all CUP mods and CBA. https://github.com/EpochModTeam/Epoch/tree/master/Tools/Install
[Changed] Make use of new getOutMan EH for vehicle epoch anti wall glitch checks.
[Changed] Change last few uses of hintSilent to Epoch_dynamicText. Now only the debug monitor uses hintSilent.
[Changed] 1.58 Difficulty Overhaul changes to enable 3rd person. Thanks to klinGiii on the forum: http://epochmod.com/forum/index.php?/topic/41922-158-difficulty-overhaul
[Changed] Epoch AH reworked displayAddEventHandler checks to use.
[Changed] Increased range for vehicle interactions to fix issues with access to larger vehicles. Thanks to Grahame for the report: http://epochmod.com/forum/index.php?/topic/41894-cannot-unlock-large-vehicles/ [Changed] Increased range for vehicle interactions to fix issues with access to larger vehicles. Thanks to Grahame for the report: http://epochmod.com/forum/index.php?/topic/41894-cannot-unlock-large-vehicles/
[Changed] Preloading sapper by spawning one on the map at server start. [Changed] Preloading sapper by spawning one on the map at server start.
[Changed] Change to github markdown for credits and license. [Changed] Change to github markdown for credits and license.
[Fixed] Fixed Arma install batch script not closing after update.
[Fixed] Mission loot payout not working. Thanks to @He-Man for the fix: http://epochmod.com/forum/index.php?/topic/41892-payout-trader-mission-broken/ [Fixed] Mission loot payout not working. Thanks to @He-Man for the fix: http://epochmod.com/forum/index.php?/topic/41892-payout-trader-mission-broken/
[Fixed] Crafting recipe for Vehicle Repair Kit had wrong part in usedIn array. Thanks to LeBarbare for the report: http://epochmod.com/forum/index.php?/topic/41896-wrong-recipe-place/ [Fixed] Crafting recipe for Vehicle Repair Kit had wrong part in usedIn array. Thanks to LeBarbare for the report: http://epochmod.com/forum/index.php?/topic/41896-wrong-recipe-place/
[Fixed] Green Marked traders unable to be accessed. [Fixed] Green Marked traders unable to be accessed. Thanks to @He-Man for the report: http://epochmod.com/forum/index.php?/topic/41887-radom-unexpected-script-failure-with-traders-ai_slot/
[Fixed] Trailing commas in CfgLootTable. [Fixed] Trailing commas in CfgLootTable.
[Fixed] Disallow building inside of vehicles. [Fixed] Disallow building inside of vehicles.
[Fixed] Incorrectly enabled CUP vehicles and weapons support if only Core and Maps where enabled. [Fixed] Incorrectly enabled CUP vehicles and weapons support if only Core and Maps where enabled.
[Fixed] removeExec Battleye kick fixed. [Fixed] removeExec Battleye kick fixed.
[Fixed] Player getting stuck waiting for inventory to load. [Fixed] Player getting stuck waiting for inventory to load.
[Fixed] Delete base object if over limit. [Fixed] Delete base object if over limit.
[Info] Defined proper settings in full redis-example.conf

View File

@ -15,4 +15,4 @@ http://www.bistudio.com/community/licenses/arma-public-license-share-alike
Credits: Credits:
===== =====
https://github.com/EpochModTeam/Epoch/CREDITS.md https://github.com/EpochModTeam/Epoch/blob/master/CREDITS.md

View File

@ -3,7 +3,7 @@ BattlEyePath = C:\BattlEye
InstanceID = NA123 InstanceID = NA123
LogAbuse = 1 LogAbuse = 1
IP = 127.0.0.1 IP = 127.0.0.1
Port = 2303 Port = 2304
Password = changeme Password = changeme
[Redis] [Redis]

View File

@ -34,7 +34,7 @@
# On Windows, daemonize and pidfile are not supported. # On Windows, daemonize and pidfile are not supported.
# However, you can run redis as a Windows service, and specify a logfile. # However, you can run redis as a Windows service, and specify a logfile.
# The logfile will contain the pid. # The logfile will contain the pid.
# Accept connections on the specified port, default is 6379. # Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket. # If port 0 is specified Redis will not listen on a TCP socket.
@ -57,7 +57,7 @@ tcp-backlog 511
# Examples: # Examples:
# #
# bind 192.168.1.100 10.0.0.1 # bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 bind 127.0.0.1
# Specify the path for the Unix socket that will be used to listen for # Specify the path for the Unix socket that will be used to listen for
@ -95,12 +95,12 @@ tcp-keepalive 0
loglevel notice loglevel notice
# Specify the log file name. Also 'stdout' can be used to force # Specify the log file name. Also 'stdout' can be used to force
# Redis to log on the standard output. # Redis to log on the standard output.
logfile "" logfile ""
# To enable logging to the Windows EventLog, just set 'syslog-enabled' to # To enable logging to the Windows EventLog, just set 'syslog-enabled' to
# yes, and optionally update the other syslog parameters to suit your needs. # yes, and optionally update the other syslog parameters to suit your needs.
# If Redis is installed and launched as a Windows Service, this will # If Redis is installed and launched as a Windows Service, this will
# automatically be enabled. # automatically be enabled.
# syslog-enabled no # syslog-enabled no
@ -136,7 +136,7 @@ databases 16
save 900 1 save 900 1
save 300 10 save 300 10
save 60 10000 save 60 1000
# By default Redis will stop accepting writes if RDB snapshots are enabled # By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed. # (at least one save point) and the latest background save failed.
@ -175,9 +175,9 @@ dbfilename dump.rdb
# #
# The DB will be written inside this directory, with the filename specified # The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive. # above using the 'dbfilename' configuration directive.
# #
# The Append Only File will also be created inside this directory. # The Append Only File will also be created inside this directory.
# #
# Note that you must specify a directory here, not a file name. # Note that you must specify a directory here, not a file name.
dir ./ dir ./
@ -378,12 +378,12 @@ slave-priority 100
# #
# This should stay commented out for backward compatibility and because most # This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers). # people do not need auth (e.g. they run their own servers).
# #
# Warning: since Redis is pretty fast an outside user can try up to # Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should # 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break. # use a very strong password otherwise it will be very easy to break.
# #
# requirepass foobared requirepass Changeme9832
# Command renaming. # Command renaming.
# #
@ -419,59 +419,59 @@ slave-priority 100
# The Linux version of Redis relies on the system call fork() to perform # The Linux version of Redis relies on the system call fork() to perform
# point-in-time snapshots of the heap. In addition to the AOF and RDB backup # point-in-time snapshots of the heap. In addition to the AOF and RDB backup
# mechanism, the master-slave synchronization and clustering features are # mechanism, the master-slave synchronization and clustering features are
# dependent on this behavior of fork(). In order for the Windows version to # dependent on this behavior of fork(). In order for the Windows version to
# perform like the Linux version we had to simulate this aspect of fork(). # perform like the Linux version we had to simulate this aspect of fork().
# Doing so meant moving the Redis heap into a memory mapped file that can # Doing so meant moving the Redis heap into a memory mapped file that can
# be shared with a child process. # be shared with a child process.
# #
# *** There must be disk space available for this file in order for Redis # *** There must be disk space available for this file in order for Redis
# to launch. *** The default configuration places this file in the local # to launch. *** The default configuration places this file in the local
# appdata directory. If you wish to move this file to another local disk, # appdata directory. If you wish to move this file to another local disk,
# use the heapdir flag as described below. # use the heapdir flag as described below.
# #
# The maxheap flag controls the maximum size of this memory mapped file, # The maxheap flag controls the maximum size of this memory mapped file,
# as well as the total usable space for the Redis heap. Running Redis # as well as the total usable space for the Redis heap. Running Redis
# without either maxheap or maxmemory will result in a memory mapped file # without either maxheap or maxmemory will result in a memory mapped file
# being created that is equal to the size of physical memory. During # being created that is equal to the size of physical memory. During
# fork() operations the total page file commit will max out at around: # fork() operations the total page file commit will max out at around:
# #
# (size of physical memory) + (2 * size of maxheap) # (size of physical memory) + (2 * size of maxheap)
# #
# For instance, on a machine with 8GB of physical RAM, the max page file # For instance, on a machine with 8GB of physical RAM, the max page file
# commit with the default maxheap size will be (8)+(2*8) GB , or 24GB. The # commit with the default maxheap size will be (8)+(2*8) GB , or 24GB. The
# default page file sizing of Windows will allow for this without having # default page file sizing of Windows will allow for this without having
# to reconfigure the system. Larger heap sizes are possible, but the maximum # to reconfigure the system. Larger heap sizes are possible, but the maximum
# page file size will have to be increased accordingly. # page file size will have to be increased accordingly.
# #
# The Redis heap must be larger than the value specified by the maxmemory # The Redis heap must be larger than the value specified by the maxmemory
# flag, as the heap allocator has its own memory requirements and # flag, as the heap allocator has its own memory requirements and
# fragmentation of the heap is inevitable. If only the maxmemory flag is # fragmentation of the heap is inevitable. If only the maxmemory flag is
# specified, maxheap will be set at 1.5*maxmemory. If the maxheap flag is # specified, maxheap will be set at 1.5*maxmemory. If the maxheap flag is
# specified along with maxmemory, the maxheap flag will be automatically # specified along with maxmemory, the maxheap flag will be automatically
# increased if it is smaller than 1.5*maxmemory. # increased if it is smaller than 1.5*maxmemory.
# #
# maxheap <bytes> # maxheap <bytes>
# The heap memory mapped file must reside on a local path for heap sharing # The heap memory mapped file must reside on a local path for heap sharing
# between processes to work. A UNC path will not suffice here. For maximum # between processes to work. A UNC path will not suffice here. For maximum
# performance this should be located on the fastest local drive available. # performance this should be located on the fastest local drive available.
# This value defaults to the local application data folder(e.g., # This value defaults to the local application data folder(e.g.,
# "%USERPROFILE%\AppData\Local"). Since this file can be very large, you # "%USERPROFILE%\AppData\Local"). Since this file can be very large, you
# may wish to place this on a drive other than the one the operating system # may wish to place this on a drive other than the one the operating system
# is installed on. # is installed on.
# #
# Note that you must specify a directory here, not a file name. # Note that you must specify a directory here, not a file name.
# heapdir <directory path(absolute or relative)> # heapdir <directory path(absolute or relative)>
# If Redis is to be used as an in-memory-only cache without any kind of # If Redis is to be used as an in-memory-only cache without any kind of
# persistence, then the fork() mechanism used by the background AOF/RDB # persistence, then the fork() mechanism used by the background AOF/RDB
# persistence is unneccessary. As an optimization, all persistence can be # persistence is unneccessary. As an optimization, all persistence can be
# turned off in the Windows version of Redis. This will disable the creation of # turned off in the Windows version of Redis. This will disable the creation of
# the memory mapped heap file, redirect heap allocations to the system heap # the memory mapped heap file, redirect heap allocations to the system heap
# allocator, and disable commands that would otherwise cause fork() operations: # allocator, and disable commands that would otherwise cause fork() operations:
# BGSAVE and BGREWRITEAOF. This flag may not be combined with any of the other # BGSAVE and BGREWRITEAOF. This flag may not be combined with any of the other
# flags that configure AOF and RDB operations. # flags that configure AOF and RDB operations.
# persistence-available [(yes)|no] # persistence-available [(yes)|no]
# Don't use more memory than the specified amount of bytes. # Don't use more memory than the specified amount of bytes.
@ -512,18 +512,18 @@ slave-priority 100
# Peak Working Set reported by the Windows Task Manager and the used_memory_peak # Peak Working Set reported by the Windows Task Manager and the used_memory_peak
# reported by the INFO command. # reported by the INFO command.
# #
# maxmemory <bytes> maxmemory 1gb
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory # MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors: # is reached. You can select among five behaviors:
# #
# volatile-lru -> remove the key with an expire set using an LRU algorithm # volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm # allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set # volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key # allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL) # volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations # noeviction -> don't expire at all, just return an error on write operations
# #
# Note: with any of the above policies, Redis will return an error on write # Note: with any of the above policies, Redis will return an error on write
# operations, when there are no suitable keys for eviction. # operations, when there are no suitable keys for eviction.
# #
@ -612,7 +612,7 @@ appendfsync everysec
# the same as "appendfsync none". In practical terms, this means that it is # the same as "appendfsync none". In practical terms, this means that it is
# possible to lose up to 30 seconds of log in the worst scenario (with the # possible to lose up to 30 seconds of log in the worst scenario (with the
# default Linux settings). # default Linux settings).
# #
# If you have latency problems turn this to "yes". Otherwise leave it as # If you have latency problems turn this to "yes". Otherwise leave it as
# "no" that is the safest pick from the point of view of durability. # "no" that is the safest pick from the point of view of durability.
no-appendfsync-on-rewrite no no-appendfsync-on-rewrite no
@ -620,7 +620,7 @@ no-appendfsync-on-rewrite no
# Automatic rewrite of the append only file. # Automatic rewrite of the append only file.
# Redis is able to automatically rewrite the log file implicitly calling # Redis is able to automatically rewrite the log file implicitly calling
# BGREWRITEAOF when the AOF log size grows by the specified percentage. # BGREWRITEAOF when the AOF log size grows by the specified percentage.
# #
# This is how it works: Redis remembers the size of the AOF file after the # This is how it works: Redis remembers the size of the AOF file after the
# latest rewrite (if no rewrite has happened since the restart, the size of # latest rewrite (if no rewrite has happened since the restart, the size of
# the AOF at startup is used). # the AOF at startup is used).
@ -687,7 +687,7 @@ lua-time-limit 5000
# but just the time needed to actually execute the command (this is the only # but just the time needed to actually execute the command (this is the only
# stage of command execution where the thread is blocked and can not serve # stage of command execution where the thread is blocked and can not serve
# other requests in the meantime). # other requests in the meantime).
# #
# You can configure the slow log with two parameters: one tells Redis # You can configure the slow log with two parameters: one tells Redis
# what is the execution time, in microseconds, to exceed in order for the # what is the execution time, in microseconds, to exceed in order for the
# command to get logged, and the other parameter is the length of the # command to get logged, and the other parameter is the length of the
@ -818,7 +818,7 @@ hll-sparse-max-bytes 3000
# that is rehashing, the more rehashing "steps" are performed, so if the # that is rehashing, the more rehashing "steps" are performed, so if the
# server is idle the rehashing is never complete and some more memory is used # server is idle the rehashing is never complete and some more memory is used
# by the hash table. # by the hash table.
# #
# The default is to use this millisecond 10 times every second in order to # The default is to use this millisecond 10 times every second in order to
# actively rehash the main dictionaries, freeing memory when possible. # actively rehash the main dictionaries, freeing memory when possible.
# #

View File

@ -1,4 +1,4 @@
RConPort 2303 RConPort 2304
RConPassword changemen0w RConPassword changemen0w
MaxPing 350 MaxPing 350

View File

@ -49,9 +49,10 @@
7 ctrlSetEventHandler !"BIS_fnc_guiMessage_status" !"ctrlSetEventHandler ['LBDblClick', '_this call" !="_buttonRespawn ctrlseteventhandler [\"buttonclick\",\"with uinamespace do {['buttonRespawn'," !="_ctrl ctrlSetEventHandler [\"mouseEnter\"" !="_ctrlBtn ctrlSetEventHandler [\"MouseButtonDblClick\", _verAct];" 7 ctrlSetEventHandler !"BIS_fnc_guiMessage_status" !"ctrlSetEventHandler ['LBDblClick', '_this call" !="_buttonRespawn ctrlseteventhandler [\"buttonclick\",\"with uinamespace do {['buttonRespawn'," !="_ctrl ctrlSetEventHandler [\"mouseEnter\"" !="_ctrlBtn ctrlSetEventHandler [\"MouseButtonDblClick\", _verAct];"
7 addMPEventHandler 7 addMPEventHandler
7 addEventHandler !"displayAddEventHandler" !"ctrlAddEventHandler" !"[\"FiredNear"\" !"[\"EpeContactStart"\" !"[\"GetOut"\" !"[\"local"\" !"[\"PostReset"\" !"[\"TaskSetAsCurrent"\" !="player addEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="\"CBA_fnc_addEventHandler\"" !="\\fnc_addEventHandler" !="\"addEventHandler" !="_eventFunc = _eventFunc + \"(_this select 0) addEventHandler ['Respawn', \" + str _eventFunc + \"];\";" !="_unit addEventHandler [\"hitpart\"," !="CBA_fnc_addEventHandler" 7 addEventHandler !"displayAddEventHandler" !"ctrlAddEventHandler" !"[\"FiredNear"\" !"[\"EpeContactStart"\" !"[\"GetOut"\" !"[\"local"\" !"[\"PostReset"\" !"[\"TaskSetAsCurrent"\" !="player addEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="\"CBA_fnc_addEventHandler\"" !="\\fnc_addEventHandler" !="\"addEventHandler" !="_eventFunc = _eventFunc + \"(_this select 0) addEventHandler ['Respawn', \" + str _eventFunc + \"];\";" !="_unit addEventHandler [\"hitpart\"," !="CBA_fnc_addEventHandler"
7 displayAddEventHandler !="(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"true\"];" !="_display displayAddEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="_addCase = _display46 displayAddEventHandler ['KeyDown',{_this call EPOCH_KeyDown}];" !="_display displayaddeventhandler\n[\n\"mousemoving\"," !="_display displayaddeventhandler [\"unload\",\"uinamespace setvariable ['BIS_fnc_guiMess" !="findDisplay -1337 displayAddEventHandler ['Unload'" !="_display displayaddeventhandler [\"keydown\",\"with uinamespace do {['keyDown'" !="_display displayaddeventhandler [_x,_fnc_animate];" !="Development\") then\n{\n_display displayaddeventhandler [\n\"keydown\"" !="_display displayaddeventhandler [\"mousemoving\",\"with uinamespace do {['watchFields'" !="/"CBA_fnc_addDisplayHandler/"" 7 displayAddEventHandler !="(findDisplay 46) displayAddEventHandler [\"KeyDown\",\"true\"];" !="_display displayAddEventHandler [_x,([\"CfgEpochClient\", _x, \"\"] call EPOCH_fnc_returnConfigEntryV2)];" !="_display displayaddeventhandler\n[\n\"mousemoving\"," !="_display displayaddeventhandler [\"unload\",\"uinamespace setvariable ['BIS_fnc_guiMess" !="findDisplay -1337 displayAddEventHandler ['Unload'" !="_display displayaddeventhandler [\"keydown\",\"with uinamespace do {['keyDown'" !="_display displayaddeventhandler [_x,_fnc_animate];" !="Development\") then\n{\n_display displayaddeventhandler [\n\"keydown\"" !="_display displayaddeventhandler [\"mousemoving\",\"with uinamespace do {['watchFields'" !="/"CBA_fnc_addDisplayHandler/""
7 ctrlAddEventHandler !"rCfg >> \"refreshDelay\");" !" [\n\"draw\"," !" [\"buttonclick\"," !="(uiNamespace getVariable 'ESP_map') ctrlAddEventHandler['Draw', '_esp_targets = EPOCH_ESPMAP_TARGETS;" !="ctrlAddEventHandler ['MouseButtonDown'" !="(_display displayctrl _idc) ctrlAddEventHandler [\"LBSelChanged\"," !="_ctrl ctrlSetEventHandler [\"mouseEnter\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseExit\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseButtonDown\", (format [\"call %1;\",(_buttonSettings select _e select 2)])];" !="_prevButton ctrlAddEventHandler [\"MouseButtonUp\", {_this call cba_diagnostic_fnc_debug" 7 ctrlAddEventHandler !"rCfg >> \"refreshDelay\");" !" [\n\"draw\"," !" [\"buttonclick\"," !="(uiNamespace getVariable 'ESP_map') ctrlAddEventHandler['Draw', '_esp_targets = EPOCH_ESPMAP_TARGETS;" !="ctrlAddEventHandler ['MouseButtonDown'" !="(_display displayctrl _idc) ctrlAddEventHandler [\"LBSelChanged\"," !="_ctrl ctrlSetEventHandler [\"mouseEnter\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseExit\", (format [\"_c = _this select 0;" !="_ctrl ctrlSetEventHandler [\"mouseButtonDown\", (format [\"call %1;\",(_buttonSettings select _e select 2)])];" !="_prevButton ctrlAddEventHandler [\"MouseButtonUp\", {_this call cba_diagnostic_fnc_debug"
7 removeAllEventHandlers !="ctrlRemoveAllEventHandlers" !="_vehicle removeAllEventHandlers \"GetOut\";" !="_sapper removeAllEventHandlers \"Hit\";\n_sapper removeAllEventHandlers \"FiredNear\";" !="_unit removeAllEventHandlers \"Hit\";\n_unit removeAllEventHandlers \"FiredNear\";" !="_display46 displayRemoveAllEventHandlers 'KeyDown';" !="if !(isMultiplayer) then { { (findDisplay 46) displayRemoveAllEventHandlers _x } forEach [\"KeyUp\", \"KeyDown\"] };" 7 removeAllEventHandlers !="ctrlRemoveAllEventHandlers" !="displayRemoveAllEventHandlers" !="_vehicle removeAllEventHandlers \"GetOut\";" !="_sapper removeAllEventHandlers \"Hit\";\n_sapper removeAllEventHandlers \"FiredNear\";" !="_unit removeAllEventHandlers \"Hit\";\n_unit removeAllEventHandlers \"FiredNear\";"
7 displayRemoveAllEventHandlers !="_display displayRemoveAllEventHandlers _x;" !="if !(isMultiplayer) then { { (findDisplay 46) displayRemoveAllEventHandlers _x } forEach [\"KeyUp\", \"KeyDown\"] };"
7 removeAllMissionEventHandlers 7 removeAllMissionEventHandlers
7 ctrlRemoveAllEventHandlers !="(uiNamespace getVariable 'ESP_map') ctrlRemoveAllEventHandlers 'Draw';" !="ctrlAddEventHandler ['MouseButtonDown'" 7 ctrlRemoveAllEventHandlers !="(uiNamespace getVariable 'ESP_map') ctrlRemoveAllEventHandlers 'Draw';" !="ctrlAddEventHandler ['MouseButtonDown'"
7 removeEventHandler !="displayRemoveEventHandler" !="player removeEventHandler ['Fired', 0];" !"_currentTarget removeEventHandler[\"EpeContactStart\", _onContactEH]" !" [_adminVar,objnull];\npublicvariable _adminVar;\nplayer removeeventhandler [\"respawn\",_respawn];" !="_plyr removeEventHandler [\"FiredNear\", _smokeEH];" !="player removeEventHandler [_ehKey, 0];" !="\"CBA_fnc_removeEventHandler\"" !="\\fnc_removeEventHandler" !="\"removeEventHandler" 7 removeEventHandler !="displayRemoveEventHandler" !="player removeEventHandler ['Fired', 0];" !"_currentTarget removeEventHandler[\"EpeContactStart\", _onContactEH]" !" [_adminVar,objnull];\npublicvariable _adminVar;\nplayer removeeventhandler [\"respawn\",_respawn];" !="_plyr removeEventHandler [\"FiredNear\", _smokeEH];" !="player removeEventHandler [_ehKey, 0];" !="\"CBA_fnc_removeEventHandler\"" !="\\fnc_removeEventHandler" !="\"removeEventHandler"

View File

@ -1,14 +1,14 @@
// EPOCH SERVER CONFIG // EPOCH SERVER CONFIG
// GLOBAL SETTINGS // GLOBAL SETTINGS
hostname = "EpochMod.com (0.3.8|1.54) ID02 YourHost"; hostname = "EpochMod.com (0.3.8|1.58) ID02 YourHost";
password = ""; password = "";
passwordAdmin = "!CHANGE_THIS_PASSWORD!"; passwordAdmin = "!CHANGE_THIS_PASSWORD!";
serverCommandPassword = "!CHANGE_THIS_PASSWORD!"; serverCommandPassword = "!CHANGE_THIS_PASSWORD!";
logFile = "A3Master.log"; logFile = "A3Master.log";
verifySignatures = 2; verifySignatures = 2;
BattlEye = 1; BattlEye = 1;
requiredBuild = 133741; requiredBuild = 135656;
// WHITELIST FILE TYPES // WHITELIST FILE TYPES
allowedLoadFileExtensions[] = {:}; allowedLoadFileExtensions[] = {:};
@ -39,7 +39,7 @@ allowedVotedAdminCmds[] = {};
// INGAME SETTINGS // INGAME SETTINGS
disableVoN = 0; // If set to 1, Voice over Net will not be available disableVoN = 0; // If set to 1, Voice over Net will not be available
vonCodecQuality = 20; // Quality from 1 to 30 vonCodecQuality = 30; // Quality from 1 to 30
forceRotorLibSimulation = 0; // Enforces the Advanced Flight Model on the server. Default = 0 (up to the player). 1 - forced AFM, 2 - forced SFM. forceRotorLibSimulation = 0; // Enforces the Advanced Flight Model on the server. Default = 0 (up to the player). 1 - forced AFM, 2 - forced SFM.
persistent = 1; // If 1, missions still run on even after the last player disconnected. persistent = 1; // If 1, missions still run on even after the last player disconnected.
@ -48,7 +48,7 @@ class Missions
{ {
class Epoch { class Epoch {
template = epoch.Altis; // DO NOT CHANGE THIS, IT WILL BREAK YOUR SERVER template = epoch.Altis; // DO NOT CHANGE THIS, IT WILL BREAK YOUR SERVER
difficulty = "veteran"; // difficulty settings: veteran == NORMAL, mercenary == HARDCORE difficulty = "custom"; // difficulty settings: Recruit, Regular Veteran, Custom
}; };
}; };

View File

@ -1,58 +1,42 @@
version=2; version=1;
blood=1;
viewDistance=3000; singleVoice=0;
preferredObjectViewDistance=3000; gamma=1;
terrainGrid=12.5; brightness=1;
activeKeys[]= difficulty = "Custom";
class DifficultyPresets
{ {
}; class CustomDifficulty
class Difficulties
{
class veteran
{ {
class Flags class Options
{ {
Armor=0; groupIndicators=2;
FriendlyTag=1; friendlyTags=0;
EnemyTag=0; enemyTags=0;
MineTag=0; detectedMines=0;
HUD=1; commands=1;
HUDWp=1; waypoints=1;
HUDWpPerm=1; weaponInfo=0;
HUDGroupInfo=1; stanceIndicator=1;
AutoSpot=0; reducedDamage=0;
WeaponCursor=1; staminaBar=0;
ClockIndicator=1; weaponCrosshair=1;
3rdPersonView=1; visionAid=0;
UltraAI=0; thirdPersonView=1;
CameraShake=0; cameraShake=1;
DeathMessages=1; scoreTable=1;
NetStats=1; deathMessages=1;
VonID=1; vonID=1;
ExtendetInfoType=0; mapContent=0;
autoReport=0;
multipleSaves=0;
}; };
skillFriendly=0.6; aiLevelPreset=2;
skillEnemy=0.6;
precisionFriendly=0.28;
precisionEnemy=0.28;
}; };
class mercenary class CustomAILevel
{ {
class Flags skillAI=1;
{ precisionAI=0;
HUD=1;
AutoSpot=0;
WeaponCursor=0;
DeathMessages=1;
NetStats=1;
VonID=1;
};
skillFriendly=0.6;
skillEnemy=0.6;
precisionFriendly=0.28;
precisionEnemy=0.28;
}; };
}; };
difficulty="veteran";

View File

@ -13,10 +13,8 @@
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/EPOCH_antiWall.sqf https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/EPOCH_antiWall.sqf
*/ */
private ["_worldPos","_front","_dirTo","_front2"]; private ["_worldPos","_front","_dirTo","_front2"];
params ["_vehicle","_position","_unit"]; params ["_unit","_position","_vehicle"];
if (_unit == player) then { if (_unit == player) then {
_vehicle removeAllEventHandlers "GetOut";
EPOCH_currentVehicle = objNull;
_worldPos = getPosATLVisual _vehicle; _worldPos = getPosATLVisual _vehicle;
_worldPos set[2, (_worldPos select 2) + 1]; _worldPos set[2, (_worldPos select 2) + 1];
_front = _worldPos; _front = _worldPos;

View File

@ -40,6 +40,7 @@ if !(alive player && alive _playerObject && !isPlayer _playerObject) then {
("BIS_fnc_respawnCounter" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; ("BIS_fnc_respawnCounter" call BIS_fnc_rscLayer) cutText ["","PLAIN"];
{ {
player removeEventHandler [_x, 0];
player addEventHandler [_x,(["CfgEpochClient", _x, ""] call EPOCH_fnc_returnConfigEntryV2)]; player addEventHandler [_x,(["CfgEpochClient", _x, ""] call EPOCH_fnc_returnConfigEntryV2)];
} forEach (["CfgEpochClient", "addEventHandler", []] call EPOCH_fnc_returnConfigEntryV2); } forEach (["CfgEpochClient", "addEventHandler", []] call EPOCH_fnc_returnConfigEntryV2);

View File

@ -50,13 +50,4 @@ while {'+_condition+'} do {
}; };
'; ';
}forEach _configs; }forEach _configs;
_build_sqf = _build_sqf + '
if (vehicle player != player) then {
if (isNull EPOCH_currentVehicle) then {
EPOCH_currentVehicle = vehicle player;
EPOCH_currentVehicle addEventHandler["GetOut", "_this call EPOCH_antiWall"];
};
};
uiSleep 0.1;
};';
call compile _build_sqf; call compile _build_sqf;

View File

@ -28,12 +28,11 @@ if (_vehicle == player) then {
if (EPOCH_buildMode > 0) then { if (EPOCH_buildMode > 0) then {
EPOCH_buildMode = 0; EPOCH_buildMode = 0;
EPOCH_snapDirection = 0; EPOCH_snapDirection = 0;
hintsilent "BUILD MODE: DISABLED"; [format["<t size='1.6' color='#99ffffff'>BUILD MODE:%1</t>","DISABLED"], 5] call Epoch_dynamicText;
EPOCH_Target = objNull; EPOCH_Target = objNull;
// EPOCH_SURVEY = [];
}; };
_increaseStamina = true; _increaseStamina = true;
// TODO: move to vehicle configs // TODO: move back to vehicle configs
switch (typeOf _vehicle) do { switch (typeOf _vehicle) do {
case "jetski_epoch": { case "jetski_epoch": {
_clock_hour10 = floor ((date select 3)/10); _clock_hour10 = floor ((date select 3)/10);

View File

@ -35,7 +35,7 @@ if (getPlayerUID player == Epoch_my_GroupUID) then {
}; };
}; };
} else { } else {
hintSilent "You need to select a player!"; ["<t size='1.6' color='#99ffffff'>You need to select a player!</t>", 5] call Epoch_dynamicText;
}; };
true true
} else { } else {

View File

@ -46,7 +46,6 @@ EPOCH_prevOffer = [];
EPOCH_drawIcon3d = false; EPOCH_drawIcon3d = false;
EPOCH_velTransform = false; EPOCH_velTransform = false;
EPOCH_stabilityTarget = objNull; EPOCH_stabilityTarget = objNull;
EPOCH_currentVehicle = objNull;
EPOCH_currentTarget = objNull; EPOCH_currentTarget = objNull;
EPOCH_LootedBlds = []; EPOCH_LootedBlds = [];
EPOCH_lootObjects = []; EPOCH_lootObjects = [];

View File

@ -59,7 +59,7 @@ class CfgEpochClient
displayAddEventHandler[] = {"keyDown","keyUp"}; displayAddEventHandler[] = {"keyDown","keyUp"};
keyDown = "(_this call EPOCH_KeyDown)"; keyDown = "(_this call EPOCH_KeyDown)";
keyUp = "(_this call EPOCH_KeyUp)"; keyUp = "(_this call EPOCH_KeyUp)";
addEventHandler[] = {"Respawn","Put","Take","InventoryClosed","InventoryOpened","Fired","Killed","HandleRating"}; addEventHandler[] = {"Respawn","Put","Take","InventoryClosed","InventoryOpened","Fired","Killed","HandleRating","GetInMan","GetOutMan"};
Respawn = "(_this select 0) call EPOCH_clientRespawn"; Respawn = "(_this select 0) call EPOCH_clientRespawn";
Put = "(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler"; Put = "(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler";
Take = "(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck"; Take = "(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck";
@ -73,6 +73,8 @@ class CfgEpochClient
Dammaged = ""; Dammaged = "";
Hit = ""; Hit = "";
HitPart = ""; HitPart = "";
GetInMan = "";
GetOutMan = "_this call EPOCH_antiWall;";
// suppress these units from spawning near Jammer or Traders // suppress these units from spawning near Jammer or Traders
nonJammerAI[] = {"B_Heli_Transport_01_F","PHANTOM","Epoch_Cloak_F"}; nonJammerAI[] = {"B_Heli_Transport_01_F","PHANTOM","Epoch_Cloak_F"};

View File

@ -1 +1 @@
build=427; build=429;

View File

@ -1 +1 @@
build=427; build=429;

View File

@ -49,9 +49,6 @@ _skn_badVarCheckArray = [_cfg_variablesConfig, "badVars", ['ESP_map','ESP_mainMa
_skn_nilVarCheckArray = [_cfg_variablesConfig, "nilVars", ['EPOCH_antiWallCount','EPOCH_playerEnergy','EPOCH_playerHunger','EPOCH_playerStamina','EPOCH_playerCrypto','EPOCH_target','EPOCH_ESP_TARGETS','EPOCH_ESPMAP_TARGETS','EPOCH_taxRate','EPOCH_ESP_VEHICLEPLAYER','EPOCH_ESP_PLAYER','EPOCH_ESP_VEHICLES']] call EPOCH_fnc_returnConfigEntry; _skn_nilVarCheckArray = [_cfg_variablesConfig, "nilVars", ['EPOCH_antiWallCount','EPOCH_playerEnergy','EPOCH_playerHunger','EPOCH_playerStamina','EPOCH_playerCrypto','EPOCH_target','EPOCH_ESP_TARGETS','EPOCH_ESPMAP_TARGETS','EPOCH_taxRate','EPOCH_ESP_VEHICLEPLAYER','EPOCH_ESP_PLAYER','EPOCH_ESP_VEHICLES']] call EPOCH_fnc_returnConfigEntry;
_skn_commandMenuArray = [(_config >> "commandMenu"), "menus",['','RscSelectTeam','RscTeam','RscMoveHigh','#GETIN','#RscStatus','#WATCH0','RscCombatMode','RscMenuReply','RscCallSupport','#CUSTOM_RADIO','#User:BIS_fnc_addCommMenuItem_menu','RscRadio','RscReply','#ACTION','RscMenuFormations','#WATCH','RscGroupRootMenu','RscMainMenu','RscMenuMove','RscWatchDir','RscWatchMoveDir','#User:BIS_Menu_GroupCommunication','RscMenuStatus','RscFormations']] call EPOCH_fnc_returnConfigEntry; _skn_commandMenuArray = [(_config >> "commandMenu"), "menus",['','RscSelectTeam','RscTeam','RscMoveHigh','#GETIN','#RscStatus','#WATCH0','RscCombatMode','RscMenuReply','RscCallSupport','#CUSTOM_RADIO','#User:BIS_fnc_addCommMenuItem_menu','RscRadio','RscReply','#ACTION','RscMenuFormations','#WATCH','RscGroupRootMenu','RscMainMenu','RscMenuMove','RscWatchDir','RscWatchMoveDir','#User:BIS_Menu_GroupCommunication','RscMenuStatus','RscFormations']] call EPOCH_fnc_returnConfigEntry;
_skn_displayAddEHKeyDown = ["CfgEpochClient", "keyDown", "keyDown",'(_this call EPOCH_KeyDown)'] call EPOCH_fnc_returnConfigEntryV2;
_skn_displayAddEHKeyUp = ["CfgEpochClient", "keyUp", "keyUp",'(_this call EPOCH_KeyUp)'] call EPOCH_fnc_returnConfigEntryV2;
_skn_addEHConfig = (_config >> "addEventHandler"); _skn_addEHConfig = (_config >> "addEventHandler");
_skn_displayAddEHChecks = [_skn_addEHConfig, "checks",[]] call EPOCH_fnc_returnConfigEntry; _skn_displayAddEHChecks = [_skn_addEHConfig, "checks",[]] call EPOCH_fnc_returnConfigEntry;
@ -809,7 +806,6 @@ _skn_code_antihack = compileFinal ("
disableSerialization; disableSerialization;
_ActionCount = -1; _ActionCount = -1;
_ActionVehicle = player; _ActionVehicle = player;
_displayCountKD = 0;
_displayCount = 0; _displayCount = 0;
_personalToken = Epoch_personalToken; _personalToken = Epoch_personalToken;
_antiWallCount = 0; _antiWallCount = 0;
@ -884,18 +880,15 @@ _skn_code_antihack = compileFinal ("
[format['viewDistance %1',viewDistance],0] call "+_sknBanANDSleep+"; [format['viewDistance %1',viewDistance],0] call "+_sknBanANDSleep+";
}; };
"+_sknAddActionCheck+" "+_sknAddActionCheck+"
_display46 = findDisplay 46; _display = findDisplay 46;
if !(isNull _display46) then { if !(isNull _display) then {
_display46 displayRemoveAllEventHandlers 'KeyDown'; {
_addCase = _display46 displayAddEventHandler ['KeyDown',{"+_skn_displayAddEHKeyDown+"}]; _display displayRemoveAllEventHandlers _x;
if (_addCase != _displayCountKD) then { _addCase = _display displayAddEventHandler [_x,([""CfgEpochClient"", _x, """"] call EPOCH_fnc_returnConfigEntryV2)];
[format['DEH: KeyDown %1/%2',_addCase,_displayCountKD],0] call "+_sknBanANDSleep+"; if (_addCase != _displayCount) then {
}; [format['DEH: %3 %1/%2',_addCase,_displayCount,_x],0] call "+_sknBanANDSleep+";
_display46 displayRemoveAllEventHandlers 'KeyUp'; };
_addCase = _display46 displayAddEventHandler ['KeyUp',{"+_skn_displayAddEHKeyUp+"}]; } forEach (['CfgEpochClient', 'displayAddEventHandler', []] call EPOCH_fnc_returnConfigEntryV2);
if (_addCase != _displayCount) then {
[format['DEH: KeyUp %1/%2',_addCase,_displayCount],0] call "+_sknBanANDSleep+";
};
}; };
uiSleep ((random 1)+1); uiSleep ((random 1)+1);
}; };

View File

@ -1 +1 @@
build=427; build=429;

View File

@ -1 +1 @@
build=427; build=429;

View File

@ -14,4 +14,5 @@ SET ARMAAPPID=107410
:: more info https://community.bistudio.com/wiki/Arma_3_Dedicated_Server :: more info https://community.bistudio.com/wiki/Arma_3_Dedicated_Server
steamcmd.exe +login %STEAMUN% %STEAMPW% +force_install_dir "%ARMASVRPATH%" "+app_update %ARMAAPPID%" validate +quit :: steamcmd.exe +login %STEAMUN% %STEAMPW% +force_install_dir "%ARMASVRPATH%" "+app_update %ARMAAPPID% validate" +quit
steamcmd.exe +login %STEAMUN% %STEAMPW% +force_install_dir "%ARMASVRPATH%" "+app_update %ARMAAPPID%" +quit

View File

@ -0,0 +1,84 @@
@ECHO OFF
SET STEAMUN=admin@youremail.net
SET STEAMPW=chamgeme
SET ARMASVRPATH=C:\Arma3Server
SET ARMAAPPID=107410
:: Use -mod line with quotes to support spaces in folder
:: Example: -mod="@epoch;@CBA_A3;@CUP Units;@CUP Vehicles;@CUP Weapons;@CUP Terrains - Core;@CUP Terrains - Maps;"
:: Install CUP CORE
SET MODFOLDER=@CUP Terrains - Core
SET ARMAWORKSHOPID=583496184
:: remove old folder
rd /s/q "%ARMASVRPATH%\%MODFOLDER%"
:: update workshop mod
START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% +quit
:: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%"
:: Remove old bikey
del "%ARMASVRPATH%\Keys\cup_terrains_core-*.bikey"
:: add new bikey
xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys"
:: Install CUP MAPS
SET MODFOLDER=@CUP Terrains - Maps
SET ARMAWORKSHOPID=583544987
:: remove old folder
rd /s/q "%ARMASVRPATH%\%MODFOLDER%"
:: update workshop mod
START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% +quit
:: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%"
:: Remove old bikey
del "%ARMASVRPATH%\Keys\cup_terrains_maps-*.bikey"
:: add new bikey
xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys"
:: Install CUP Vehicles
SET ARMAWORKSHOPID=541888371
SET MODFOLDER=@CUP Vehicles
:: remove mod folder
rd /s/q "%ARMASVRPATH%\%MODFOLDER%"
:: update workshop mod
START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% validate +quit
:: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%"
del "%ARMASVRPATH%\Keys\cup_vehicles-*.bikey"
xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys"
:: Install CBA
SET ARMAWORKSHOPID=450814997
SET MODFOLDER=@CBA_A3
:: remove mod folder
rd /s/q "%ARMASVRPATH%\%MODFOLDER%"
:: update workshop mod
START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% validate +quit
:: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%"
del "%ARMASVRPATH%\Keys\cba_*.bikey"
xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys"
:: Install CUP Weapons
SET ARMAWORKSHOPID=497660133
SET MODFOLDER=@CUP Weapons
:: remove mod folder
rd /s/q "%ARMASVRPATH%\%MODFOLDER%"
:: update workshop mod
START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% validate +quit
:: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%"
del "%ARMASVRPATH%\Keys\cup_weapons-*.bikey"
xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys"
:: Install CUP Units
SET ARMAWORKSHOPID=497661914
SET MODFOLDER=@CUP Units
:: remove mod folder
rd /s/q "%ARMASVRPATH%\%MODFOLDER%"
:: update workshop mod
START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %ARMAAPPID% %ARMAWORKSHOPID% validate +quit
:: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%"
del "%ARMASVRPATH%\Keys\cup_units-*.bikey"
xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys"

View File

@ -21,6 +21,13 @@ START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %
:: copy files back to server :: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%" xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%"
:: Remove old bikey
del "%ARMASVRPATH%\Keys\cup_terrains_core-*.bikey"
:: add new bikey
xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys"
:: Install CUP MAPS :: Install CUP MAPS
@ -35,3 +42,9 @@ START "" /WAIT steamcmd.exe +login %STEAMUN% %STEAMPW% +workshop_download_item %
:: copy files back to server :: copy files back to server
xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%" xcopy /s/e/y/q/i "steamapps\workshop\content\%ARMAAPPID%\%ARMAWORKSHOPID%" "%ARMASVRPATH%\%MODFOLDER%"
:: Remove old bikey
del "%ARMASVRPATH%\Keys\cup_terrains_maps-*.bikey"
:: add new bikey
xcopy /s/e/y/q/i "%ARMASVRPATH%\%MODFOLDER%\Keys" "%ARMASVRPATH%\Keys"

View File

@ -1 +1 @@
427 429